r8934: Some refactoring of smb_interfaces code generator.
authorTim Potter <tpot@samba.org>
Tue, 2 Aug 2005 18:56:18 +0000 (18:56 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:30:58 +0000 (13:30 -0500)
(This used to be commit c016487a0148694a1a1464bb5f7ba0d0e142d14f)

source4/script/build_smb_interfaces.pl

index cc3a35298723264494c05403cc532158608c06e2..075786fb045e4a9d85e063daec60bc015147ddac 100755 (executable)
@@ -11,7 +11,7 @@ require smb_interfaces;
 my $parser = new smb_interfaces;
 $header = $parser->parse($file);
 
-#use Data::Dumper;
+use Data::Dumper;
 #print Dumper($header);
 
 # Create header
@@ -23,9 +23,55 @@ print FILE "/* header auto-generated by build_smb_interfaces.pl */\n\n";
 print FILE "#ifndef _ejs_${basename}_h\n";
 print FILE "#define _ejs_${basename}_h\n\n";
 
+sub struct_name($)
+{
+  my $obj = shift;
+  return defined($obj->{STRUCT_NAME}) ? $obj->{STRUCT_NAME} : $obj->{UNION_NAME};
+}
+
+sub prototypes_for($)
+{
+  my $obj = shift;
+  my $name = struct_name($obj);
+
+  print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n";
+  print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n";
+}
+
+sub pushpull_for($)
+{
+  my $obj = shift;
+  my $name = struct_name($obj);
+
+  print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n";
+  print FILE "{\n";
+
+  print FILE "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, name));\n";
+
+  print FILE "\n\treturn NT_STATUS_OK;\n";
+  print FILE "}\n\n";
+
+  print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n";
+  print FILE "{\n";
+  print FILE "\treturn NT_STATUS_OK;\n";
+  print FILE "}\n\n";
+}
+
 foreach my $x (@{$header}) {
-    print FILE "NTSTATUS ejs_push_$x->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n";
-    print FILE "NTSTATUS ejs_pull_$x->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n";
+
+  # Prototypes for top level structures and unions
+
+  prototypes_for($x);
+
+  # Prototypes for non-anonymous nested structures and unions
+
+  foreach my $e1 (@{$x->{DATA}}) {
+    foreach my $e2 (@{$e1->{DATA}}) {
+      if (defined($e2->{STRUCT_NAME}) or defined($e2->{UNION_NAME})) {
+       prototypes_for($e2);
+      }
+    }
+  }
 }
 
 print FILE "#endif\n";
@@ -41,14 +87,7 @@ print FILE "/* EJS wrapper functions auto-generated by build_smb_interfaces.pl *
 # Top level functions
 
 foreach my $x (@{$header}) {
-    print FILE "NTSTATUS ejs_push_$x->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *)\n";
-    print FILEq "{\n";
-    print FILE "\treturn NT_STATUS_OK;\n";
-    print FILE "}\n\n";
-    print FILE "NTSTATUS ejs_pull_$x->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *)\n";
-    print FILE "{\n";
-    print FILE "\treturn NT_STATUS_OK;\n";
-    print FILE "}\n\n";
+  pushpull_for($x);
 }
 
 close(FILE);