Author: tpot
Date: 2005-08-02 18:56:18 +0000 (Tue, 02 Aug 2005)
New Revision: 8934

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=8934

Log:
Some refactoring of smb_interfaces code generator.

Modified:
   branches/SAMBA_4_0/source/script/build_smb_interfaces.pl


Changeset:
Modified: branches/SAMBA_4_0/source/script/build_smb_interfaces.pl
===================================================================
--- branches/SAMBA_4_0/source/script/build_smb_interfaces.pl    2005-08-02 
18:46:17 UTC (rev 8933)
+++ branches/SAMBA_4_0/source/script/build_smb_interfaces.pl    2005-08-02 
18:56:18 UTC (rev 8934)
@@ -11,7 +11,7 @@
 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 "#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 @@
 # 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);

Reply via email to