r5006: Implement parsing of pidl bitmaps in ethereal parsers. This works
authorTim Potter <tpot@samba.org>
Wed, 26 Jan 2005 04:50:04 +0000 (04:50 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:09:13 +0000 (13:09 -0500)
well but needs to be stuck in a subtree.

source/build/pidl/eparser.pm

index b334a5c467d26a31202ce7b0b4b75e9bf61abf5a..cf2f6a4d54a23161115b6a636d19be2e226ebdd1 100644 (file)
@@ -10,6 +10,7 @@ use strict;
 
 # the list of needed functions
 my %needed;
+my %bitmaps;
 
 my $module;
 my $if_uuid;
@@ -210,6 +211,17 @@ sub NeededFunction($)
        };
 }
 
+sub bitmapbase($)
+{
+    my $e = shift;
+
+    return "32", if util::has_property($e->{DATA}, "bitmap32bit");
+    return "16", if util::has_property($e->{DATA}, "bitmap16bit");
+    return "8", if util::has_property($e->{DATA}, "bitmap8bit");
+
+    die("can't calculate bitmap size for $e->{NAME}");
+}
+
 sub NeededTypedef($)
 {
        my $t = shift;
@@ -296,12 +308,15 @@ sub NeededTypedef($)
        }
 
        if ($t->{DATA}->{TYPE} eq "BITMAP") {
+
+           $bitmaps{$t->{NAME}} = $t;
+
            foreach my $e (@{$t->{DATA}{ELEMENTS}}) {
                $e =~ /^(.*?) \( (.*?) \)$/;
                $needed{"hf_$t->{NAME}_$1"} = {
-                   'name' => "$t->{NAME} $1",
+                   'name' => "$1",
                    'ft' => "FT_BOOLEAN",
-                   'base' => "32",
+                   'base' => bitmapbase($t),
                    'bitmask' => "$2"
                    };
            }
@@ -615,9 +630,6 @@ sub RewriteC($$$)
         s/(^static\ NTSTATUS\ ndr_pull_(.+?),\ (enum\ .+?)\))
            /static NTSTATUS ndr_pull_$2, pidl_tree *tree, int hf, $3)/smgx;
        s/uint(8|16|32) v;/uint$1_t v;/smg;
-       s/(ndr_pull_([^\)]*?)\(ndr,\ &v\);)
-           /ndr_pull_$2(ndr, tree, hf, &v);/smgx;
-
        s/(ndr_pull_([^\(]+?)\(ndr,\ &_level\);)
            /ndr_pull_$2(ndr, tree, hf_${cur_fn}_level, &_level);/smgx;
 
@@ -626,6 +638,23 @@ sub RewriteC($$$)
         s/(^(static\ )?NTSTATUS\ ndr_pull_(.+?),\ uint(8|16|32)\ \*r\))
            /NTSTATUS ndr_pull_$3, pidl_tree *tree, int hf, uint$4_t *r)/smgx;
 
+        if (/ndr_pull_([^\)]*?)\(ndr, &v\);/) {
+
+           s/(ndr_pull_([^\)]*?)\(ndr,\ &v\);)
+               /ndr_pull_$2(ndr, tree, hf, &v);/smgx;
+
+           pidl $_;
+
+           if (defined($bitmaps{$cur_fn})) {
+               foreach my $e (@{$bitmaps{$cur_fn}->{DATA}{ELEMENTS}}) {
+                   $e =~ /^(.*?) \( (.*?) \)$/;
+                   pidl "\tproto_tree_add_boolean(tree->proto_tree, hf_${cur_fn}_$1, ndr->tvb, ndr->offset - sizeof(v), sizeof(v), v);\n";
+               }
+           }
+
+           next;
+       }
+
        # Call ethereal wrappers for pull of scalar values in
        # structures and functions, e.g
        #