Author: tpot Date: 2005-08-07 19:22:20 +0000 (Sun, 07 Aug 2005) New Revision: 9191
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=9191 Log: Generate headers for nested structures that need pushing or pulling. 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-07 19:11:24 UTC (rev 9190) +++ branches/SAMBA_4_0/source/script/build_smb_interfaces.pl 2005-08-07 19:22:20 UTC (rev 9191) @@ -46,7 +46,8 @@ foreach my $elt (@{$obj->{DATA}}) { foreach my $name (@{$elt->{NAME}}) { $obj->{FIELDS}{$name} = $elt; - delete $obj->{FIELDS}{$name}{NAME}; + $obj->{FIELDS}{$name}{NAME} = $name; + $obj->{FIELDS}{$name}{PARENT} = $obj; } } @@ -63,49 +64,50 @@ flatten_names($s); } -print Dumper($header); +# +# Generate header +# -exit; +my $basename = basename($file, ".h"); +stat "libcli/gen_raw" || mkdir("libcli/gen_raw") || die("mkdir"); -foreach my $s (@{$header}) { # For each parsed structure - print Dumper($s); - my $newdata; - foreach my $e (@{$s->{DATA}}) { # For each element in structure - foreach my $n (@{$e->{NAME}}) { # For each field in element +open(FILE, ">libcli/gen_raw/ejs_${basename}.h"); - my $newdata2; - foreach my $e2 (@{$e->{DATA}}) { - foreach my $n2 (@{$e2->{NAME}}) { - my $d = $e2; - $d->{NAME} = $n2; - push(@{$newdata2}, $d); - } - } +print FILE "/* header auto-generated by build_smb_interfaces.pl */\n\n"; - push(@{$newdata}, {"NAME" => $n, "DATA" => $newdata2}); - } - } - my $newstruct = $s; - $newstruct->{DATA} = $newdata; - push(@{$newheader}, $newstruct); -} +print FILE "#ifndef _ejs_${basename}_h\n"; +print FILE "#define _ejs_${basename}_h\n\n"; -print Dumper($newheader); -exit 0; +# Generate a push/pull prototype for every top level structure, as +# well as every non-anonymous nested structure (i.e TYPE_NAME element +# is undefined. -my $basename = basename($file, ".h"); -stat "libcli/gen_raw" || mkdir("libcli/gen_raw") || die("mkdir"); +foreach my $s (@{$header}) { -# Create header + # Top level -open(FILE, ">libcli/gen_raw/ejs_${basename}.h"); + print FILE "NTSTATUS ejs_push_$s->{TYPE_NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; + print FILE "NTSTATUS ejs_pull_$s->{TYPE_NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; -print FILE "/* header auto-generated by build_smb_interfaces.pl */\n\n"; + sub header_for($$) { + my $prefix = shift; + my $obj = shift; -print FILE "#ifndef _ejs_${basename}_h\n"; -print FILE "#define _ejs_${basename}_h\n\n"; + return if !($obj->{TYPE} eq "struct" or $obj->{TYPE} eq "union"); + return if ($obj->{NAME} eq "in" or $obj->{NAME} eq "out"); + print FILE "NTSTATUS ejs_push_${prefix}_$obj->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; + print FILE "NTSTATUS ejs_pull_${prefix}_$obj->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; + + foreach my $key (%{$obj->{FIELDS}}) { + header_for("${prefix}.$obj->{TYPE_NAME}", $obj->{FIELDS}{$key}); + } + } +} + +exit; + sub struct_name($) { my $obj = shift; @@ -161,7 +163,9 @@ close(FILE); -# Create file +# +# Generate implementation +# open(FILE, ">libcli/gen_raw/ejs_${basename}.c");
