Author: tpot
Date: 2005-01-25 22:33:44 +0000 (Tue, 25 Jan 2005)
New Revision: 4990

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

Log:
Generate value strings for pidl enumerations.

Modified:
   branches/SAMBA_4_0/source/build/pidl/eparser.pm


Changeset:
Modified: branches/SAMBA_4_0/source/build/pidl/eparser.pm
===================================================================
--- branches/SAMBA_4_0/source/build/pidl/eparser.pm     2005-01-25 20:36:24 UTC 
(rev 4989)
+++ branches/SAMBA_4_0/source/build/pidl/eparser.pm     2005-01-25 22:33:44 UTC 
(rev 4990)
@@ -290,7 +290,8 @@
            $needed{"hf_$t->{NAME}"} = {
                'name' => $t->{NAME},
                'ft' => 'FT_UINT16',
-               'base' => 'BASE_DEC'
+               'base' => 'BASE_DEC',
+               'strings' => "VALS($t->{NAME}_vals)"
                };
        }
 }
@@ -363,6 +364,25 @@
 }
 
 #####################################################################
+# generate code to parse an enum
+
+sub ParseEnum($)
+{
+    my ($e) = shift;
+    print Dumper($e);
+
+    pidl "static const value_string $e->{PARENT}{NAME}_vals[] =\n";
+    pidl "{\n";
+
+    foreach my $x (@{$e->{ELEMENTS}}) {
+       $x =~ /([^=]*)=(.*)/;
+       pidl "\t{ $1, \"$1\" },\n";
+    }
+    
+    pidl "};\n\n";
+}
+
+#####################################################################
 # rewrite autogenerated header file
 sub RewriteHeader($$$)
 {
@@ -475,11 +495,29 @@
 
        #
         # Regexps to do a first pass at removing stuff we aren't
-       # interested in for ehtereal parsers.
+       # interested in for ethereal parsers.
        #
 
        next, if /^\#include \"includes.h\"/;
 
+       # Rewrite includes to packet-dcerpc-foo.h instead of ndr_foo.h
+
+       s/^\#include \".*?ndr_(.*?).h\"$/\#include \"packet-dcerpc-$1.h\"/smg;
+
+       if (/\.h\"$/) {
+           pidl $_;
+           foreach my $x (@{$idl}) {
+               if ($x->{TYPE} eq "INTERFACE") { 
+                   foreach my $y (@{$x->{INHERITED_DATA}}) {
+                       if ($y->{TYPE} eq "TYPEDEF") {
+                           ParseEnum($y->{DATA}), if $y->{DATA}{TYPE} eq 
"ENUM";
+                       }
+                   }
+               }
+           }
+           next;
+       }
+
        # Remove the NDR_CHECK() macro calls.  Ethereal take care of
        # this for us as part of the tvbuff_t structure.
 
@@ -502,10 +540,6 @@
         next, if /^static NTSTATUS dcerpc_ndr_[a-z]+_init/ .. /^}/;
         next, if /^NTSTATUS dcerpc_[a-z]+_init/ .. /^}/;
 
-       # Rewrite includes to packet-dcerpc-foo.h instead of ndr_foo.h
-
-       s/^\#include \".*?ndr_(.*?).h\"$/\#include \"packet-dcerpc-$1.h\"/smg;
-
         #
         # Remember which structure or function we are processing.
         #
@@ -587,13 +621,22 @@
        # ndr_pull_uint32(ndr, &r->in.access_mask);
        # ndr_pull_uint32(ndr, &r->idx);
 
-       s/(ndr_pull_([^\)]*?)
-          \(ndr,\ 
-          (&?r->((in|out)\.)?         # Function args contain leading junk
-           ([^\)]*?))                 # Element name
-          \);)          
-           /ndr_pull_$2(ndr, tree, hf_${cur_fn}_$6, $3);/smgx;
+        if (/(ndr_pull_([^\)]*?)\(ndr, (&?r->((in|out)\.)?([^\)]*?))\);)/) {
 
+           my $pull_type = "${cur_fn}_$6";
+
+           if (defined($needed{"hf_$2"})) {
+               $pull_type = "$2";
+           }
+
+           s/(ndr_pull_([^\)]*?)
+              \(ndr,\ 
+              (&?r->((in|out)\.)?         # Function args contain leading junk
+               ([^\)]*?))                 # Element name
+              \);)          
+               /ndr_pull_$2(ndr, tree, hf_$pull_type, $3);/smgx;
+       }
+
        # Add tree and hf argument to pulls of "internal" scalars like
        # array sizes, levels, etc.
 
@@ -723,7 +766,8 @@
     foreach my $x (keys(%needed)) {
        next, if !($x =~ /^hf_/);
        pidl "\t{ &$x,\n";
-       pidl "\t  { \"$needed{$x}{name}\", \"$x\", $needed{$x}{ft}, 
$needed{$x}{base}, NULL, 0, \"$x\", HFILL }},\n";
+       $needed{$x}{strings} = "NULL", if !defined($needed{$x}{strings});
+       pidl "\t  { \"$needed{$x}{name}\", \"$x\", $needed{$x}{ft}, 
$needed{$x}{base}, $needed{$x}{strings}, 0, \"$x\", HFILL }},\n";
     }
 
     pidl "\t};\n\n";

Reply via email to