diff options
Diffstat (limited to 'tools/pidl')
-rw-r--r-- | tools/pidl/idl.yp | 22 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/IDL.pm | 1122 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/NDR.pm | 2 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm | 157 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/Samba4/EJS.pm | 616 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/Samba4/Header.pm | 22 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm | 1629 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/Samba4/TDR.pm | 213 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm | 6 | ||||
-rw-r--r-- | tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm | 931 | ||||
-rwxr-xr-x | tools/pidl/pidl | 16 | ||||
-rw-r--r-- | tools/pidl/tests/Util.pm | 3 | ||||
-rwxr-xr-x | tools/pidl/tests/samba-ejs.pl | 39 | ||||
-rwxr-xr-x | tools/pidl/tests/samba-ndr.pl | 33 | ||||
-rwxr-xr-x | tools/pidl/tests/samba3-cli.pl | 9 | ||||
-rwxr-xr-x | tools/pidl/tests/tdr.pl | 27 | ||||
-rwxr-xr-x | tools/pidl/tests/wireshark-conf.pl | 47 | ||||
-rwxr-xr-x | tools/pidl/tests/wireshark-ndr.pl | 122 |
18 files changed, 2531 insertions, 2485 deletions
diff --git a/tools/pidl/idl.yp b/tools/pidl/idl.yp index e7d1ce7898..9e63a5846a 100644 --- a/tools/pidl/idl.yp +++ b/tools/pidl/idl.yp @@ -122,12 +122,11 @@ function: property_list type identifier '(' element_list2 ')' ';' }} ; -declare: 'declare' property_list decl_type identifier';' +declare: 'declare' decl_type identifier';' {{ "TYPE" => "DECLARE", - "PROPERTIES" => $_[2], - "NAME" => $_[4], - "DATA" => $_[3], + "NAME" => $_[3], + "DATA" => $_[2], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE}, }} @@ -136,21 +135,24 @@ declare: 'declare' property_list decl_type identifier';' decl_type: decl_enum | decl_bitmap | decl_union ; -decl_enum: 'enum' +decl_enum: property_list 'enum' {{ - "TYPE" => "ENUM" + "TYPE" => "ENUM", + "PROPERTIES" => $_[1] }} ; -decl_bitmap: 'bitmap' +decl_bitmap: property_list 'bitmap' {{ - "TYPE" => "BITMAP" + "TYPE" => "BITMAP", + "PROPERTIES" => $_[1] }} ; -decl_union: 'union' +decl_union: property_list 'union' {{ - "TYPE" => "UNION" + "TYPE" => "UNION", + "PROPERTIES" => $_[1] }} ; diff --git a/tools/pidl/lib/Parse/Pidl/IDL.pm b/tools/pidl/lib/Parse/Pidl/IDL.pm index 36c83c5922..d1bde8483d 100644 --- a/tools/pidl/lib/Parse/Pidl/IDL.pm +++ b/tools/pidl/lib/Parse/Pidl/IDL.pm @@ -326,6 +326,10 @@ sub new { {#State 44 DEFAULT => -89, GOTOS => { + 'decl_enum' => 79, + 'decl_bitmap' => 80, + 'decl_type' => 82, + 'decl_union' => 81, 'property_list' => 78 } }, @@ -343,7 +347,7 @@ sub new { 'IDENTIFIER' => 22 }, GOTOS => { - 'identifier' => 79 + 'identifier' => 83 } }, {#State 49 @@ -360,28 +364,28 @@ sub new { }, {#State 53 ACTIONS => { - "-" => 81, - ":" => 80, - "<" => 82, - "+" => 84, - "~" => 83, - "*" => 85, - "?" => 86, - "{" => 87, - "&" => 88, - "/" => 89, - "=" => 90, - "(" => 91, - "|" => 92, - "." => 93, - ">" => 94 + "-" => 85, + ":" => 84, + "<" => 86, + "+" => 88, + "~" => 87, + "*" => 89, + "?" => 90, + "{" => 91, + "&" => 92, + "/" => 93, + "=" => 94, + "(" => 95, + "|" => 96, + "." => 97, + ">" => 98 }, DEFAULT => -95 }, {#State 54 ACTIONS => { - "," => 95, - ")" => 96 + "," => 99, + ")" => 100 } }, {#State 55 @@ -398,11 +402,11 @@ sub new { }, {#State 59 ACTIONS => { - ";" => 97 + ";" => 101 }, DEFAULT => -123, GOTOS => { - 'optional_semicolon' => 98 + 'optional_semicolon' => 102 } }, {#State 60 @@ -410,16 +414,16 @@ sub new { 'IDENTIFIER' => 22 }, GOTOS => { - 'identifier' => 99 + 'identifier' => 103 } }, {#State 61 ACTIONS => { - ";" => 97 + ";" => 101 }, DEFAULT => -123, GOTOS => { - 'optional_semicolon' => 100 + 'optional_semicolon' => 104 } }, {#State 62 @@ -444,18 +448,18 @@ sub new { 'identifier' => 69, 'struct' => 45, 'enum' => 49, - 'type' => 101, + 'type' => 105, 'union' => 51, 'sign' => 70 } }, {#State 65 ACTIONS => { - 'IDENTIFIER' => 102 + 'IDENTIFIER' => 106 }, DEFAULT => -120, GOTOS => { - 'optional_identifier' => 103 + 'optional_identifier' => 107 } }, {#State 66 @@ -481,16 +485,16 @@ sub new { 'IDENTIFIER' => 22 }, GOTOS => { - 'identifier' => 104 + 'identifier' => 108 } }, {#State 71 ACTIONS => { - 'IDENTIFIER' => 102 + 'IDENTIFIER' => 106 }, DEFAULT => -120, GOTOS => { - 'optional_identifier' => 105 + 'optional_identifier' => 109 } }, {#State 72 @@ -501,20 +505,20 @@ sub new { }, {#State 74 ACTIONS => { - 'IDENTIFIER' => 102 + 'IDENTIFIER' => 106 }, DEFAULT => -120, GOTOS => { - 'optional_identifier' => 106 + 'optional_identifier' => 110 } }, {#State 75 ACTIONS => { - 'IDENTIFIER' => 102 + 'IDENTIFIER' => 106 }, DEFAULT => -120, GOTOS => { - 'optional_identifier' => 107 + 'optional_identifier' => 111 } }, {#State 76 @@ -525,30 +529,41 @@ sub new { 'IDENTIFIER' => 22 }, GOTOS => { - 'identifier' => 108 + 'identifier' => 112 } }, {#State 78 ACTIONS => { - "union" => 109, + "union" => 113, "enum" => 114, "bitmap" => 115, "[" => 17 + } + }, + {#State 79 + DEFAULT => -27 + }, + {#State 80 + DEFAULT => -28 + }, + {#State 81 + DEFAULT => -29 + }, + {#State 82 + ACTIONS => { + 'IDENTIFIER' => 22 }, GOTOS => { - 'decl_enum' => 110, - 'decl_bitmap' => 111, - 'decl_type' => 113, - 'decl_union' => 112 + 'identifier' => 116 } }, - {#State 79 + {#State 83 DEFAULT => -78, GOTOS => { - 'pointers' => 116 + 'pointers' => 117 } }, - {#State 80 + {#State 84 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -557,12 +572,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 117, + 'anytext' => 118, 'text' => 58, 'constant' => 55 } }, - {#State 81 + {#State 85 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -571,12 +586,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 118, + 'anytext' => 119, 'text' => 58, 'constant' => 55 } }, - {#State 82 + {#State 86 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -585,12 +600,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 119, + 'anytext' => 120, 'text' => 58, 'constant' => 55 } }, - {#State 83 + {#State 87 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -599,12 +614,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 120, + 'anytext' => 121, 'text' => 58, 'constant' => 55 } }, - {#State 84 + {#State 88 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -613,12 +628,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 121, + 'anytext' => 122, 'text' => 58, 'constant' => 55 } }, - {#State 85 + {#State 89 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -627,12 +642,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 122, + 'anytext' => 123, 'text' => 58, 'constant' => 55 } }, - {#State 86 + {#State 90 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -641,12 +656,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 123, + 'anytext' => 124, 'text' => 58, 'constant' => 55 } }, - {#State 87 + {#State 91 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -655,13 +670,13 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 124, + 'anytext' => 125, 'text' => 58, 'constant' => 55, - 'commalisttext' => 125 + 'commalisttext' => 126 } }, - {#State 88 + {#State 92 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -670,12 +685,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 126, + 'anytext' => 127, 'text' => 58, 'constant' => 55 } }, - {#State 89 + {#State 93 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -684,12 +699,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 127, + 'anytext' => 128, 'text' => 58, 'constant' => 55 } }, - {#State 90 + {#State 94 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -698,12 +713,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 128, + 'anytext' => 129, 'text' => 58, 'constant' => 55 } }, - {#State 91 + {#State 95 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -712,13 +727,13 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 124, + 'anytext' => 125, 'text' => 58, 'constant' => 55, - 'commalisttext' => 129 + 'commalisttext' => 130 } }, - {#State 92 + {#State 96 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -727,12 +742,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 130, + 'anytext' => 131, 'text' => 58, 'constant' => 55 } }, - {#State 93 + {#State 97 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -741,12 +756,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 131, + 'anytext' => 132, 'text' => 58, 'constant' => 55 } }, - {#State 94 + {#State 98 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -755,12 +770,12 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 132, + 'anytext' => 133, 'text' => 58, 'constant' => 55 } }, - {#State 95 + {#State 99 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -769,106 +784,89 @@ sub new { DEFAULT => -99, GOTOS => { 'identifier' => 57, - 'anytext' => 133, + 'anytext' => 134, 'text' => 58, 'constant' => 55 } }, - {#State 96 + {#State 100 DEFAULT => -94 }, - {#State 97 + {#State 101 DEFAULT => -124 }, - {#State 98 + {#State 102 DEFAULT => -12 }, - {#State 99 + {#State 103 ACTIONS => { - ";" => 134 + ";" => 135 } }, - {#State 100 + {#State 104 DEFAULT => -15 }, - {#State 101 + {#State 105 ACTIONS => { 'IDENTIFIER' => 22 }, GOTOS => { - 'identifier' => 135 + 'identifier' => 136 } }, - {#State 102 + {#State 106 DEFAULT => -119 }, - {#State 103 + {#State 107 ACTIONS => { - "{" => 137 + "{" => 138 }, DEFAULT => -74, GOTOS => { - 'union_body' => 138, - 'opt_union_body' => 136 + 'union_body' => 139, + 'opt_union_body' => 137 } }, - {#State 104 + {#State 108 DEFAULT => -41 }, - {#State 105 + {#State 109 ACTIONS => { - "{" => 140 + "{" => 141 }, DEFAULT => -64, GOTOS => { - 'struct_body' => 139, - 'opt_struct_body' => 141 + 'struct_body' => 140, + 'opt_struct_body' => 142 } }, - {#State 106 + {#State 110 ACTIONS => { - "{" => 142 + "{" => 143 }, DEFAULT => -47, GOTOS => { - 'opt_enum_body' => 144, - 'enum_body' => 143 + 'opt_enum_body' => 145, + 'enum_body' => 144 } }, - {#State 107 + {#State 111 ACTIONS => { - "{" => 146 + "{" => 147 }, DEFAULT => -55, GOTOS => { - 'bitmap_body' => 147, - 'opt_bitmap_body' => 145 + 'bitmap_body' => 148, + 'opt_bitmap_body' => 146 } }, - {#State 108 + {#State 112 ACTIONS => { - "(" => 148 + "(" => 149 } }, - {#State 109 - DEFAULT => -32 - }, - {#State 110 - DEFAULT => -27 - }, - {#State 111 - DEFAULT => -28 - }, - {#State 112 - DEFAULT => -29 - }, {#State 113 - ACTIONS => { - 'IDENTIFIER' => 22 - }, - GOTOS => { - 'identifier' => 149 - } + DEFAULT => -32 }, {#State 114 DEFAULT => -30 @@ -878,354 +876,357 @@ sub new { }, {#State 116 ACTIONS => { + ";" => 150 + } + }, + {#State 117 + ACTIONS => { 'IDENTIFIER' => 22, - "*" => 151 + "*" => 152 }, GOTOS => { - 'identifier' => 150 + 'identifier' => 151 } }, - {#State 117 + {#State 118 ACTIONS => { - "-" => 81, - ":" => 80, - "<" => 82, - "+" => 84, - "~" => 83, - "*" => 85, - "?" => 86, - "{" => 87, - "&" => 88, - "/" => 89, - "=" => 90, - "(" => 91, - "|" => 92, - "." => 93, - ">" => 94 + "-" => 85, + ":" => 84, + "<" => 86, + "+" => 88, + "~" => 87, + "*" => 89, + "?" => 90, + "{" => 91, + "&" => 92, + "/" => 93, + "=" => 94, + "(" => 95, + "|" => 96, + "." => 97, + ">" => 98 }, DEFAULT => -112 }, - {#State 118 + {#State 119 ACTIONS => { - ":" => 80, - "<" => 82, - "~" => 83, - "?" => 86, - "{" => 87, - "=" => 90 + ":" => 84, + "<" => 86, + "~" => 87, + "?" => 90, + "{" => 91, + "=" => 94 }, DEFAULT => -103 }, - {#State 119 + {#State 120 ACTIONS => { - "-" => 81, - ":" => 80, - "<" => 82, - "+" => 84, - "~" => 83, - "*" => 85, - "?" => 86, - "{" => 87, - "&" => 88, - "/" => 89, - "=" => 90, - "(" => 91, - "|" => 92, - "." => 93, - ">" => 94 + "-" => 85, + ":" => 84, + "<" => 86, + "+" => 88, + "~" => 87, + "*" => 89, + "?" => 90, + "{" => 91, + "&" => 92, + "/" => 93, + "=" => 94, + "(" => 95, + "|" => 96, + "." => 97, + ">" => 98 }, DEFAULT => -107 }, - {#State 120 + {#State 121 ACTIONS => { - "-" => 81, - ":" => 80, - "<" => 82, - "+" => 84, - "~" => 83, - "*" => 85, - "?" => 86, - "{" => 87, - "&" => 88, - "/" => 89, - "=" => 90, - "(" => 91, - "|" => 92, - "." => 93, - ">" => 94 + "-" => 85, + ":" => 84, + "<" => 86, + "+" => 88, + "~" => 87, + "*" => 89, + "?" => 90, + "{" => 91, + "&" => 92, + "/" => 93, + "=" => 94, + "(" => 95, + "|" => 96, + "." => 97, + ">" => 98 }, DEFAULT => -115 }, - {#State 121 + {#State 122 ACTIONS => { - ":" => 80, - "<" => 82, - "~" => 83, - "?" => 86, - "{" => 87, - "=" => 90 + ":" => 84, + "<" => 86, + "~" => 87, + "?" => 90, + "{" => 91, + "=" => 94 }, DEFAULT => -114 }, - {#State 122 + {#State 123 ACTIONS => { - ":" => 80, - "<" => 82, - "~" => 83, - "?" => 86, - "{" => 87, - "=" => 90 + ":" => 84, + "<" => 86, + "~" => 87, + "?" => 90, + "{" => 91, + "=" => 94 }, DEFAULT => -105 }, - {#State 123 + {#State 124 ACTIONS => { - "-" => 81, - ":" => 80, - "<" => 82, - "+" => 84, - "~" => 83, - "*" => 85, - "?" => 86, - "{" => 87, - "&" => 88, - "/" => 89, - "=" => 90, - "(" => 91, - "|" => 92, - "." => 93, - ">" => 94 + "-" => 85, + ":" => 84, + "<" => 86, + "+" => 88, + "~" => 87, + "*" => 89, + "?" => 90, + "{" => 91, + "&" => 92, + "/" => 93, + "=" => 94, + "(" => 95, + "|" => 96, + "." => 97, + ">" => 98 }, DEFAULT => -111 }, - {#State 124 + {#State 125 ACTIONS => { - "-" => 81, - ":" => 80, - "<" => 82, - "+" => 84, - "~" => 83, - "*" => 85, - "?" => 86, - "{" => 87, - "&" => 88, - "/" => 89, - "=" => 90, - "(" => 91, - "|" => 92, - "." => 93, - ">" => 94 + "-" => 85, + ":" => 84, + "<" => 86, + "+" => 88, + "~" => 87, + "*" => 89, + "?" => 90, + "{" => 91, + "&" => 92, + "/" => 93, + "=" => 94, + "(" => 95, + "|" => 96, + "." => 97, + ">" => 98 }, DEFAULT => -97 }, - {#State 125 + {#State 126 ACTIONS => { - "}" => 152, - "," => 153 + "}" => 153, + "," => 154 } }, - {#State 126 + {#State 127 ACTIONS => { - ":" => 80, - "<" => 82, - "~" => 83, - "?" => 86, - "{" => 87, - "=" => 90 + ":" => 84, + "<" => 86, + "~" => 87, + "?" => 90, + "{" => 91, + "=" => 94 }, DEFAULT => -109 }, - {#State 127 + {#State 128 ACTIONS => { - ":" => 80, - "<" => 82, - "~" => 83, - "?" => 86, - "{" => 87, - "=" => 90 + ":" => 84, + "<" => 86, + "~" => 87, + "?" => 90, + "{" => 91, + "=" => 94 }, DEFAULT => -110 }, - {#State 128 + {#State 129 ACTIONS => { - "-" => 81, - ":" => 80, - "<" => 82, - "+" => 84, - "~" => 83, - "*" => 85, - "?" => 86, - "{" => 87, - "&" => 88, - "/" => 89, - "=" => 90, - "(" => 91, - "|" => 92, - "." => 93, - ">" => 94 + "-" => 85, + ":" => 84, + "<" => 86, + "+" => 88, + "~" => 87, + "*" => 89, + "?" => 90, + "{" => 91, + "&" => 92, + "/" => 93, + "=" => 94, + "(" => 95, + "|" => 96, + "." => 97, + ">" => 98 }, DEFAULT => -113 }, - {#State 129 + {#State 130 ACTIONS => { - "," => 153, - ")" => 154 + "," => 154, + ")" => 155 } }, - {#State 130 + {#State 131 ACTIONS => { - ":" => 80, - "<" => 82, - "~" => 83, - "?" => 86, - "{" => 87, - "=" => 90 + ":" => 84, + "<" => 86, + "~" => 87, + "?" => 90, + "{" => 91, + "=" => 94 }, DEFAULT => -108 }, - {#State 131 + {#State 132 ACTIONS => { - ":" => 80, - "<" => 82, - "~" => 83, - "?" => 86, - "{" => 87, - "=" => 90 + ":" => 84, + "<" => 86, + "~" => 87, + "?" => 90, + "{" => 91, + "=" => 94 }, DEFAULT => -104 }, - {#State 132 + {#State 133 ACTIONS => { - ":" => 80, - "<" => 82, - "~" => 83, - "?" => 86, - "{" => 87, - "=" => 90 + ":" => 84, + "<" => 86, + "~" => 87, + "?" => 90, + "{" => 91, + "=" => 94 }, DEFAULT => -106 }, - {#State 133 + {#State 134 ACTIONS => { - "-" => 81, - ":" => 80, - "<" => 82, - "+" => 84, - "~" => 83, - "*" => 85, - "?" => 86, - "{" => 87, - "&" => 88, - "/" => 89, - "=" => 90, - "(" => 91, - "|" => 92, - "." => 93, - ">" => 94 + "-" => 85, + ":" => 84, + "<" => 86, + "+" => 88, + "~" => 87, + "*" => 89, + "?" => 90, + "{" => 91, + "&" => 92, + "/" => 93, + "=" => 94, + "(" => 95, + "|" => 96, + "." => 97, + ">" => 98 }, DEFAULT => -96 }, - {#State 134 + {#State 135 DEFAULT => -14 }, - {#State 135 + {#State 136 ACTIONS => { - "[" => 155 + "[" => 156 }, DEFAULT => -86, GOTOS => { - 'array_len' => 156 + 'array_len' => 157 } }, - {#State 136 + {#State 137 DEFAULT => -76 }, - {#State 137 + {#State 138 DEFAULT => -71, GOTOS => { - 'union_elements' => 157 + 'union_elements' => 158 } }, - {#State 138 + {#State 139 DEFAULT => -75 }, - {#State 139 + {#State 140 DEFAULT => -65 }, - {#State 140 + {#State 141 DEFAULT => -80, GOTOS => { - 'element_list1' => 158 + 'element_list1' => 159 } }, - {#State 141 + {#State 142 DEFAULT => -66 }, - {#State 142 + {#State 143 ACTIONS => { 'IDENTIFIER' => 22 }, GOTOS => { - 'identifier' => 159, - 'enum_element' => 160, - 'enum_elements' => 161 + 'identifier' => 160, + 'enum_element' => 161, + 'enum_elements' => 162 } }, - {#State 143 + {#State 144 DEFAULT => -48 }, - {#State 144 + {#State 145 DEFAULT => -49 }, - {#State 145 + {#State 146 DEFAULT => -57 }, - {#State 146 + {#State 147 ACTIONS => { 'IDENTIFIER' => 22 }, DEFAULT => -60, GOTOS => { - 'identifier' => 164, - 'bitmap_element' => 163, - 'bitmap_elements' => 162, - 'opt_bitmap_elements' => 165 + 'identifier' => 165, + 'bitmap_element' => 164, + 'bitmap_elements' => 163, + 'opt_bitmap_elements' => 166 } }, - {#State 147 + {#State 148 DEFAULT => -56 }, - {#State 148 + {#State 149 ACTIONS => { "," => -82, - "void" => 169, + "void" => 170, ")" => -82 }, DEFAULT => -89, GOTOS => { - 'base_element' => 166, - 'element_list2' => 168, - 'property_list' => 167 - } - }, - {#State 149 - ACTIONS => { - ";" => 170 + 'base_element' => 167, + 'element_list2' => 169, + 'property_list' => 168 } }, {#State 150 + DEFAULT => -26 + }, + {#State 151 ACTIONS => { - "[" => 155, + "[" => 156, "=" => 172 }, GOTOS => { 'array_len' => 171 } }, - {#State 151 + {#State 152 DEFAULT => -79 }, - {#State 152 + {#State 153 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -1239,7 +1240,7 @@ sub new { 'constant' => 55 } }, - {#State 153 + {#State 154 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -1253,7 +1254,7 @@ sub new { 'constant' => 55 } }, - {#State 154 + {#State 155 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -1267,7 +1268,7 @@ sub new { 'constant' => 55 } }, - {#State 155 + {#State 156 ACTIONS => { 'CONSTANT' => 56, 'TEXT' => 13, @@ -1282,12 +1283,12 @@ sub new { 'constant' => 55 } }, - {#State 156 + {#State 157 ACTIONS => { ";" => 178 } }, - {#State 157 + {#State 158 ACTIONS => { "}" => 179 }, @@ -1297,54 +1298,54 @@ sub new { 'property_list' => 180 } }, - {#State 158 + {#State 159 ACTIONS => { "}" => 182 }, DEFAULT => -89, GOTOS => { 'base_element' => 183, - 'property_list' => 167 + 'property_list' => 168 } }, - {#State 159 + {#State 160 ACTIONS => { "=" => 184 }, DEFAULT => -52 }, - {#State 160 + {#State 161 DEFAULT => -50 }, - {#State 161 + {#State 162 ACTIONS => { "}" => 185, "," => 186 } }, - {#State 162 + {#State 163 ACTIONS => { "," => 187 }, DEFAULT => -61 }, - {#State 163 + {#State 164 DEFAULT => -58 }, - {#State 164 + {#State 165 ACTIONS => { "=" => 188 } }, - {#State 165 + {#State 166 ACTIONS => { "}" => 189 } }, - {#State 166 + {#State 167 DEFAULT => -84 }, - {#State 167 + {#State 168 ACTIONS => { 'IDENTIFIER' => 22, "signed" => 72, @@ -1366,17 +1367,14 @@ sub new { 'sign' => 70 } }, - {#State 168 + {#State 169 ACTIONS => { "," => 191, ")" => 192 } }, - {#State 169 - DEFAULT => -83 - }, {#State 170 - DEFAULT => -26 + DEFAULT => -83 }, {#State 171 ACTIONS => { @@ -1399,58 +1397,58 @@ sub new { }, {#State 173 ACTIONS => { - "-" => 81, - ":" => 80, - "<" => 82, - "+" => 84, - "~" => 83, - "*" => 85, - "?" => 86, - "{" => 87, - "&" => 88, - "/" => 89, - "=" => 90, - "(" => 91, - "|" => 92, - "." => 93, - ">" => 94 + "-" => 85, + ":" => 84, + "<" => 86, + "+" => 88, + "~" => 87, + "*" => 89, + "?" => 90, + "{" => 91, + "&" => 92, + "/" => 93, + "=" => 94, + "(" => 95, + "|" => 96, + "." => 97, + ">" => 98 }, DEFAULT => -117 }, {#State 174 ACTIONS => { - "-" => 81, - ":" => 80, - "<" => 82, - "+" => 84, - "~" => 83, - "*" => 85, - "?" => 86, - "{" => 87, - "&" => 88, - "/" => 89, - "=" => 90, - "(" => 91, - "|" => 92, - "." => 93, - ">" => 94 + "-" => 85, + ":" => 84, + "<" => 86, + "+" => 88, + "~" => 87, + "*" => 89, + "?" => 90, + "{" => 91, + "&" => 92, + "/" => 93, + "=" => 94, + "(" => 95, + "|" => 96, + "." => 97, + ">" => 98 }, DEFAULT => -98 }, {#State 175 ACTIONS => { - ":" => 80, - "<" => 82, - "~" => 83, - "?" => 86, - "{" => 87, - "=" => 90 + ":" => 84, + "<" => 86, + "~" => 87, + "?" => 90, + "{" => 91, + "=" => 94 }, DEFAULT => -116 }, {#State 176 ACTIONS => { - "[" => 155 + "[" => 156 }, DEFAULT => -86, GOTOS => { @@ -1459,22 +1457,22 @@ sub new { }, {#State 177 ACTIONS => { - "-" => 81, - ":" => 80, - "?" => 86, - "<" => 82, - "+" => 84, - "~" => 83, - "&" => 88, - "{" => 87, - "/" => 89, - "=" => 90, - "|" => 92, - "(" => 91, - "*" => 85, - "." => 93, + "-" => 85, + ":" => 84, + "?" => 90, + "<" => 86, + "+" => 88, + "~" => 87, + "&" => 92, + "{" => 91, + "/" => 93, + "=" => 94, + "|" => 96, + "(" => 95, + "*" => 89, + "." => 97, "]" => 196, - ">" => 94 + ">" => 98 } }, {#State 178 @@ -1528,7 +1526,7 @@ sub new { 'IDENTIFIER' => 22 }, GOTOS => { - 'identifier' => 159, + 'identifier' => 160, 'enum_element' => 203 } }, @@ -1537,7 +1535,7 @@ sub new { 'IDENTIFIER' => 22 }, GOTOS => { - 'identifier' => 164, + 'identifier' => 165, 'bitmap_element' => 204 } }, @@ -1568,7 +1566,7 @@ sub new { DEFAULT => -89, GOTOS => { 'base_element' => 207, - 'property_list' => 167 + 'property_list' => 168 } }, {#State 192 @@ -1592,22 +1590,22 @@ sub new { }, {#State 194 ACTIONS => { - "-" => 81, - ":" => 80, - "?" => 86, - "<" => 82, + "-" => 85, + ":" => 84, + "?" => 90, + "<" => 86, ";" => 210, - "+" => 84, - "~" => 83, - "&" => 88, - "{" => 87, - "/" => 89, - "=" => 90, - "|" => 92, - "(" => 91, - "*" => 85, - "." => 93, - ">" => 94 + "+" => 88, + "~" => 87, + "&" => 92, + "{" => 91, + "/" => 93, + "=" => 94, + "|" => 96, + "(" => 95, + "*" => 89, + "." => 97, + ">" => 98 } }, {#State 195 @@ -1615,7 +1613,7 @@ sub new { }, {#State 196 ACTIONS => { - "[" => 155 + "[" => 156 }, DEFAULT => -86, GOTOS => { @@ -1661,21 +1659,21 @@ sub new { }, {#State 202 ACTIONS => { - "-" => 81, - ":" => 80, - "<" => 82, - "+" => 84, - "~" => 83, - "*" => 85, - "?" => 86, - "{" => 87, - "&" => 88, - "/" => 89, - "=" => 90, - "(" => 91, - "|" => 92, - "." => 93, - ">" => 94 + "-" => 85, + ":" => 84, + "<" => 86, + "+" => 88, + "~" => 87, + "*" => 89, + "?" => 90, + "{" => 91, + "&" => 92, + "/" => 93, + "=" => 94, + "(" => 95, + "|" => 96, + "." => 97, + ">" => 98 }, DEFAULT => -53 }, @@ -1687,28 +1685,28 @@ sub new { }, {#State 205 ACTIONS => { - "-" => 81, - ":" => 80, - "<" => 82, - "+" => 84, - "~" => 83, - "*" => 85, - "?" => 86, - "{" => 87, - "&" => 88, - "/" => 89, - "=" => 90, - "(" => 91, - "|" => 92, - "." => 93, - ">" => 94 + "-" => 85, + ":" => 84, + "<" => 86, + "+" => 88, + "~" => 87, + "*" => 89, + "?" => 90, + "{" => 91, + "&" => 92, + "/" => 93, + "=" => 94, + "(" => 95, + "|" => 96, + "." => 97, + ">" => 98 }, DEFAULT => -62 }, {#State 206 ACTIONS => { 'IDENTIFIER' => 22, - "*" => 151 + "*" => 152 }, GOTOS => { 'identifier' => 214 @@ -1722,22 +1720,22 @@ sub new { }, {#State 209 ACTIONS => { - "-" => 81, - ":" => 80, - "?" => 86, - "<" => 82, + "-" => 85, + ":" => 84, + "?" => 90, + "<" => 86, ";" => 215, - "+" => 84, - "~" => 83, - "&" => 88, - "{" => 87, - "/" => 89, - "=" => 90, - "|" => 92, - "(" => 91, - "*" => 85, - "." => 93, - ">" => 94 + "+" => 88, + "~" => 87, + "&" => 92, + "{" => 91, + "/" => 93, + "=" => 94, + "|" => 96, + "(" => 95, + "*" => 89, + "." => 97, + ">" => 98 } }, {#State 210 @@ -1754,7 +1752,7 @@ sub new { }, {#State 214 ACTIONS => { - "[" => 155 + "[" => 156 }, DEFAULT => -86, GOTOS => { @@ -1779,37 +1777,37 @@ sub new { [#Rule 2 'idl', 2, sub -#line 19 "idl.yp" +#line 19 "pidl/idl.yp" { push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 3 'idl', 2, sub -#line 20 "idl.yp" +#line 20 "pidl/idl.yp" { push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 4 'idl', 2, sub -#line 21 "idl.yp" +#line 21 "pidl/idl.yp" { push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 5 'idl', 2, sub -#line 22 "idl.yp" +#line 22 "pidl/idl.yp" { push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 6 'idl', 2, sub -#line 23 "idl.yp" +#line 23 "pidl/idl.yp" { push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 7 'import', 3, sub -#line 26 "idl.yp" +#line 26 "pidl/idl.yp" {{ "TYPE" => "IMPORT", "PATHS" => $_[2], @@ -1820,7 +1818,7 @@ sub [#Rule 8 'include', 3, sub -#line 33 "idl.yp" +#line 33 "pidl/idl.yp" {{ "TYPE" => "INCLUDE", "PATHS" => $_[2], @@ -1831,7 +1829,7 @@ sub [#Rule 9 'importlib', 3, sub -#line 40 "idl.yp" +#line 40 "pidl/idl.yp" {{ "TYPE" => "IMPORTLIB", "PATHS" => $_[2], @@ -1842,19 +1840,19 @@ sub [#Rule 10 'commalist', 1, sub -#line 49 "idl.yp" +#line 49 "pidl/idl.yp" { [ $_[1] ] } ], [#Rule 11 'commalist', 3, sub -#line 50 "idl.yp" +#line 50 "pidl/idl.yp" { push(@{$_[1]}, $_[3]); $_[1] } ], [#Rule 12 'coclass', 7, sub -#line 54 "idl.yp" +#line 54 "pidl/idl.yp" {{ "TYPE" => "COCLASS", "PROPERTIES" => $_[1], @@ -1870,13 +1868,13 @@ sub [#Rule 14 'interface_names', 4, sub -#line 66 "idl.yp" +#line 66 "pidl/idl.yp" { push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 15 'interface', 7, sub -#line 70 "idl.yp" +#line 70 "pidl/idl.yp" {{ "TYPE" => "INTERFACE", "PROPERTIES" => $_[1], @@ -1889,13 +1887,13 @@ sub [#Rule 16 'definitions', 1, sub -#line 81 "idl.yp" +#line 81 "pidl/idl.yp" { [ $_[1] ] } ], [#Rule 17 'definitions', 2, sub -#line 82 "idl.yp" +#line 82 "pidl/idl.yp" { push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 18 @@ -1916,7 +1914,7 @@ sub [#Rule 23 'const', 7, sub -#line 90 "idl.yp" +#line 90 "pidl/idl.yp" {{ "TYPE" => "CONST", "DTYPE" => $_[2], @@ -1930,7 +1928,7 @@ sub [#Rule 24 'const', 8, sub -#line 100 "idl.yp" +#line 100 "pidl/idl.yp" {{ "TYPE" => "CONST", "DTYPE" => $_[2], @@ -1945,7 +1943,7 @@ sub [#Rule 25 'function', 7, sub -#line 114 "idl.yp" +#line 114 "pidl/idl.yp" {{ "TYPE" => "FUNCTION", "NAME" => $_[3], @@ -1957,14 +1955,13 @@ sub }} ], [#Rule 26 - 'declare', 5, + 'declare', 4, sub -#line 126 "idl.yp" +#line 126 "pidl/idl.yp" {{ "TYPE" => "DECLARE", - "PROPERTIES" => $_[2], - "NAME" => $_[4], - "DATA" => $_[3], + "NAME" => $_[3], + "DATA" => $_[2], "FILE" => $_[0]->YYData->{FILE}, "LINE" => $_[0]->YYData->{LINE}, }} @@ -1979,33 +1976,36 @@ sub 'decl_type', 1, undef ], [#Rule 30 - 'decl_enum', 1, + 'decl_enum', 2, sub -#line 140 "idl.yp" +#line 139 "pidl/idl.yp" {{ - "TYPE" => "ENUM" + "TYPE" => "ENUM", + "PROPERTIES" => $_[1] }} ], [#Rule 31 - 'decl_bitmap', 1, + 'decl_bitmap', 2, sub -#line 146 "idl.yp" +#line 146 "pidl/idl.yp" {{ - "TYPE" => "BITMAP" + "TYPE" => "BITMAP", + "PROPERTIES" => $_[1] }} ], [#Rule 32 - 'decl_union', 1, + 'decl_union', 2, sub -#line 152 "idl.yp" +#line 153 "pidl/idl.yp" {{ - "TYPE" => "UNION" + "TYPE" => "UNION", + "PROPERTIES" => $_[1] }} ], [#Rule 33 'typedef', 6, sub -#line 158 "idl.yp" +#line 160 "pidl/idl.yp" {{ "TYPE" => "TYPEDEF", "PROPERTIES" => $_[1], @@ -2031,7 +2031,7 @@ sub [#Rule 38 'typedecl', 2, sub -#line 171 "idl.yp" +#line 173 "pidl/idl.yp" { $_[1] } ], [#Rule 39 @@ -2043,7 +2043,7 @@ sub [#Rule 41 'existingtype', 2, sub -#line 176 "idl.yp" +#line 178 "pidl/idl.yp" { ($_[1]?$_[1]:"signed") ." $_[2]" } ], [#Rule 42 @@ -2058,13 +2058,13 @@ sub [#Rule 45 'type', 1, sub -#line 180 "idl.yp" +#line 182 "pidl/idl.yp" { "void" } ], [#Rule 46 'enum_body', 3, sub -#line 182 "idl.yp" +#line 184 "pidl/idl.yp" { $_[2] } ], [#Rule 47 @@ -2076,7 +2076,7 @@ sub [#Rule 49 'enum', 4, sub -#line 185 "idl.yp" +#line 187 "pidl/idl.yp" {{ "TYPE" => "ENUM", "PROPERTIES" => $_[1], @@ -2087,13 +2087,13 @@ sub [#Rule 50 'enum_elements', 1, sub -#line 194 "idl.yp" +#line 196 "pidl/idl.yp" { [ $_[1] ] } ], [#Rule 51 'enum_elements', 3, sub -#line 195 "idl.yp" +#line 197 "pidl/idl.yp" { push(@{$_[1]}, $_[3]); $_[1] } ], [#Rule 52 @@ -2102,13 +2102,13 @@ sub [#Rule 53 'enum_element', 3, sub -#line 199 "idl.yp" +#line 201 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 54 'bitmap_body', 3, sub -#line 202 "idl.yp" +#line 204 "pidl/idl.yp" { $_[2] } ], [#Rule 55 @@ -2120,7 +2120,7 @@ sub [#Rule 57 'bitmap', 4, sub -#line 205 "idl.yp" +#line 207 "pidl/idl.yp" {{ "TYPE" => "BITMAP", "PROPERTIES" => $_[1], @@ -2131,13 +2131,13 @@ sub [#Rule 58 'bitmap_elements', 1, sub -#line 214 "idl.yp" +#line 216 "pidl/idl.yp" { [ $_[1] ] } ], [#Rule 59 'bitmap_elements', 3, sub -#line 215 "idl.yp" +#line 217 "pidl/idl.yp" { push(@{$_[1]}, $_[3]); $_[1] } ], [#Rule 60 @@ -2149,13 +2149,13 @@ sub [#Rule 62 'bitmap_element', 3, sub -#line 220 "idl.yp" +#line 222 "pidl/idl.yp" { "$_[1] ( $_[3] )" } ], [#Rule 63 'struct_body', 3, sub -#line 223 "idl.yp" +#line 225 "pidl/idl.yp" { $_[2] } ], [#Rule 64 @@ -2167,7 +2167,7 @@ sub [#Rule 66 'struct', 4, sub -#line 227 "idl.yp" +#line 229 "pidl/idl.yp" {{ "TYPE" => "STRUCT", "PROPERTIES" => $_[1], @@ -2178,7 +2178,7 @@ sub [#Rule 67 'empty_element', 2, sub -#line 236 "idl.yp" +#line 238 "pidl/idl.yp" {{ "NAME" => "", "TYPE" => "EMPTY", @@ -2198,7 +2198,7 @@ sub [#Rule 70 'optional_base_element', 2, sub -#line 250 "idl.yp" +#line 252 "pidl/idl.yp" { $_[2]->{PROPERTIES} = FlattenHash([$_[1],$_[2]->{PROPERTIES}]); $_[2] } ], [#Rule 71 @@ -2207,13 +2207,13 @@ sub [#Rule 72 'union_elements', 2, sub -#line 255 "idl.yp" +#line 257 "pidl/idl.yp" { push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 73 'union_body', 3, sub -#line 258 "idl.yp" +#line 260 "pidl/idl.yp" { $_[2] } ], [#Rule 74 @@ -2225,7 +2225,7 @@ sub [#Rule 76 'union', 4, sub -#line 262 "idl.yp" +#line 264 "pidl/idl.yp" {{ "TYPE" => "UNION", "PROPERTIES" => $_[1], @@ -2236,7 +2236,7 @@ sub [#Rule 77 'base_element', 5, sub -#line 271 "idl.yp" +#line 273 "pidl/idl.yp" {{ "NAME" => $_[4], "TYPE" => $_[2], @@ -2250,25 +2250,25 @@ sub [#Rule 78 'pointers', 0, sub -#line 285 "idl.yp" +#line 287 "pidl/idl.yp" { 0 } ], [#Rule 79 'pointers', 2, sub -#line 286 "idl.yp" +#line 288 "pidl/idl.yp" { $_[1]+1 } ], [#Rule 80 'element_list1', 0, sub -#line 290 "idl.yp" +#line 292 "pidl/idl.yp" { [] } ], [#Rule 81 'element_list1', 3, sub -#line 291 "idl.yp" +#line 293 "pidl/idl.yp" { push(@{$_[1]}, $_[2]); $_[1] } ], [#Rule 82 @@ -2280,13 +2280,13 @@ sub [#Rule 84 'element_list2', 1, sub -#line 297 "idl.yp" +#line 299 "pidl/idl.yp" { [ $_[1] ] } ], [#Rule 85 'element_list2', 3, sub -#line 298 "idl.yp" +#line 300 "pidl/idl.yp" { push(@{$_[1]}, $_[3]); $_[1] } ], [#Rule 86 @@ -2295,13 +2295,13 @@ sub [#Rule 87 'array_len', 3, sub -#line 303 "idl.yp" +#line 305 "pidl/idl.yp" { push(@{$_[3]}, "*"); $_[3] } ], [#Rule 88 'array_len', 4, sub -#line 304 "idl.yp" +#line 306 "pidl/idl.yp" { push(@{$_[4]}, "$_[2]"); $_[4] } ], [#Rule 89 @@ -2310,31 +2310,31 @@ sub [#Rule 90 'property_list', 4, sub -#line 310 "idl.yp" +#line 312 "pidl/idl.yp" { FlattenHash([$_[1],$_[3]]); } ], [#Rule 91 'properties', 1, sub -#line 313 "idl.yp" +#line 315 "pidl/idl.yp" { $_[1] } ], [#Rule 92 'properties', 3, sub -#line 314 "idl.yp" +#line 316 "pidl/idl.yp" { FlattenHash([$_[1], $_[3]]); } ], [#Rule 93 'property', 1, sub -#line 317 "idl.yp" +#line 319 "pidl/idl.yp" {{ "$_[1]" => "1" }} ], [#Rule 94 'property', 4, sub -#line 318 "idl.yp" +#line 320 "pidl/idl.yp" {{ "$_[1]" => "$_[3]" }} ], [#Rule 95 @@ -2343,7 +2343,7 @@ sub [#Rule 96 'listtext', 3, sub -#line 323 "idl.yp" +#line 325 "pidl/idl.yp" { "$_[1] $_[3]" } ], [#Rule 97 @@ -2352,13 +2352,13 @@ sub [#Rule 98 'commalisttext', 3, sub -#line 328 "idl.yp" +#line 330 "pidl/idl.yp" { "$_[1],$_[3]" } ], [#Rule 99 'anytext', 0, sub -#line 332 "idl.yp" +#line 334 "pidl/idl.yp" { "" } ], [#Rule 100 @@ -2373,91 +2373,91 @@ sub [#Rule 103 'anytext', 3, sub -#line 334 "idl.yp" +#line 336 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 104 'anytext', 3, sub -#line 335 "idl.yp" +#line 337 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 105 'anytext', 3, sub -#line 336 "idl.yp" +#line 338 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 106 'anytext', 3, sub -#line 337 "idl.yp" +#line 339 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 107 'anytext', 3, sub -#line 338 "idl.yp" +#line 340 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 108 'anytext', 3, sub -#line 339 "idl.yp" +#line 341 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 109 'anytext', 3, sub -#line 340 "idl.yp" +#line 342 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 110 'anytext', 3, sub -#line 341 "idl.yp" +#line 343 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 111 'anytext', 3, sub -#line 342 "idl.yp" +#line 344 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 112 'anytext', 3, sub -#line 343 "idl.yp" +#line 345 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 113 'anytext', 3, sub -#line 344 "idl.yp" +#line 346 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 114 'anytext', 3, sub -#line 345 "idl.yp" +#line 347 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 115 'anytext', 3, sub -#line 346 "idl.yp" +#line 348 "pidl/idl.yp" { "$_[1]$_[2]$_[3]" } ], [#Rule 116 'anytext', 5, sub -#line 347 "idl.yp" +#line 349 "pidl/idl.yp" { "$_[1]$_[2]$_[3]$_[4]$_[5]" } ], [#Rule 117 'anytext', 5, sub -#line 348 "idl.yp" +#line 350 "pidl/idl.yp" { "$_[1]$_[2]$_[3]$_[4]$_[5]" } ], [#Rule 118 @@ -2475,7 +2475,7 @@ sub [#Rule 122 'text', 1, sub -#line 362 "idl.yp" +#line 364 "pidl/idl.yp" { "\"$_[1]\"" } ], [#Rule 123 @@ -2489,7 +2489,7 @@ sub bless($self,$class); } -#line 373 "idl.yp" +#line 375 "pidl/idl.yp" use Parse::Pidl qw(error); diff --git a/tools/pidl/lib/Parse/Pidl/NDR.pm b/tools/pidl/lib/Parse/Pidl/NDR.pm index 1d7ca16707..d2556cb8e6 100644 --- a/tools/pidl/lib/Parse/Pidl/NDR.pm +++ b/tools/pidl/lib/Parse/Pidl/NDR.pm @@ -281,6 +281,8 @@ sub can_contain_deferred($) my $type = getType($e->{TYPE}); + return 1 if ($type->{TYPE} eq "DECLARE"); # assume the worst + foreach my $x (@{$type->{DATA}->{ELEMENTS}}) { return 1 if ($x->{POINTERS}); return 1 if (can_contain_deferred ($x)); diff --git a/tools/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm b/tools/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm index 8fa37ca300..27b71053fb 100644 --- a/tools/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm +++ b/tools/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm @@ -20,14 +20,18 @@ use Parse::Pidl::Samba4 qw(DeclLong); use vars qw($VERSION); $VERSION = '0.01'; -our $res; -our $res_hdr; -my $tabs = ""; -sub indent() { $tabs.="\t"; } -sub deindent() { $tabs = substr($tabs, 1); } -sub pidl($) { $res .= $tabs.(shift)."\n"; } -sub pidl_hdr($) { $res_hdr .= (shift)."\n"; } -sub fn_declare($) { my ($n) = @_; pidl $n; pidl_hdr "$n;"; } +sub indent($) { my ($self) = @_; $self->{tabs}.="\t"; } +sub deindent($) { my ($self) = @_; $self->{tabs} = substr($self->{tabs}, 1); } +sub pidl($$) { my ($self,$txt) = @_; $self->{res} .= "$self->{tabs}$txt\n"; } +sub pidl_hdr($$) { my ($self, $txt) = @_; $self->{res_hdr} .= "$txt\n"; } +sub fn_declare($$) { my ($self,$n) = @_; $self->pidl($n); $self->pidl_hdr("$n;"); } + +sub new($) +{ + my ($class) = shift; + my $self = { res => "", res_hdr => "", tabs => "" }; + bless($self, $class); +} sub GenerateFunctionInEnv($) { @@ -43,9 +47,9 @@ sub GenerateFunctionInEnv($) return \%env; } -sub ParseFunction($$) +sub ParseFunction($$$) { - my ($uif, $fn) = @_; + my ($self, $uif, $fn) = @_; my $inargs = ""; my $defargs = ""; @@ -54,42 +58,42 @@ sub ParseFunction($$) foreach (@{$fn->{ELEMENTS}}) { $defargs .= ", " . DeclLong($_); } - fn_declare "NTSTATUS rpccli_$fn->{NAME}(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx$defargs)"; - pidl "{"; - indent; - pidl "struct $fn->{NAME} r;"; - pidl "NTSTATUS status;"; - pidl ""; - pidl "/* In parameters */"; + $self->fn_declare("NTSTATUS rpccli_$fn->{NAME}(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx$defargs)"); + $self->pidl("{"); + $self->indent; + $self->pidl("struct $fn->{NAME} r;"); + $self->pidl("NTSTATUS status;"); + $self->pidl(""); + $self->pidl("/* In parameters */"); foreach (@{$fn->{ELEMENTS}}) { if (grep(/in/, @{$_->{DIRECTION}})) { - pidl "r.in.$_->{NAME} = $_->{NAME};"; + $self->pidl("r.in.$_->{NAME} = $_->{NAME};"); } } - pidl ""; - pidl "if (DEBUGLEVEL >= 10)"; - pidl "\tNDR_PRINT_IN_DEBUG($fn->{NAME}, &r);"; - pidl ""; - pidl "status = cli_do_rpc_ndr(cli, mem_ctx, PI_$uif, $ufn, &r, (ndr_pull_flags_fn_t)ndr_pull_$fn->{NAME}, (ndr_push_flags_fn_t)ndr_push_$fn->{NAME});"; - pidl ""; - - pidl "if (!NT_STATUS_IS_OK(status)) {"; - indent; - pidl "return status;"; - deindent; - pidl "}"; - - pidl ""; - pidl "if (DEBUGLEVEL >= 10)"; - pidl "\tNDR_PRINT_OUT_DEBUG($fn->{NAME}, &r);"; - pidl ""; - pidl "if (NT_STATUS_IS_ERR(status)) {"; - pidl "\treturn status;"; - pidl "}"; - pidl ""; - pidl "/* Return variables */"; + $self->pidl(""); + $self->pidl("if (DEBUGLEVEL >= 10)"); + $self->pidl("\tNDR_PRINT_IN_DEBUG($fn->{NAME}, &r);"); + $self->pidl(""); + $self->pidl("status = cli_do_rpc_ndr(cli, mem_ctx, PI_$uif, $ufn, &r, (ndr_pull_flags_fn_t)ndr_pull_$fn->{NAME}, (ndr_push_flags_fn_t)ndr_push_$fn->{NAME});"); + $self->pidl(""); + + $self->pidl("if (!NT_STATUS_IS_OK(status)) {"); + $self->indent; + $self->pidl("return status;"); + $self->deindent; + $self->pidl("}"); + + $self->pidl(""); + $self->pidl("if (DEBUGLEVEL >= 10)"); + $self->pidl("\tNDR_PRINT_OUT_DEBUG($fn->{NAME}, &r);"); + $self->pidl(""); + $self->pidl("if (NT_STATUS_IS_ERR(status)) {"); + $self->pidl("\treturn status;"); + $self->pidl("}"); + $self->pidl(""); + $self->pidl("/* Return variables */"); foreach my $e (@{$fn->{ELEMENTS}}) { next unless (grep(/out/, @{$e->{DIRECTION}})); @@ -97,8 +101,8 @@ sub ParseFunction($$) if ( ($e->{LEVELS}[0]->{TYPE} eq "POINTER") and ($e->{LEVELS}[0]->{POINTER_TYPE} ne "ref") ) { - pidl "if ( $e->{NAME} ) {"; - indent; + $self->pidl("if ( $e->{NAME} ) {"); + $self->indent; } if ($e->{LEVELS}[0]->{TYPE} eq "ARRAY") { @@ -108,70 +112,67 @@ sub ParseFunction($$) # to allocate a structure of the right size. my $env = GenerateFunctionInEnv($fn); my $size_is = ParseExpr($e->{LEVELS}[0]->{SIZE_IS}, $env, $e); - pidl "memcpy($e->{NAME}, r.out.$e->{NAME}, $size_is);"; + $self->pidl("memcpy($e->{NAME}, r.out.$e->{NAME}, $size_is);"); } else { - pidl "*$e->{NAME} = *r.out.$e->{NAME};"; + $self->pidl("*$e->{NAME} = *r.out.$e->{NAME};"); } if ( ($e->{LEVELS}[0]->{TYPE} eq "POINTER") and ($e->{LEVELS}[0]->{POINTER_TYPE} ne "ref") ) { - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); } } - pidl""; - pidl "/* Return result */"; + $self->pidl(""); + $self->pidl("/* Return result */"); if (not $fn->{RETURN_TYPE}) { - pidl "return NT_STATUS_OK;"; + $self->pidl("return NT_STATUS_OK;"); } elsif ($fn->{RETURN_TYPE} eq "NTSTATUS") { - pidl "return r.out.result;"; + $self->pidl("return r.out.result;"); } elsif ($fn->{RETURN_TYPE} eq "WERROR") { - pidl "return werror_to_ntstatus(r.out.result);"; + $self->pidl("return werror_to_ntstatus(r.out.result);"); } else { warning($fn->{ORIGINAL}, "Unable to convert $fn->{RETURN_TYPE} to NTSTATUS"); - pidl "return NT_STATUS_OK;"; + $self->pidl("return NT_STATUS_OK;"); } - deindent; - pidl "}"; - pidl ""; + $self->deindent; + $self->pidl("}"); + $self->pidl(""); } -sub ParseInterface($) +sub ParseInterface($$) { - my $if = shift; + my ($self, $if) = @_; my $uif = uc($if->{NAME}); - pidl_hdr "#ifndef __CLI_$uif\__"; - pidl_hdr "#define __CLI_$uif\__"; - ParseFunction(uc($if->{NAME}), $_) foreach (@{$if->{FUNCTIONS}}); - pidl_hdr "#endif /* __CLI_$uif\__ */"; + $self->pidl_hdr("#ifndef __CLI_$uif\__"); + $self->pidl_hdr("#define __CLI_$uif\__"); + $self->ParseFunction(uc($if->{NAME}), $_) foreach (@{$if->{FUNCTIONS}}); + $self->pidl_hdr("#endif /* __CLI_$uif\__ */"); } -sub Parse($$$) +sub Parse($$$$) { - my($ndr,$header,$ndr_header) = @_; - - $res = ""; - $res_hdr = ""; - - pidl "/*"; - pidl " * Unix SMB/CIFS implementation."; - pidl " * client auto-generated by pidl. DO NOT MODIFY!"; - pidl " */"; - pidl ""; - pidl "#include \"includes.h\""; - pidl "#include \"$header\""; - pidl_hdr "#include \"$ndr_header\""; - pidl ""; + my($self,$ndr,$header,$ndr_header) = @_; + + $self->pidl("/*"); + $self->pidl(" * Unix SMB/CIFS implementation."); + $self->pidl(" * client auto-generated by pidl. DO NOT MODIFY!"); + $self->pidl(" */"); + $self->pidl(""); + $self->pidl("#include \"includes.h\""); + $self->pidl("#include \"$header\""); + $self->pidl_hdr("#include \"$ndr_header\""); + $self->pidl(""); foreach (@$ndr) { - ParseInterface($_) if ($_->{TYPE} eq "INTERFACE"); + $self->ParseInterface($_) if ($_->{TYPE} eq "INTERFACE"); } - return ($res, $res_hdr); + return ($self->{res}, $self->{res_hdr}); } 1; diff --git a/tools/pidl/lib/Parse/Pidl/Samba4/EJS.pm b/tools/pidl/lib/Parse/Pidl/Samba4/EJS.pm index 054074297b..0473341db3 100644 --- a/tools/pidl/lib/Parse/Pidl/Samba4/EJS.pm +++ b/tools/pidl/lib/Parse/Pidl/Samba4/EJS.pm @@ -8,8 +8,7 @@ package Parse::Pidl::Samba4::EJS; use Exporter; @ISA = qw(Exporter); -@EXPORT_OK = qw(get_pointer_to get_value_of check_null_pointer $res - $res_hdr fn_declare TypeFunctionName); +@EXPORT_OK = qw(get_pointer_to get_value_of check_null_pointer fn_declare TypeFunctionName); use strict; use Parse::Pidl::Typelist; @@ -21,36 +20,38 @@ use Parse::Pidl::Samba4::NDR::Parser qw(GenerateStructEnv GenerateFunctionInEnv use vars qw($VERSION); $VERSION = '0.01'; -our $res; -our $res_hdr; - -my %constants; - -my $tabs = ""; +sub new($) { + my ($class) = @_; + my $self = { res => "", res_hdr => "", tabs => "", constants => {}}; + bless($self, $class); +} -sub pidl_hdr ($) +sub pidl_hdr ($$) { - $res_hdr .= shift; + my $self = shift; + $self->{res_hdr} .= shift; } -sub pidl($) +sub pidl($$) { - my $d = shift; + my ($self, $d) = @_; if ($d) { - $res .= $tabs; - $res .= $d; + $self->{res} .= $self->{tabs}; + $self->{res} .= $d; } - $res .= "\n"; + $self->{res} .= "\n"; } -sub indent() +sub indent($) { - $tabs .= "\t"; + my ($self) = @_; + $self->{tabs} .= "\t"; } -sub deindent() +sub deindent($) { - $tabs = substr($tabs, 0, -1); + my ($self) = @_; + $self->{tabs} = substr($self->{tabs}, 0, -1); } sub get_pointer_to($) @@ -79,39 +80,39 @@ sub get_value_of($) ##################################################################### # check that a variable we get from ParseExpr isn't a null pointer -sub check_null_pointer($) +sub check_null_pointer($$) { - my $size = shift; + my ($self, $size) = @_; if ($size =~ /^\*/) { my $size2 = substr($size, 1); - pidl "if ($size2 == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;"; + $self->pidl("if ($size2 == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;"); } } ##################################################################### # work out is a parse function should be declared static or not -sub fn_declare($$) +sub fn_declare($$$) { - my ($fn,$decl) = @_; + my ($self,$fn,$decl) = @_; if (has_property($fn, "public")) { - pidl_hdr "$decl;\n"; - pidl "_PUBLIC_ $decl"; + $self->pidl_hdr("$decl;\n"); + $self->pidl("_PUBLIC_ $decl"); } else { - pidl "static $decl"; + $self->pidl("static $decl"); } } ########################### # pull a scalar element -sub EjsPullScalar($$$$$) +sub EjsPullScalar($$$$$$$) { - my ($e, $l, $var, $name, $env) = @_; + my ($self, $e, $l, $var, $name, $env) = @_; return if (has_property($e, "value")); if (ref($e->{TYPE}) eq "HASH" and not defined($e->{TYPE}->{NAME})) { - EjsTypePull($e->{TYPE}, $var); + $self->EjsTypePull($e->{TYPE}, $var); } else { my $pl = Parse::Pidl::NDR::GetPrevLevel($e, $l); $var = get_pointer_to($var); @@ -127,50 +128,50 @@ sub EjsPullScalar($$$$$) } else { $t = $e->{TYPE}; } - pidl "NDR_CHECK(ejs_pull_$t(ejs, v, $name, $var));"; + $self->pidl("NDR_CHECK(ejs_pull_$t(ejs, v, $name, $var));"); } } ########################### # pull a pointer element -sub EjsPullPointer($$$$$) +sub EjsPullPointer($$$$$$) { - my ($e, $l, $var, $name, $env) = @_; - pidl "if (ejs_pull_null(ejs, v, $name)) {"; - indent; + my ($self, $e, $l, $var, $name, $env) = @_; + $self->pidl("if (ejs_pull_null(ejs, v, $name)) {"); + $self->indent; if ($l->{POINTER_TYPE} eq "ref") { - pidl "return NT_STATUS_INVALID_PARAMETER_MIX;"; + $self->pidl("return NT_STATUS_INVALID_PARAMETER_MIX;"); } else { - pidl "$var = NULL;"; + $self->pidl("$var = NULL;"); } - deindent; - pidl "} else {"; - indent; - pidl "EJS_ALLOC(ejs, $var);"; + $self->deindent; + $self->pidl("} else {"); + $self->indent; + $self->pidl("EJS_ALLOC(ejs, $var);"); $var = get_value_of($var); - EjsPullElement($e, GetNextLevel($e, $l), $var, $name, $env); - deindent; - pidl "}"; + $self->EjsPullElement($e, GetNextLevel($e, $l), $var, $name, $env); + $self->deindent; + $self->pidl("}"); } ########################### # pull a string element -sub EjsPullString($$$$$) +sub EjsPullString($$$$$$) { - my ($e, $l, $var, $name, $env) = @_; + my ($self, $e, $l, $var, $name, $env) = @_; my $pl = GetPrevLevel($e, $l); $var = get_pointer_to($var); if (defined($pl) and $pl->{TYPE} eq "POINTER") { $var = get_pointer_to($var); } - pidl "NDR_CHECK(ejs_pull_string(ejs, v, $name, $var));"; + $self->pidl("NDR_CHECK(ejs_pull_string(ejs, v, $name, $var));"); } ########################### # pull an array element -sub EjsPullArray($$$$$) +sub EjsPullArray($$$$$$) { - my ($e, $l, $var, $name, $env) = @_; + my ($self, $e, $l, $var, $name, $env) = @_; my $nl = GetNextLevel($e, $l); my $length = ParseExpr($l->{LENGTH_IS}, $env, $e); my $size = ParseExpr($l->{SIZE_IS}, $env, $e); @@ -181,121 +182,121 @@ sub EjsPullArray($$$$$) # uint8 arrays are treated as data blobs if ($nl->{TYPE} eq 'DATA' && $e->{TYPE} eq 'uint8') { if (!$l->{IS_FIXED}) { - check_null_pointer($size); - pidl "EJS_ALLOC_N(ejs, $var, $size);"; + $self->check_null_pointer($size); + $self->pidl("EJS_ALLOC_N(ejs, $var, $size);"); } - check_null_pointer($length); - pidl "ejs_pull_array_uint8(ejs, v, $name, $var, $length);"; + $self->check_null_pointer($length); + $self->pidl("ejs_pull_array_uint8(ejs, v, $name, $var, $length);"); return; } my $avar = $var . "[i]"; - pidl "{"; - indent; - pidl "uint32_t i;"; + $self->pidl("{"); + $self->indent; + $self->pidl("uint32_t i;"); if (!$l->{IS_FIXED}) { - pidl "EJS_ALLOC_N(ejs, $var, $size);"; + $self->pidl("EJS_ALLOC_N(ejs, $var, $size);"); } - pidl "for (i=0;i<$length;i++) {"; - indent; - pidl "char *id = talloc_asprintf(ejs, \"%s.%u\", $name, i);"; - EjsPullElement($e, $nl, $avar, "id", $env); - pidl "talloc_free(id);"; - deindent; - pidl "}"; - pidl "ejs_push_uint32(ejs, v, $name \".length\", &i);"; - deindent; - pidl "}"; + $self->pidl("for (i=0;i<$length;i++) {"); + $self->indent; + $self->pidl("char *id = talloc_asprintf(ejs, \"%s.%u\", $name, i);"); + $self->EjsPullElement($e, $nl, $avar, "id", $env); + $self->pidl("talloc_free(id);"); + $self->deindent; + $self->pidl("}"); + $self->pidl("ejs_push_uint32(ejs, v, $name \".length\", &i);"); + $self->deindent; + $self->pidl("}"); } ########################### # pull a switch element -sub EjsPullSwitch($$$$$) +sub EjsPullSwitch($$$$$$) { - my ($e, $l, $var, $name, $env) = @_; + my ($self, $e, $l, $var, $name, $env) = @_; my $switch_var = ParseExpr($l->{SWITCH_IS}, $env, $e); - pidl "ejs_set_switch(ejs, $switch_var);"; - EjsPullElement($e, GetNextLevel($e, $l), $var, $name, $env); + $self->pidl("ejs_set_switch(ejs, $switch_var);"); + $self->EjsPullElement($e, GetNextLevel($e, $l), $var, $name, $env); } ########################### # pull a structure element -sub EjsPullElement($$$$$) +sub EjsPullElement($$$$$$) { - my ($e, $l, $var, $name, $env) = @_; + my ($self, $e, $l, $var, $name, $env) = @_; if (($l->{TYPE} eq "POINTER")) { - EjsPullPointer($e, $l, $var, $name, $env); + $self->EjsPullPointer($e, $l, $var, $name, $env); } elsif (has_property($e, "charset")) { - EjsPullString($e, $l, $var, $name, $env); + $self->EjsPullString($e, $l, $var, $name, $env); } elsif ($l->{TYPE} eq "ARRAY") { - EjsPullArray($e, $l, $var, $name, $env); + $self->EjsPullArray($e, $l, $var, $name, $env); } elsif ($l->{TYPE} eq "DATA") { - EjsPullScalar($e, $l, $var, $name, $env); + $self->EjsPullScalar($e, $l, $var, $name, $env); } elsif (($l->{TYPE} eq "SWITCH")) { - EjsPullSwitch($e, $l, $var, $name, $env); + $self->EjsPullSwitch($e, $l, $var, $name, $env); } else { - pidl "return ejs_panic(ejs, \"unhandled pull type $l->{TYPE}\");"; + $self->pidl("return ejs_panic(ejs, \"unhandled pull type $l->{TYPE}\");"); } } ############################################# # pull a structure/union element at top level -sub EjsPullElementTop($$) +sub EjsPullElementTop($$$) { - my ($e, $env) = @_; + my ($self, $e, $env) = @_; my $l = $e->{LEVELS}[0]; my $var = ParseExpr($e->{NAME}, $env, $e); my $name = "\"$e->{NAME}\""; - EjsPullElement($e, $l, $var, $name, $env); + $self->EjsPullElement($e, $l, $var, $name, $env); } ########################### # pull a struct -sub EjsStructPull($$) +sub EjsStructPull($$$) { - my ($d, $varname) = @_; + my ($self, $d, $varname) = @_; my $env = GenerateStructEnv($d, $varname); - pidl "NDR_CHECK(ejs_pull_struct_start(ejs, &v, name));"; + $self->pidl("NDR_CHECK(ejs_pull_struct_start(ejs, &v, name));"); foreach my $e (@{$d->{ELEMENTS}}) { - EjsPullElementTop($e, $env); + $self->EjsPullElementTop($e, $env); } } ########################### # pull a union -sub EjsUnionPull($$) +sub EjsUnionPull($$$) { - my ($d, $varname) = @_; + my ($self, $d, $varname) = @_; my $have_default = 0; - pidl "NDR_CHECK(ejs_pull_struct_start(ejs, &v, name));"; - pidl "switch (ejs->switch_var) {"; - indent; + $self->pidl("NDR_CHECK(ejs_pull_struct_start(ejs, &v, name));"); + $self->pidl("switch (ejs->switch_var) {"); + $self->indent; foreach my $e (@{$d->{ELEMENTS}}) { if ($e->{CASE} eq "default") { $have_default = 1; } - pidl "$e->{CASE}:"; - indent; + $self->pidl("$e->{CASE}:"); + $self->indent; if ($e->{TYPE} ne "EMPTY") { - EjsPullElementTop($e, { $e->{NAME} => "$varname->$e->{NAME}"}); + $self->EjsPullElementTop($e, { $e->{NAME} => "$varname->$e->{NAME}"}); } - pidl "break;"; - deindent; + $self->pidl("break;"); + $self->deindent; } if (! $have_default) { - pidl "default:"; - indent; - pidl "return ejs_panic(ejs, \"Bad switch value\");"; - deindent; + $self->pidl("default:"); + $self->indent; + $self->pidl("return ejs_panic(ejs, \"Bad switch value\");"); + $self->deindent; } - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); } ############################################## # put the enum elements in the constants array -sub EjsEnumConstant($) +sub EjsEnumConstant($$) { - my $d = shift; + my ($self, $d) = @_; my $v = 0; foreach my $e (@{$d->{ELEMENTS}}) { my $el = $e; @@ -304,73 +305,73 @@ sub EjsEnumConstant($) $el = $1; $v = $2; } - $constants{$el} = $v; + $self->{constants}->{$el} = $v; $v++; } } ########################### # pull a enum -sub EjsEnumPull($$) +sub EjsEnumPull($$$) { - my ($d, $varname) = @_; - EjsEnumConstant($d); - pidl "unsigned e;"; - pidl "NDR_CHECK(ejs_pull_enum(ejs, v, name, &e));"; - pidl "*$varname = e;"; + my ($self, $d, $varname) = @_; + $self->EjsEnumConstant($d); + $self->pidl("unsigned e;"); + $self->pidl("NDR_CHECK(ejs_pull_enum(ejs, v, name, &e));"); + $self->pidl("*$varname = e;"); } ########################### # pull a bitmap -sub EjsBitmapPull($$) +sub EjsBitmapPull($$$) { - my ($d, $varname) = @_; + my ($self, $d, $varname) = @_; my $type_fn = $d->{BASE_TYPE}; - pidl "NDR_CHECK(ejs_pull_$type_fn(ejs, v, name, $varname));"; + $self->pidl("NDR_CHECK(ejs_pull_$type_fn(ejs, v, name, $varname));"); } -sub EjsTypePullFunction($$) +sub EjsTypePullFunction($$$) { - sub EjsTypePullFunction($$); - my ($d, $name) = @_; + sub EjsTypePullFunction($$$); + my ($self, $d, $name) = @_; return if (has_property($d, "noejs")); if ($d->{TYPE} eq "TYPEDEF") { - EjsTypePullFunction($d->{DATA}, $name); + $self->EjsTypePullFunction($d->{DATA}, $name); return; } if ($d->{TYPE} eq "STRUCT") { - fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, struct $name *r)"); + $self->fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, struct $name *r)"); } elsif ($d->{TYPE} eq "UNION") { - fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, union $name *r)"); + $self->fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, union $name *r)"); } elsif ($d->{TYPE} eq "ENUM") { - fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, enum $name *r)"); + $self->fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, enum $name *r)"); } elsif ($d->{TYPE} eq "BITMAP") { my($type_decl) = Parse::Pidl::Typelist::mapTypeName($d->{BASE_TYPE}); - fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, $type_decl *r)"); + $self->fn_declare($d, "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, $type_decl *r)"); } - pidl "{"; - indent; + $self->pidl("{"); + $self->indent; - EjsTypePull($d, "r"); + $self->EjsTypePull($d, "r"); - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}\n"; + $self->pidl("return NT_STATUS_OK;"); + $self->deindent; + $self->pidl("}\n"); } -sub EjsTypePull($$) +sub EjsTypePull($$$) { - my ($d, $varname) = @_; + my ($self, $d, $varname) = @_; if ($d->{TYPE} eq 'STRUCT') { - EjsStructPull($d, $varname); + $self->EjsStructPull($d, $varname); } elsif ($d->{TYPE} eq 'UNION') { - EjsUnionPull($d, $varname); + $self->EjsUnionPull($d, $varname); } elsif ($d->{TYPE} eq 'ENUM') { - EjsEnumPull($d, $varname); + $self->EjsEnumPull($d, $varname); } elsif ($d->{TYPE} eq 'BITMAP') { - EjsBitmapPull($d, $varname); + $self->EjsBitmapPull($d, $varname); } else { warn "Unhandled pull $varname of type $d->{TYPE}"; } @@ -378,16 +379,16 @@ sub EjsTypePull($$) ##################### # generate a function -sub EjsPullFunction($) +sub EjsPullFunction($$) { - my $d = shift; + my ($self, $d) = @_; my $env = GenerateFunctionInEnv($d); my $name = $d->{NAME}; - pidl "\nstatic NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, struct $name *r)"; - pidl "{"; - indent; - pidl "NDR_CHECK(ejs_pull_struct_start(ejs, &v, \"input\"));"; + $self->pidl("\nstatic NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, struct $name *r)"); + $self->pidl("{"); + $self->indent; + $self->pidl("NDR_CHECK(ejs_pull_struct_start(ejs, &v, \"input\"));"); # we pull non-array elements before array elements as arrays # may have length_is() or size_is() properties that depend @@ -395,28 +396,28 @@ sub EjsPullFunction($) foreach my $e (@{$d->{ELEMENTS}}) { next unless (grep(/in/, @{$e->{DIRECTION}})); next if (has_property($e, "length_is") || has_property($e, "size_is")); - EjsPullElementTop($e, $env); + $self->EjsPullElementTop($e, $env); } foreach my $e (@{$d->{ELEMENTS}}) { next unless (grep(/in/, @{$e->{DIRECTION}})); next unless (has_property($e, "length_is") || has_property($e, "size_is")); - EjsPullElementTop($e, $env); + $self->EjsPullElementTop($e, $env); } - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}\n"; + $self->pidl("return NT_STATUS_OK;"); + $self->deindent; + $self->pidl("}\n"); } ########################### # push a scalar element -sub EjsPushScalar($$$$$) +sub EjsPushScalar($$$$$$) { - my ($e, $l, $var, $name, $env) = @_; + my ($self, $e, $l, $var, $name, $env) = @_; if (ref($e->{TYPE}) eq "HASH" and not defined($e->{TYPE}->{NAME})) { - EjsTypePush($e->{TYPE}, get_pointer_to($var)); + $self->EjsTypePush($e->{TYPE}, get_pointer_to($var)); } else { # have to handle strings specially :( my $pl = GetPrevLevel($e, $l); @@ -426,58 +427,58 @@ sub EjsPushScalar($$$$$) $var = get_pointer_to($var); } - pidl "NDR_CHECK(".TypeFunctionName("ejs_push", $e->{TYPE})."(ejs, v, $name, $var));"; + $self->pidl("NDR_CHECK(".TypeFunctionName("ejs_push", $e->{TYPE})."(ejs, v, $name, $var));"); } } ########################### # push a string element -sub EjsPushString($$$$$) +sub EjsPushString($$$$$$) { - my ($e, $l, $var, $name, $env) = @_; + my ($self, $e, $l, $var, $name, $env) = @_; my $pl = GetPrevLevel($e, $l); if (defined($pl) and $pl->{TYPE} eq "POINTER") { $var = get_pointer_to($var); } - pidl "NDR_CHECK(ejs_push_string(ejs, v, $name, $var));"; + $self->pidl("NDR_CHECK(ejs_push_string(ejs, v, $name, $var));"); } ########################### # push a pointer element -sub EjsPushPointer($$$$$) +sub EjsPushPointer($$$$$$) { - my ($e, $l, $var, $name, $env) = @_; - pidl "if (NULL == $var) {"; - indent; + my ($self, $e, $l, $var, $name, $env) = @_; + $self->pidl("if (NULL == $var) {"); + $self->indent; if ($l->{POINTER_TYPE} eq "ref") { - pidl "return NT_STATUS_INVALID_PARAMETER_MIX;"; + $self->pidl("return NT_STATUS_INVALID_PARAMETER_MIX;"); } else { - pidl "NDR_CHECK(ejs_push_null(ejs, v, $name));"; + $self->pidl("NDR_CHECK(ejs_push_null(ejs, v, $name));"); } - deindent; - pidl "} else {"; - indent; + $self->deindent; + $self->pidl("} else {"); + $self->indent; $var = get_value_of($var); - EjsPushElement($e, GetNextLevel($e, $l), $var, $name, $env); - deindent; - pidl "}"; + $self->EjsPushElement($e, GetNextLevel($e, $l), $var, $name, $env); + $self->deindent; + $self->pidl("}"); } ########################### # push a switch element -sub EjsPushSwitch($$$$$) +sub EjsPushSwitch($$$$$$) { - my ($e, $l, $var, $name, $env) = @_; + my ($self, $e, $l, $var, $name, $env) = @_; my $switch_var = ParseExpr($l->{SWITCH_IS}, $env, $e); - pidl "ejs_set_switch(ejs, $switch_var);"; - EjsPushElement($e, GetNextLevel($e, $l), $var, $name, $env); + $self->pidl("ejs_set_switch(ejs, $switch_var);"); + $self->EjsPushElement($e, GetNextLevel($e, $l), $var, $name, $env); } ########################### # push an array element -sub EjsPushArray($$$$$) +sub EjsPushArray($$$$$$) { - my ($e, $l, $var, $name, $env) = @_; + my ($self, $e, $l, $var, $name, $env) = @_; my $nl = GetNextLevel($e, $l); my $length = ParseExpr($l->{LENGTH_IS}, $env, $e); my $pl = GetPrevLevel($e, $l); @@ -486,130 +487,130 @@ sub EjsPushArray($$$$$) } # uint8 arrays are treated as data blobs if ($nl->{TYPE} eq 'DATA' && $e->{TYPE} eq 'uint8') { - check_null_pointer($length); - pidl "ejs_push_array_uint8(ejs, v, $name, $var, $length);"; + $self->check_null_pointer($length); + $self->pidl("ejs_push_array_uint8(ejs, v, $name, $var, $length);"); return; } my $avar = $var . "[i]"; - pidl "{"; - indent; - pidl "uint32_t i;"; - pidl "for (i=0;i<$length;i++) {"; - indent; - pidl "const char *id = talloc_asprintf(ejs, \"%s.%u\", $name, i);"; - EjsPushElement($e, $nl, $avar, "id", $env); - deindent; - pidl "}"; - pidl "ejs_push_uint32(ejs, v, $name \".length\", &i);"; - deindent; - pidl "}"; + $self->pidl("{"); + $self->indent; + $self->pidl("uint32_t i;"); + $self->pidl("for (i=0;i<$length;i++) {"); + $self->indent; + $self->pidl("const char *id = talloc_asprintf(ejs, \"%s.%u\", $name, i);"); + $self->EjsPushElement($e, $nl, $avar, "id", $env); + $self->deindent; + $self->pidl("}"); + $self->pidl("ejs_push_uint32(ejs, v, $name \".length\", &i);"); + $self->deindent; + $self->pidl("}"); } ################################ # push a structure/union element -sub EjsPushElement($$$$$) +sub EjsPushElement($$$$$$) { - my ($e, $l, $var, $name, $env) = @_; + my ($self, $e, $l, $var, $name, $env) = @_; if (($l->{TYPE} eq "POINTER")) { - EjsPushPointer($e, $l, $var, $name, $env); + $self->EjsPushPointer($e, $l, $var, $name, $env); } elsif (has_property($e, "charset")) { - EjsPushString($e, $l, $var, $name, $env); + $self->EjsPushString($e, $l, $var, $name, $env); } elsif ($l->{TYPE} eq "ARRAY") { - EjsPushArray($e, $l, $var, $name, $env); + $self->EjsPushArray($e, $l, $var, $name, $env); } elsif ($l->{TYPE} eq "DATA") { - EjsPushScalar($e, $l, $var, $name, $env); + $self->EjsPushScalar($e, $l, $var, $name, $env); } elsif (($l->{TYPE} eq "SWITCH")) { - EjsPushSwitch($e, $l, $var, $name, $env); + $self->EjsPushSwitch($e, $l, $var, $name, $env); } else { - pidl "return ejs_panic(ejs, \"unhandled push type $l->{TYPE}\");"; + $self->pidl("return ejs_panic(ejs, \"unhandled push type $l->{TYPE}\");"); } } ############################################# # push a structure/union element at top level -sub EjsPushElementTop($$) +sub EjsPushElementTop($$$) { - my ($e, $env) = @_; + my ($self, $e, $env) = @_; my $l = $e->{LEVELS}[0]; my $var = ParseExpr($e->{NAME}, $env, $e); my $name = "\"$e->{NAME}\""; - EjsPushElement($e, $l, $var, $name, $env); + $self->EjsPushElement($e, $l, $var, $name, $env); } ########################### # push a struct -sub EjsStructPush($$) +sub EjsStructPush($$$) { - my ($d, $varname) = @_; + my ($self, $d, $varname) = @_; my $env = GenerateStructEnv($d, $varname); - pidl "NDR_CHECK(ejs_push_struct_start(ejs, &v, name));"; + $self->pidl("NDR_CHECK(ejs_push_struct_start(ejs, &v, name));"); foreach my $e (@{$d->{ELEMENTS}}) { - EjsPushElementTop($e, $env); + $self->EjsPushElementTop($e, $env); } } ########################### # push a union -sub EjsUnionPush($$) +sub EjsUnionPush($$$) { - my ($d, $varname) = @_; + my ($self, $d, $varname) = @_; my $have_default = 0; - pidl "NDR_CHECK(ejs_push_struct_start(ejs, &v, name));"; - pidl "switch (ejs->switch_var) {"; - indent; + $self->pidl("NDR_CHECK(ejs_push_struct_start(ejs, &v, name));"); + $self->pidl("switch (ejs->switch_var) {"); + $self->indent; foreach my $e (@{$d->{ELEMENTS}}) { if ($e->{CASE} eq "default") { $have_default = 1; } - pidl "$e->{CASE}:"; - indent; + $self->pidl("$e->{CASE}:"); + $self->indent; if ($e->{TYPE} ne "EMPTY") { - EjsPushElementTop($e, { $e->{NAME} => "$varname->$e->{NAME}"} ); + $self->EjsPushElementTop($e, { $e->{NAME} => "$varname->$e->{NAME}"} ); } - pidl "break;"; - deindent; + $self->pidl("break;"); + $self->deindent; } if (! $have_default) { - pidl "default:"; - indent; - pidl "return ejs_panic(ejs, \"Bad switch value\");"; - deindent; + $self->pidl("default:"); + $self->indent; + $self->pidl("return ejs_panic(ejs, \"Bad switch value\");"); + $self->deindent; } - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); } ########################### # push a enum -sub EjsEnumPush($$) +sub EjsEnumPush($$$) { - my ($d, $varname) = @_; - EjsEnumConstant($d); - pidl "unsigned e = ".get_value_of($varname).";"; - pidl "NDR_CHECK(ejs_push_enum(ejs, v, name, &e));"; + my ($self, $d, $varname) = @_; + $self->EjsEnumConstant($d); + $self->pidl("unsigned e = ".get_value_of($varname).";"); + $self->pidl("NDR_CHECK(ejs_push_enum(ejs, v, name, &e));"); } ########################### # push a bitmap -sub EjsBitmapPush($$) +sub EjsBitmapPush($$$) { - my ($d, $varname) = @_; + my ($self, $d, $varname) = @_; my $type_fn = $d->{BASE_TYPE}; # put the bitmap elements in the constants array foreach my $e (@{$d->{ELEMENTS}}) { if ($e =~ /^(\w*)\s*(.*)\s*$/) { my $bname = $1; my $v = $2; - $constants{$bname} = $v; + $self->{constants}->{$bname} = $v; } } - pidl "NDR_CHECK(ejs_push_$type_fn(ejs, v, name, $varname));"; + $self->pidl("NDR_CHECK(ejs_push_$type_fn(ejs, v, name, $varname));"); } -sub EjsTypePushFunction($$) +sub EjsTypePushFunction($$$) { - sub EjsTypePushFunction($$); - my ($d, $name) = @_; + sub EjsTypePushFunction($$$); + my ($self, $d, $name) = @_; return if (has_property($d, "noejs")); my $var = undef; @@ -627,30 +628,30 @@ sub EjsTypePushFunction($$) my($type_decl) = Parse::Pidl::Typelist::mapTypeName($dt->{BASE_TYPE}); $var = "const $type_decl *r"; } - fn_declare($d, "NTSTATUS ".TypeFunctionName("ejs_push", $d) . "(struct ejs_rpc *ejs, struct MprVar *v, const char *name, $var)"); - pidl "{"; - indent; - EjsTypePush($d, "r"); - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}\n"; + $self->fn_declare($d, "NTSTATUS ".TypeFunctionName("ejs_push", $d) . "(struct ejs_rpc *ejs, struct MprVar *v, const char *name, $var)"); + $self->pidl("{"); + $self->indent; + $self->EjsTypePush($d, "r"); + $self->pidl("return NT_STATUS_OK;"); + $self->deindent; + $self->pidl("}\n"); } -sub EjsTypePush($$) +sub EjsTypePush($$$) { - sub EjsTypePush($$); - my ($d, $varname) = @_; + sub EjsTypePush($$$); + my ($self, $d, $varname) = @_; if ($d->{TYPE} eq 'STRUCT') { - EjsStructPush($d, $varname); + $self->EjsStructPush($d, $varname); } elsif ($d->{TYPE} eq 'UNION') { - EjsUnionPush($d, $varname); + $self->EjsUnionPush($d, $varname); } elsif ($d->{TYPE} eq 'ENUM') { - EjsEnumPush($d, $varname); + $self->EjsEnumPush($d, $varname); } elsif ($d->{TYPE} eq 'BITMAP') { - EjsBitmapPush($d, $varname); + $self->EjsBitmapPush($d, $varname); } elsif ($d->{TYPE} eq 'TYPEDEF') { - EjsTypePush($d->{DATA}, $varname); + $self->EjsTypePush($d->{DATA}, $varname); } else { warn "Unhandled push $varname of type $d->{TYPE}"; } @@ -658,145 +659,142 @@ sub EjsTypePush($$) ##################### # generate a function -sub EjsPushFunction($) +sub EjsPushFunction($$) { - my $d = shift; + my ($self, $d) = @_; my $env = GenerateFunctionOutEnv($d); - pidl "\nstatic NTSTATUS ejs_push_$d->{NAME}(struct ejs_rpc *ejs, struct MprVar *v, const struct $d->{NAME} *r)"; - pidl "{"; - indent; - pidl "NDR_CHECK(ejs_push_struct_start(ejs, &v, \"output\"));"; + $self->pidl("\nstatic NTSTATUS ejs_push_$d->{NAME}(struct ejs_rpc *ejs, struct MprVar *v, const struct $d->{NAME} *r)"); + $self->pidl("{"); + $self->indent; + $self->pidl("NDR_CHECK(ejs_push_struct_start(ejs, &v, \"output\"));"); foreach my $e (@{$d->{ELEMENTS}}) { next unless (grep(/out/, @{$e->{DIRECTION}})); - EjsPushElementTop($e, $env); + $self->EjsPushElementTop($e, $env); } if ($d->{RETURN_TYPE}) { - pidl "NDR_CHECK(".TypeFunctionName("ejs_push", $d->{RETURN_TYPE})."(ejs, v, \"result\", &r->out.result));"; + $self->pidl("NDR_CHECK(".TypeFunctionName("ejs_push", $d->{RETURN_TYPE})."(ejs, v, \"result\", &r->out.result));"); } - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}\n"; + $self->pidl("return NT_STATUS_OK;"); + $self->deindent; + $self->pidl("}\n"); } ################################# # generate a ejs mapping function -sub EjsFunction($$) +sub EjsFunction($$$) { - my ($d, $iface) = @_; + my ($self, $d, $iface) = @_; my $name = $d->{NAME}; my $callnum = uc("DCERPC_$name"); my $table = "&dcerpc_table_$iface"; - pidl "static int ejs_$name(int eid, int argc, struct MprVar **argv)"; - pidl "{"; - indent; - pidl "return ejs_rpc_call(eid, argc, argv, $table, $callnum, (ejs_pull_function_t)ejs_pull_$name, (ejs_push_function_t)ejs_push_$name);"; - deindent; - pidl "}\n"; + $self->pidl("static int ejs_$name(int eid, int argc, struct MprVar **argv)"); + $self->pidl("{"); + $self->indent; + $self->pidl("return ejs_rpc_call(eid, argc, argv, $table, $callnum, (ejs_pull_function_t)ejs_pull_$name, (ejs_push_function_t)ejs_push_$name);"); + $self->deindent; + $self->pidl("}\n"); } ################### # handle a constant -sub EjsConst($) +sub EjsConst($$) { - my $const = shift; - $constants{$const->{NAME}} = $const->{VALUE}; + my ($self, $const) = @_; + $self->{constants}->{$const->{NAME}} = $const->{VALUE}; } sub EjsImport { + my $self = shift; my @imports = @_; foreach (@imports) { s/\.idl\"$//; s/^\"//; - pidl_hdr "#include \"librpc/gen_ndr/ndr_$_\_ejs\.h\"\n"; + $self->pidl_hdr("#include \"librpc/gen_ndr/ndr_$_\_ejs\.h\"\n"); } } ##################################################################### # parse the interface definitions -sub EjsInterface($$) +sub EjsInterface($$$) { - my($interface,$needed) = @_; + my($self,$interface,$needed) = @_; my @fns = (); my $name = $interface->{NAME}; - %constants = (); - - pidl_hdr "#ifndef _HEADER_EJS_$interface->{NAME}\n"; - pidl_hdr "#define _HEADER_EJS_$interface->{NAME}\n\n"; + $self->pidl_hdr("#ifndef _HEADER_EJS_$interface->{NAME}\n"); + $self->pidl_hdr("#define _HEADER_EJS_$interface->{NAME}\n\n"); - pidl_hdr "\n"; + $self->pidl_hdr("\n"); foreach my $d (@{$interface->{TYPES}}) { - ($needed->{TypeFunctionName("ejs_push", $d)}) && EjsTypePushFunction($d, $d->{NAME}); - ($needed->{TypeFunctionName("ejs_pull", $d)}) && EjsTypePullFunction($d, $d->{NAME}); + ($needed->{TypeFunctionName("ejs_push", $d)}) && $self->EjsTypePushFunction($d, $d->{NAME}); + ($needed->{TypeFunctionName("ejs_pull", $d)}) && $self->EjsTypePullFunction($d, $d->{NAME}); } foreach my $d (@{$interface->{FUNCTIONS}}) { next if not defined($d->{OPNUM}); next if has_property($d, "noejs"); - EjsPullFunction($d); - EjsPushFunction($d); - EjsFunction($d, $name); + $self->EjsPullFunction($d); + $self->EjsPushFunction($d); + $self->EjsFunction($d, $name); push (@fns, $d->{NAME}); } foreach my $d (@{$interface->{CONSTS}}) { - EjsConst($d); + $self->EjsConst($d); } - pidl "static int ejs_$name\_init(int eid, int argc, struct MprVar **argv)"; - pidl "{"; - indent; - pidl "struct MprVar *obj = mprInitObject(eid, \"$name\", argc, argv);"; + $self->pidl("static int ejs_$name\_init(int eid, int argc, struct MprVar **argv)"); + $self->pidl("{"); + $self->indent; + $self->pidl("struct MprVar *obj = mprInitObject(eid, \"$name\", argc, argv);"); foreach (@fns) { - pidl "mprSetCFunction(obj, \"$_\", ejs_$_);"; + $self->pidl("mprSetCFunction(obj, \"$_\", ejs_$_);"); } - foreach my $v (keys %constants) { - my $value = $constants{$v}; + foreach my $v (keys %{$self->{constants}}) { + my $value = $self->{constants}->{$v}; if (substr($value, 0, 1) eq "\"") { - pidl "mprSetVar(obj, \"$v\", mprString($value));"; + $self->pidl("mprSetVar(obj, \"$v\", mprString($value));"); } else { - pidl "mprSetVar(obj, \"$v\", mprCreateNumberVar($value));"; + $self->pidl("mprSetVar(obj, \"$v\", mprCreateNumberVar($value));"); } } - pidl "return ejs_rpc_init(obj, \"$name\");"; - deindent; - pidl "}\n"; + $self->pidl("return ejs_rpc_init(obj, \"$name\");"); + $self->deindent; + $self->pidl("}\n"); - pidl "NTSTATUS ejs_init_$name(void)"; - pidl "{"; - indent; - pidl "ejsDefineCFunction(-1, \"$name\_init\", ejs_$name\_init, NULL, MPR_VAR_SCRIPT_HANDLE);"; - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}"; + $self->pidl("NTSTATUS ejs_init_$name(void)"); + $self->pidl("{"); + $self->indent; + $self->pidl("ejsDefineCFunction(-1, \"$name\_init\", ejs_$name\_init, NULL, MPR_VAR_SCRIPT_HANDLE);"); + $self->pidl("return NT_STATUS_OK;"); + $self->deindent; + $self->pidl("}"); - pidl_hdr "\n"; - pidl_hdr "#endif /* _HEADER_EJS_$interface->{NAME} */\n"; + $self->pidl_hdr("\n"); + $self->pidl_hdr("#endif /* _HEADER_EJS_$interface->{NAME} */\n"); } ##################################################################### # parse a parsed IDL into a C header -sub Parse($$) +sub Parse($$$) { - my($ndr,$hdr) = @_; + my($self,$ndr,$hdr) = @_; my $ejs_hdr = $hdr; $ejs_hdr =~ s/.h$/_ejs.h/; - $res = ""; - $res_hdr = ""; - pidl_hdr "/* header auto-generated by pidl */\n\n"; + $self->pidl_hdr("/* header auto-generated by pidl */\n\n"); - pidl " + $self->pidl(" /* EJS wrapper functions auto-generated by pidl */ #include \"includes.h\" #include \"librpc/rpc/dcerpc.h\" @@ -807,7 +805,7 @@ sub Parse($$) #include \"$hdr\" #include \"$ejs_hdr\" -"; +"); my %needed = (); @@ -816,11 +814,11 @@ sub Parse($$) } foreach my $x (@$ndr) { - ($x->{TYPE} eq "INTERFACE") && EjsInterface($x, \%needed); - ($x->{TYPE} eq "IMPORT") && EjsImport(@{$x->{PATHS}}); + ($x->{TYPE} eq "INTERFACE") && $self->EjsInterface($x, \%needed); + ($x->{TYPE} eq "IMPORT") && $self->EjsImport(@{$x->{PATHS}}); } - return ($res_hdr, $res); + return ($self->{res_hdr}, $self->{res}); } sub NeededFunction($$) diff --git a/tools/pidl/lib/Parse/Pidl/Samba4/Header.pm b/tools/pidl/lib/Parse/Pidl/Samba4/Header.pm index 2eddf22b05..f43c042da9 100644 --- a/tools/pidl/lib/Parse/Pidl/Samba4/Header.pm +++ b/tools/pidl/lib/Parse/Pidl/Samba4/Header.pm @@ -43,7 +43,7 @@ sub HeaderProperties($$) } if ($ret) { - pidl "/* [" . substr($ret, 0, -1) . "] */"; + pidl " /* [" . substr($ret, 0, -1) . "] */"; } } @@ -108,10 +108,12 @@ sub HeaderStruct($$) pidl tabs()."char _empty_;\n"; } $tab_depth--; - pidl tabs()."}"; + + pidl "};"; if (defined $struct->{PROPERTIES}) { HeaderProperties($struct->{PROPERTIES}, []); } + pidl "\n\n"; } ##################################################################### @@ -132,10 +134,10 @@ sub HeaderEnum($$) } pidl "\n"; $tab_depth--; - pidl "}\n"; + pidl "};\n"; pidl "#else\n"; my $count = 0; - pidl "enum $name { __donnot_use_enum_$name=0x7FFFFFFF}\n"; + pidl "enum $name { __donnot_use_enum_$name=0x7FFFFFFF};\n"; my $with_val = 0; my $without_val = 0; foreach my $e (@{$enum->{ELEMENTS}}) { @@ -191,11 +193,12 @@ sub HeaderUnion($$) } } $tab_depth--; - pidl "}"; + pidl "};"; if (defined $union->{PROPERTIES}) { HeaderProperties($union->{PROPERTIES}, []); } + pidl "\n\n"; } ##################################################################### @@ -297,7 +300,7 @@ sub HeaderFunction($) HeaderFunctionInOut($fn, "in"); HeaderFunctionInOut($fn, "inout"); $tab_depth--; - pidl tabs()."} in;\n\n"; + pidl tabs()."} in;\n"; $needed++; } @@ -311,7 +314,7 @@ sub HeaderFunction($) pidl tabs().mapTypeName($fn->{RETURN_TYPE}) . " result;\n"; } $tab_depth--; - pidl tabs()."} out;\n\n"; + pidl tabs()."} out;\n"; $needed++; } @@ -362,11 +365,6 @@ sub HeaderInterface($) HeaderUnion($d, $d->{NAME}) if ($d->{TYPE} eq "UNION"); HeaderEnum($d, $d->{NAME}) if ($d->{TYPE} eq "ENUM"); HeaderBitmap($d, $d->{NAME}) if ($d->{TYPE} eq "BITMAP"); - pidl ";\n\n" if ($d->{TYPE} eq "BITMAP" or - $d->{TYPE} eq "STRUCT" or - $d->{TYPE} eq "TYPEDEF" or - $d->{TYPE} eq "UNION" or - $d->{TYPE} eq "ENUM"); } foreach my $d (@{$interface->{DATA}}) { diff --git a/tools/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/tools/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm index eaf66ea0c3..b65df06884 100644 --- a/tools/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm +++ b/tools/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm @@ -9,10 +9,7 @@ package Parse::Pidl::Samba4::NDR::Parser; require Exporter; @ISA = qw(Exporter); -@EXPORT = qw(is_charset_array); -@EXPORT_OK = qw(check_null_pointer GenerateFunctionInEnv - GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv NeededFunction - NeededElement NeededType $res NeededInterface TypeFunctionName ParseElementPrint); +@EXPORT_OK = qw(check_null_pointer GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv NeededFunction NeededElement NeededType $res NeededInterface TypeFunctionName ParseElementPrint); use strict; use Parse::Pidl::Typelist qw(hasType getType mapTypeName); @@ -27,6 +24,12 @@ $VERSION = '0.01'; # list of known types my %typefamily; +sub new($$) { + my ($class) = @_; + my $self = { res => "", res_hdr => "", deferred => [], tabs => "", defer_tabs => "" }; + bless($self, $class); +} + sub get_typefamily($) { my $n = shift; @@ -110,25 +113,19 @@ sub get_value_of($) } } -our $res; -my $deferred = []; -my $tabs = ""; - #################################### # pidl() is our basic output routine -sub pidl($) +sub pidl($$) { - my $d = shift; + my ($self, $d) = @_; if ($d) { - $res .= $tabs; - $res .= $d; + $self->{res} .= $self->{tabs}; + $self->{res} .= $d; } - $res .="\n"; + $self->{res} .="\n"; } -my $res_hdr; - -sub pidl_hdr ($) { my $d = shift; $res_hdr .= "$d\n"; } +sub pidl_hdr($$) { my ($self, $d) = @_; $self->{res_hdr} .= "$d\n"; } #################################### # defer() is like pidl(), but adds to @@ -136,54 +133,56 @@ sub pidl_hdr ($) { my $d = shift; $res_hdr .= "$d\n"; } # output buffer at the end of the structure/union/function # This is needed to cope with code that must be pushed back # to the end of a block of elements -my $defer_tabs = ""; -sub defer_indent() { $defer_tabs.="\t"; } -sub defer_deindent() { $defer_tabs=substr($defer_tabs, 0, -1); } +sub defer_indent($) { my ($self) = @_; $self->{defer_tabs}.="\t"; } +sub defer_deindent($) { my ($self) = @_; $self->{defer_tabs}=substr($self->{defer_tabs}, 0, -1); } -sub defer($) +sub defer($$) { - my $d = shift; + my ($self, $d) = @_; if ($d) { - push(@$deferred, $defer_tabs.$d); + push(@{$self->{deferred}}, $self->{defer_tabs}.$d); } } ######################################## # add the deferred content to the current # output -sub add_deferred() +sub add_deferred($) { - pidl $_ foreach (@$deferred); - $deferred = []; - $defer_tabs = ""; + my ($self) = @_; + $self->pidl($_) foreach (@{$self->{deferred}}); + $self->{deferred} = []; + $self->{defer_tabs} = ""; } -sub indent() +sub indent($) { - $tabs .= "\t"; + my ($self) = @_; + $self->{tabs} .= "\t"; } -sub deindent() +sub deindent($) { - $tabs = substr($tabs, 0, -1); + my ($self) = @_; + $self->{tabs} = substr($self->{tabs}, 0, -1); } ##################################################################### # declare a function public or static, depending on its attributes -sub fn_declare($$$) +sub fn_declare($$$$) { - my ($type,$fn,$decl) = @_; + my ($self,$type,$fn,$decl) = @_; if (has_property($fn, "no$type")) { - pidl_hdr "$decl;"; + $self->pidl_hdr("$decl;"); return 0; } if (has_property($fn, "public")) { - pidl_hdr "$decl;"; - pidl "_PUBLIC_ $decl"; + $self->pidl_hdr("$decl;"); + $self->pidl("_PUBLIC_ $decl"); } else { - pidl "static $decl"; + $self->pidl("static $decl"); } return 1; @@ -191,28 +190,28 @@ sub fn_declare($$$) ################################################################### # setup any special flags for an element or structure -sub start_flags($) +sub start_flags($$) { - my $e = shift; + my ($self, $e) = @_; my $flags = has_property($e, "flag"); if (defined $flags) { - pidl "{"; - indent; - pidl "uint32_t _flags_save_$e->{TYPE} = ndr->flags;"; - pidl "ndr_set_flags(&ndr->flags, $flags);"; + $self->pidl("{"); + $self->indent; + $self->pidl("uint32_t _flags_save_$e->{TYPE} = ndr->flags;"); + $self->pidl("ndr_set_flags(&ndr->flags, $flags);"); } } ################################################################### # end any special flags for an element or structure -sub end_flags($) +sub end_flags($$) { - my $e = shift; + my ($self, $e) = @_; my $flags = has_property($e, "flag"); if (defined $flags) { - pidl "ndr->flags = _flags_save_$e->{TYPE};"; - deindent; - pidl "}"; + $self->pidl("ndr->flags = _flags_save_$e->{TYPE};"); + $self->deindent; + $self->pidl("}"); } } @@ -276,9 +275,9 @@ sub GenerateFunctionOutEnv($) ##################################################################### # parse the data of an array - push side -sub ParseArrayPushHeader($$$$$) +sub ParseArrayPushHeader($$$$$$) { - my ($e,$l,$ndr,$var_name,$env) = @_; + my ($self,$e,$l,$ndr,$var_name,$env) = @_; my $size; my $length; @@ -295,12 +294,12 @@ sub ParseArrayPushHeader($$$$$) } if ((!$l->{IS_SURROUNDING}) and $l->{IS_CONFORMANT}) { - pidl "NDR_CHECK(ndr_push_uint32($ndr, NDR_SCALARS, $size));"; + $self->pidl("NDR_CHECK(ndr_push_uint32($ndr, NDR_SCALARS, $size));"); } if ($l->{IS_VARYING}) { - pidl "NDR_CHECK(ndr_push_uint32($ndr, NDR_SCALARS, 0));"; # array offset - pidl "NDR_CHECK(ndr_push_uint32($ndr, NDR_SCALARS, $length));"; + $self->pidl("NDR_CHECK(ndr_push_uint32($ndr, NDR_SCALARS, 0));"); # array offset + $self->pidl("NDR_CHECK(ndr_push_uint32($ndr, NDR_SCALARS, $length));"); } return $length; @@ -408,9 +407,9 @@ sub check_null_pointer($$$$) ##################################################################### # parse an array - pull side -sub ParseArrayPullHeader($$$$$) +sub ParseArrayPullHeader($$$$$$) { - my ($e,$l,$ndr,$var_name,$env) = @_; + my ($self,$e,$l,$ndr,$var_name,$env) = @_; my $length; my $size; @@ -421,48 +420,48 @@ sub ParseArrayPullHeader($$$$$) $length = $size = "ndr_get_string_size($ndr, sizeof(*$var_name))"; } else { $length = $size = ParseExprExt($l->{SIZE_IS}, $env, $e->{ORIGINAL}, - check_null_pointer($e, $env, \&pidl, "return NT_STATUS_INVALID_PARAMETER_MIX;"), check_fully_dereferenced($e, $env)); + check_null_pointer($e, $env, sub { $self->pidl(shift); }, "return NT_STATUS_INVALID_PARAMETER_MIX;"), check_fully_dereferenced($e, $env)); } if ((!$l->{IS_SURROUNDING}) and $l->{IS_CONFORMANT}) { - pidl "NDR_CHECK(ndr_pull_array_size(ndr, " . get_pointer_to($var_name) . "));"; + $self->pidl("NDR_CHECK(ndr_pull_array_size(ndr, " . get_pointer_to($var_name) . "));"); } if ($l->{IS_VARYING}) { - pidl "NDR_CHECK(ndr_pull_array_length($ndr, " . get_pointer_to($var_name) . "));"; + $self->pidl("NDR_CHECK(ndr_pull_array_length($ndr, " . get_pointer_to($var_name) . "));"); $length = "ndr_get_array_length($ndr, " . get_pointer_to($var_name) .")"; } if ($length ne $size) { - pidl "if ($length > $size) {"; - indent; - pidl "return ndr_pull_error($ndr, NDR_ERR_ARRAY_SIZE, \"Bad array size %u should exceed array length %u\", $size, $length);"; - deindent; - pidl "}"; + $self->pidl("if ($length > $size) {"); + $self->indent; + $self->pidl("return ndr_pull_error($ndr, NDR_ERR_ARRAY_SIZE, \"Bad array size %u should exceed array length %u\", $size, $length);"); + $self->deindent; + $self->pidl("}"); } if ($l->{IS_CONFORMANT} and not $l->{IS_ZERO_TERMINATED}) { - defer "if ($var_name) {"; - defer_indent; - my $size = ParseExprExt($l->{SIZE_IS}, $env, $e->{ORIGINAL}, check_null_pointer($e, $env, \&defer, "return NT_STATUS_INVALID_PARAMETER_MIX;"), check_fully_dereferenced($e, $env)); - defer "NDR_CHECK(ndr_check_array_size(ndr, (void*)" . get_pointer_to($var_name) . ", $size));"; - defer_deindent; - defer "}"; + $self->defer("if ($var_name) {"); + $self->defer_indent; + my $size = ParseExprExt($l->{SIZE_IS}, $env, $e->{ORIGINAL}, check_null_pointer($e, $env, sub { $self->defer(shift); }, "return NT_STATUS_INVALID_PARAMETER_MIX;"), check_fully_dereferenced($e, $env)); + $self->defer("NDR_CHECK(ndr_check_array_size(ndr, (void*)" . get_pointer_to($var_name) . ", $size));"); + $self->defer_deindent; + $self->defer("}"); } if ($l->{IS_VARYING} and not $l->{IS_ZERO_TERMINATED}) { - defer "if ($var_name) {"; - defer_indent; + $self->defer("if ($var_name) {"); + $self->defer_indent; my $length = ParseExprExt($l->{LENGTH_IS}, $env, $e->{ORIGINAL}, - check_null_pointer($e, $env, \&defer, "return NT_STATUS_INVALID_PARAMETER_MIX;"), + check_null_pointer($e, $env, sub { $self->defer(shift); }, "return NT_STATUS_INVALID_PARAMETER_MIX;"), check_fully_dereferenced($e, $env)); - defer "NDR_CHECK(ndr_check_array_length(ndr, (void*)" . get_pointer_to($var_name) . ", $length));"; - defer_deindent; - defer "}" + $self->defer("NDR_CHECK(ndr_check_array_length(ndr, (void*)" . get_pointer_to($var_name) . ", $length));"); + $self->defer_deindent; + $self->defer("}"); } if (not $l->{IS_FIXED} and not is_charset_array($e, $l)) { - AllocateArrayLevel($e,$l,$ndr,$env,$size); + $self->AllocateArrayLevel($e,$l,$ndr,$env,$size); } return $length; @@ -492,129 +491,129 @@ sub compression_dlen($$$) return ParseExpr($dlen, $env, $e->{ORIGINAL}); } -sub ParseCompressionPushStart($$$$) +sub ParseCompressionPushStart($$$$$) { - my ($e,$l,$ndr,$env) = @_; + my ($self,$e,$l,$ndr,$env) = @_; my $comndr = "$ndr\_compressed"; my $alg = compression_alg($e, $l); my $dlen = compression_dlen($e, $l, $env); - pidl "{"; - indent; - pidl "struct ndr_push *$comndr;"; - pidl "NDR_CHECK(ndr_push_compression_start($ndr, &$comndr, $alg, $dlen));"; + $self->pidl("{"); + $self->indent; + $self->pidl("struct ndr_push *$comndr;"); + $self->pidl("NDR_CHECK(ndr_push_compression_start($ndr, &$comndr, $alg, $dlen));"); return $comndr; } -sub ParseCompressionPushEnd($$$$) +sub ParseCompressionPushEnd($$$$$) { - my ($e,$l,$ndr,$env) = @_; + my ($self,$e,$l,$ndr,$env) = @_; my $comndr = "$ndr\_compressed"; my $alg = compression_alg($e, $l); my $dlen = compression_dlen($e, $l, $env); - pidl "NDR_CHECK(ndr_push_compression_end($ndr, $comndr, $alg, $dlen));"; - deindent; - pidl "}"; + $self->pidl("NDR_CHECK(ndr_push_compression_end($ndr, $comndr, $alg, $dlen));"); + $self->deindent; + $self->pidl("}"); } -sub ParseCompressionPullStart($$$$) +sub ParseCompressionPullStart($$$$$) { - my ($e,$l,$ndr,$env) = @_; + my ($self,$e,$l,$ndr,$env) = @_; my $comndr = "$ndr\_compressed"; my $alg = compression_alg($e, $l); my $dlen = compression_dlen($e, $l, $env); - pidl "{"; - indent; - pidl "struct ndr_pull *$comndr;"; - pidl "NDR_CHECK(ndr_pull_compression_start($ndr, &$comndr, $alg, $dlen));"; + $self->pidl("{"); + $self->indent; + $self->pidl("struct ndr_pull *$comndr;"); + $self->pidl("NDR_CHECK(ndr_pull_compression_start($ndr, &$comndr, $alg, $dlen));"); return $comndr; } -sub ParseCompressionPullEnd($$$$) +sub ParseCompressionPullEnd($$$$$) { - my ($e,$l,$ndr,$env) = @_; + my ($self,$e,$l,$ndr,$env) = @_; my $comndr = "$ndr\_compressed"; my $alg = compression_alg($e, $l); my $dlen = compression_dlen($e, $l, $env); - pidl "NDR_CHECK(ndr_pull_compression_end($ndr, $comndr, $alg, $dlen));"; - deindent; - pidl "}"; + $self->pidl("NDR_CHECK(ndr_pull_compression_end($ndr, $comndr, $alg, $dlen));"); + $self->deindent; + $self->pidl("}"); } -sub ParseSubcontextPushStart($$$$) +sub ParseSubcontextPushStart($$$$$) { - my ($e,$l,$ndr,$env) = @_; + my ($self,$e,$l,$ndr,$env) = @_; my $subndr = "_ndr_$e->{NAME}"; my $subcontext_size = ParseExpr($l->{SUBCONTEXT_SIZE}, $env, $e->{ORIGINAL}); - pidl "{"; - indent; - pidl "struct ndr_push *$subndr;"; - pidl "NDR_CHECK(ndr_push_subcontext_start($ndr, &$subndr, $l->{HEADER_SIZE}, $subcontext_size));"; + $self->pidl("{"); + $self->indent; + $self->pidl("struct ndr_push *$subndr;"); + $self->pidl("NDR_CHECK(ndr_push_subcontext_start($ndr, &$subndr, $l->{HEADER_SIZE}, $subcontext_size));"); if (defined $l->{COMPRESSION}) { - $subndr = ParseCompressionPushStart($e, $l, $subndr, $env); + $subndr = $self->ParseCompressionPushStart($e, $l, $subndr, $env); } return $subndr; } -sub ParseSubcontextPushEnd($$$$) +sub ParseSubcontextPushEnd($$$$$) { - my ($e,$l,$ndr,$env) = @_; + my ($self,$e,$l,$ndr,$env) = @_; my $subndr = "_ndr_$e->{NAME}"; my $subcontext_size = ParseExpr($l->{SUBCONTEXT_SIZE}, $env, $e->{ORIGINAL}); if (defined $l->{COMPRESSION}) { - ParseCompressionPushEnd($e, $l, $subndr, $env); + $self->ParseCompressionPushEnd($e, $l, $subndr, $env); } - pidl "NDR_CHECK(ndr_push_subcontext_end($ndr, $subndr, $l->{HEADER_SIZE}, $subcontext_size));"; - deindent; - pidl "}"; + $self->pidl("NDR_CHECK(ndr_push_subcontext_end($ndr, $subndr, $l->{HEADER_SIZE}, $subcontext_size));"); + $self->deindent; + $self->pidl("}"); } -sub ParseSubcontextPullStart($$$$) +sub ParseSubcontextPullStart($$$$$) { - my ($e,$l,$ndr,$env) = @_; + my ($self,$e,$l,$ndr,$env) = @_; my $subndr = "_ndr_$e->{NAME}"; my $subcontext_size = ParseExpr($l->{SUBCONTEXT_SIZE}, $env, $e->{ORIGINAL}); - pidl "{"; - indent; - pidl "struct ndr_pull *$subndr;"; - pidl "NDR_CHECK(ndr_pull_subcontext_start($ndr, &$subndr, $l->{HEADER_SIZE}, $subcontext_size));"; + $self->pidl("{"); + $self->indent; + $self->pidl("struct ndr_pull *$subndr;"); + $self->pidl("NDR_CHECK(ndr_pull_subcontext_start($ndr, &$subndr, $l->{HEADER_SIZE}, $subcontext_size));"); if (defined $l->{COMPRESSION}) { - $subndr = ParseCompressionPullStart($e, $l, $subndr, $env); + $subndr = $self->ParseCompressionPullStart($e, $l, $subndr, $env); } return $subndr; } -sub ParseSubcontextPullEnd($$$$) +sub ParseSubcontextPullEnd($$$$$) { - my ($e,$l,$ndr,$env) = @_; + my ($self,$e,$l,$ndr,$env) = @_; my $subndr = "_ndr_$e->{NAME}"; my $subcontext_size = ParseExpr($l->{SUBCONTEXT_SIZE}, $env, $e->{ORIGINAL}); if (defined $l->{COMPRESSION}) { - ParseCompressionPullEnd($e, $l, $subndr, $env); + $self->ParseCompressionPullEnd($e, $l, $subndr, $env); } - pidl "NDR_CHECK(ndr_pull_subcontext_end($ndr, $subndr, $l->{HEADER_SIZE}, $subcontext_size));"; - deindent; - pidl "}"; + $self->pidl("NDR_CHECK(ndr_pull_subcontext_end($ndr, $subndr, $l->{HEADER_SIZE}, $subcontext_size));"); + $self->deindent; + $self->pidl("}"); } sub ParseElementPushLevel { - my ($e,$l,$ndr,$var_name,$env,$primitives,$deferred) = @_; + my ($self,$e,$l,$ndr,$var_name,$env,$primitives,$deferred) = @_; my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred); @@ -624,45 +623,45 @@ sub ParseElementPushLevel if (defined($ndr_flags)) { if ($l->{TYPE} eq "SUBCONTEXT") { - my $subndr = ParseSubcontextPushStart($e, $l, $ndr, $env); - ParseElementPushLevel($e, GetNextLevel($e, $l), $subndr, $var_name, $env, 1, 1); - ParseSubcontextPushEnd($e, $l, $ndr, $env); + my $subndr = $self->ParseSubcontextPushStart($e, $l, $ndr, $env); + $self->ParseElementPushLevel($e, GetNextLevel($e, $l), $subndr, $var_name, $env, 1, 1); + $self->ParseSubcontextPushEnd($e, $l, $ndr, $env); } elsif ($l->{TYPE} eq "POINTER") { - ParsePtrPush($e, $l, $var_name); + $self->ParsePtrPush($e, $l, $var_name); } elsif ($l->{TYPE} eq "ARRAY") { - my $length = ParseArrayPushHeader($e, $l, $ndr, $var_name, $env); + my $length = $self->ParseArrayPushHeader($e, $l, $ndr, $var_name, $env); my $nl = GetNextLevel($e, $l); # Allow speedups for arrays of scalar types if (is_charset_array($e,$l)) { - pidl "NDR_CHECK(ndr_push_charset($ndr, $ndr_flags, $var_name, $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));"; + $self->pidl("NDR_CHECK(ndr_push_charset($ndr, $ndr_flags, $var_name, $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));"); return; } elsif (has_fast_array($e,$l)) { - pidl "NDR_CHECK(ndr_push_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));"; + $self->pidl("NDR_CHECK(ndr_push_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));"); return; } } elsif ($l->{TYPE} eq "SWITCH") { - ParseSwitchPush($e, $l, $ndr, $var_name, $env); + $self->ParseSwitchPush($e, $l, $ndr, $var_name, $env); } elsif ($l->{TYPE} eq "DATA") { - ParseDataPush($e, $l, $ndr, $var_name, $primitives, $deferred); + $self->ParseDataPush($e, $l, $ndr, $var_name, $primitives, $deferred); } } if ($l->{TYPE} eq "POINTER" and $deferred) { if ($l->{POINTER_TYPE} ne "ref") { - pidl "if ($var_name) {"; - indent; + $self->pidl("if ($var_name) {"); + $self->indent; if ($l->{POINTER_TYPE} eq "relative") { - pidl "NDR_CHECK(ndr_push_relative_ptr2(ndr, $var_name));"; + $self->pidl("NDR_CHECK(ndr_push_relative_ptr2(ndr, $var_name));"); } } $var_name = get_value_of($var_name); - ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 1, 1); + $self->ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 1, 1); if ($l->{POINTER_TYPE} ne "ref") { - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); } } elsif ($l->{TYPE} eq "ARRAY" and not has_fast_array($e,$l) and not is_charset_array($e, $l)) { @@ -672,30 +671,30 @@ sub ParseElementPushLevel $var_name = $var_name . "[$counter]"; if (($primitives and not $l->{IS_DEFERRED}) or ($deferred and $l->{IS_DEFERRED})) { - pidl "for ($counter = 0; $counter < $length; $counter++) {"; - indent; - ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 1, 0); - deindent; - pidl "}"; + $self->pidl("for ($counter = 0; $counter < $length; $counter++) {"); + $self->indent; + $self->ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 1, 0); + $self->deindent; + $self->pidl("}"); } if ($deferred and ContainsDeferred($e, $l)) { - pidl "for ($counter = 0; $counter < $length; $counter++) {"; - indent; - ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 0, 1); - deindent; - pidl "}"; + $self->pidl("for ($counter = 0; $counter < $length; $counter++) {"); + $self->indent; + $self->ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 0, 1); + $self->deindent; + $self->pidl("}"); } } elsif ($l->{TYPE} eq "SWITCH") { - ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, $primitives, $deferred); + $self->ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, $primitives, $deferred); } } ##################################################################### # parse scalars in a structure element -sub ParseElementPush($$$$$) +sub ParseElementPush($$$$$$) { - my ($e,$ndr,$env,$primitives,$deferred) = @_; + my ($self,$e,$ndr,$env,$primitives,$deferred) = @_; my $subndr = undef; my $var_name = $env->{$e->{NAME}}; @@ -704,57 +703,57 @@ sub ParseElementPush($$$$$) # Representation type is different from transmit_as if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) { - pidl "{"; - indent; + $self->pidl("{"); + $self->indent; my $transmit_name = "_transmit_$e->{NAME}"; - pidl mapTypeName($e->{TYPE}) ." $transmit_name;"; - pidl "NDR_CHECK(ndr_$e->{REPRESENTATION_TYPE}_to_$e->{TYPE}($var_name, " . get_pointer_to($transmit_name) . "));"; + $self->pidl(mapTypeName($e->{TYPE}) ." $transmit_name;"); + $self->pidl("NDR_CHECK(ndr_$e->{REPRESENTATION_TYPE}_to_$e->{TYPE}($var_name, " . get_pointer_to($transmit_name) . "));"); $var_name = $transmit_name; } $var_name = append_prefix($e, $var_name); - start_flags($e); + $self->start_flags($e); if (defined(my $value = has_property($e, "value"))) { $var_name = ParseExpr($value, $env, $e->{ORIGINAL}); } - ParseElementPushLevel($e, $e->{LEVELS}[0], $ndr, $var_name, $env, $primitives, $deferred); + $self->ParseElementPushLevel($e, $e->{LEVELS}[0], $ndr, $var_name, $env, $primitives, $deferred); - end_flags($e); + $self->end_flags($e); if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) { - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); } } ##################################################################### # parse a pointer in a struct element or function -sub ParsePtrPush($$$) +sub ParsePtrPush($$$$) { - my ($e,$l,$var_name) = @_; + my ($self,$e,$l,$var_name) = @_; if ($l->{POINTER_TYPE} eq "ref") { - pidl "if ($var_name == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;"; + $self->pidl("if ($var_name == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;"); if ($l->{LEVEL} eq "EMBEDDED") { - pidl "NDR_CHECK(ndr_push_ref_ptr(ndr));"; + $self->pidl("NDR_CHECK(ndr_push_ref_ptr(ndr));"); } } elsif ($l->{POINTER_TYPE} eq "relative") { - pidl "NDR_CHECK(ndr_push_relative_ptr1(ndr, $var_name));"; + $self->pidl("NDR_CHECK(ndr_push_relative_ptr1(ndr, $var_name));"); } elsif ($l->{POINTER_TYPE} eq "unique") { - pidl "NDR_CHECK(ndr_push_unique_ptr(ndr, $var_name));"; + $self->pidl("NDR_CHECK(ndr_push_unique_ptr(ndr, $var_name));"); } elsif ($l->{POINTER_TYPE} eq "full") { - pidl "NDR_CHECK(ndr_push_full_ptr(ndr, $var_name));"; + $self->pidl("NDR_CHECK(ndr_push_full_ptr(ndr, $var_name));"); } else { die("Unhandled pointer type $l->{POINTER_TYPE}"); } } -sub ParseDataPrint($$$) +sub ParseDataPrint($$$$) { - my ($e, $l, $var_name) = @_; + my ($self, $e, $l, $var_name) = @_; if (not ref($l->{DATA_TYPE}) or defined($l->{DATA_TYPE}->{NAME})) { @@ -768,22 +767,22 @@ sub ParseDataPrint($$$) Parse::Pidl::Typelist::scalar_is_reference($t)) { $var_name = get_pointer_to($var_name); } - pidl "ndr_print_$t(ndr, \"$e->{NAME}\", $var_name);"; + $self->pidl("ndr_print_$t(ndr, \"$e->{NAME}\", $var_name);"); } else { - ParseTypePrint($l->{DATA_TYPE}, $var_name); + $self->ParseTypePrint($l->{DATA_TYPE}, $var_name); } } ##################################################################### # print scalars in a structure element -sub ParseElementPrint($$$) +sub ParseElementPrint($$$$) { - my($e, $var_name, $env) = @_; + my($self, $e, $var_name, $env) = @_; return if (has_property($e, "noprint")); if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) { - pidl "ndr_print_$e->{REPRESENTATION_TYPE}(ndr, \"$e->{NAME}\", $var_name);"; + $self->pidl("ndr_print_$e->{REPRESENTATION_TYPE}(ndr, \"$e->{NAME}\", $var_name);"); return; } @@ -795,11 +794,11 @@ sub ParseElementPrint($$$) foreach my $l (@{$e->{LEVELS}}) { if ($l->{TYPE} eq "POINTER") { - pidl "ndr_print_ptr(ndr, \"$e->{NAME}\", $var_name);"; - pidl "ndr->depth++;"; + $self->pidl("ndr_print_ptr(ndr, \"$e->{NAME}\", $var_name);"); + $self->pidl("ndr->depth++;"); if ($l->{POINTER_TYPE} ne "ref") { - pidl "if ($var_name) {"; - indent; + $self->pidl("if ($var_name) {"); + $self->indent; } $var_name = get_value_of($var_name); } elsif ($l->{TYPE} eq "ARRAY") { @@ -813,86 +812,86 @@ sub ParseElementPrint($$$) $length = "ndr_string_length($var_name, sizeof(*$var_name))"; } else { $length = ParseExprExt($l->{LENGTH_IS}, $env, $e->{ORIGINAL}, - check_null_pointer($e, $env, \&pidl, "return;"), check_fully_dereferenced($e, $env)); + check_null_pointer($e, $env, sub { $self->pidl(shift); }, "return;"), check_fully_dereferenced($e, $env)); } if (is_charset_array($e,$l)) { - pidl "ndr_print_string(ndr, \"$e->{NAME}\", $var_name);"; + $self->pidl("ndr_print_string(ndr, \"$e->{NAME}\", $var_name);"); last; } elsif (has_fast_array($e, $l)) { my $nl = GetNextLevel($e, $l); - pidl "ndr_print_array_$nl->{DATA_TYPE}(ndr, \"$e->{NAME}\", $var_name, $length);"; + $self->pidl("ndr_print_array_$nl->{DATA_TYPE}(ndr, \"$e->{NAME}\", $var_name, $length);"); last; } else { my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}"; - pidl "ndr->print(ndr, \"\%s: ARRAY(\%d)\", \"$e->{NAME}\", $length);"; - pidl 'ndr->depth++;'; - pidl "for ($counter=0;$counter<$length;$counter++) {"; - indent; - pidl "char *idx_$l->{LEVEL_INDEX}=NULL;"; - pidl "asprintf(&idx_$l->{LEVEL_INDEX}, \"[\%d]\", $counter);"; - pidl "if (idx_$l->{LEVEL_INDEX}) {"; - indent; + $self->pidl("ndr->print(ndr, \"\%s: ARRAY(\%d)\", \"$e->{NAME}\", $length);"); + $self->pidl("ndr->depth++;"); + $self->pidl("for ($counter=0;$counter<$length;$counter++) {"); + $self->indent; + $self->pidl("char *idx_$l->{LEVEL_INDEX}=NULL;"); + $self->pidl("asprintf(&idx_$l->{LEVEL_INDEX}, \"[\%d]\", $counter);"); + $self->pidl("if (idx_$l->{LEVEL_INDEX}) {"); + $self->indent; $var_name = $var_name . "[$counter]"; } } elsif ($l->{TYPE} eq "DATA") { - ParseDataPrint($e, $l, $var_name); + $self->ParseDataPrint($e, $l, $var_name); } elsif ($l->{TYPE} eq "SWITCH") { my $switch_var = ParseExprExt($l->{SWITCH_IS}, $env, $e->{ORIGINAL}, - check_null_pointer($e, $env, \&pidl, "return;"), check_fully_dereferenced($e, $env)); - pidl "ndr_print_set_switch_value(ndr, " . get_pointer_to($var_name) . ", $switch_var);"; + check_null_pointer($e, $env, sub { $self->pidl(shift); }, "return;"), check_fully_dereferenced($e, $env)); + $self->pidl("ndr_print_set_switch_value(ndr, " . get_pointer_to($var_name) . ", $switch_var);"); } } foreach my $l (reverse @{$e->{LEVELS}}) { if ($l->{TYPE} eq "POINTER") { if ($l->{POINTER_TYPE} ne "ref") { - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); } - pidl "ndr->depth--;"; + $self->pidl("ndr->depth--;"); } elsif (($l->{TYPE} eq "ARRAY") and not is_charset_array($e,$l) and not has_fast_array($e,$l)) { - pidl "free(idx_$l->{LEVEL_INDEX});"; - deindent; - pidl "}"; - deindent; - pidl "}"; - pidl "ndr->depth--;"; + $self->pidl("free(idx_$l->{LEVEL_INDEX});"); + $self->deindent; + $self->pidl("}"); + $self->deindent; + $self->pidl("}"); + $self->pidl("ndr->depth--;"); } } } ##################################################################### # parse scalars in a structure element - pull size -sub ParseSwitchPull($$$$$) +sub ParseSwitchPull($$$$$$) { - my($e,$l,$ndr,$var_name,$env) = @_; + my($self,$e,$l,$ndr,$var_name,$env) = @_; my $switch_var = ParseExprExt($l->{SWITCH_IS}, $env, $e->{ORIGINAL}, - check_null_pointer($e, $env, \&pidl, "return NT_STATUS_INVALID_PARAMETER_MIX;"), check_fully_dereferenced($e, $env)); + check_null_pointer($e, $env, sub { $self->pidl(shift); }, "return NT_STATUS_INVALID_PARAMETER_MIX;"), check_fully_dereferenced($e, $env)); $var_name = get_pointer_to($var_name); - pidl "NDR_CHECK(ndr_pull_set_switch_value($ndr, $var_name, $switch_var));"; + $self->pidl("NDR_CHECK(ndr_pull_set_switch_value($ndr, $var_name, $switch_var));"); } ##################################################################### # push switch element -sub ParseSwitchPush($$$$$) +sub ParseSwitchPush($$$$$$) { - my($e,$l,$ndr,$var_name,$env) = @_; + my($self,$e,$l,$ndr,$var_name,$env) = @_; my $switch_var = ParseExprExt($l->{SWITCH_IS}, $env, $e->{ORIGINAL}, - check_null_pointer($e, $env, \&pidl, "return NT_STATUS_INVALID_PARAMETER_MIX;"), check_fully_dereferenced($e, $env)); + check_null_pointer($e, $env, sub { $self->pidl(shift); }, "return NT_STATUS_INVALID_PARAMETER_MIX;"), check_fully_dereferenced($e, $env)); $var_name = get_pointer_to($var_name); - pidl "NDR_CHECK(ndr_push_set_switch_value($ndr, $var_name, $switch_var));"; + $self->pidl("NDR_CHECK(ndr_push_set_switch_value($ndr, $var_name, $switch_var));"); } -sub ParseDataPull($$$$$$) +sub ParseDataPull($$$$$$$) { - my ($e,$l,$ndr,$var_name,$primitives,$deferred) = @_; + my ($self,$e,$l,$ndr,$var_name,$primitives,$deferred) = @_; if (not ref($l->{DATA_TYPE}) or defined($l->{DATA_TYPE}->{NAME})) { @@ -905,23 +904,23 @@ sub ParseDataPull($$$$$$) $var_name = get_pointer_to($var_name); - pidl "NDR_CHECK(".TypeFunctionName("ndr_pull", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));"; + $self->pidl("NDR_CHECK(".TypeFunctionName("ndr_pull", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));"); if (my $range = has_property($e, "range")) { $var_name = get_value_of($var_name); my ($low, $high) = split(/ /, $range, 2); - pidl "if ($var_name < $low || $var_name > $high) {"; - pidl "\treturn ndr_pull_error($ndr, NDR_ERR_RANGE, \"value out of range\");"; - pidl "}"; + $self->pidl("if ($var_name < $low || $var_name > $high) {"); + $self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_RANGE, \"value out of range\");"); + $self->pidl("}"); } } else { - ParseTypePull($l->{DATA_TYPE}, $var_name, $primitives, $deferred); + $self->ParseTypePull($l->{DATA_TYPE}, $var_name, $primitives, $deferred); } } -sub ParseDataPush($$$$$$) +sub ParseDataPush($$$$$$$) { - my ($e,$l,$ndr,$var_name,$primitives,$deferred) = @_; + my ($self,$e,$l,$ndr,$var_name,$primitives,$deferred) = @_; if (not ref($l->{DATA_TYPE}) or defined($l->{DATA_TYPE}->{NAME})) { my $t; @@ -938,9 +937,9 @@ sub ParseDataPush($$$$$$) } my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred); - pidl "NDR_CHECK(ndr_push_$t($ndr, $ndr_flags, $var_name));"; + $self->pidl("NDR_CHECK(ndr_push_$t($ndr, $ndr_flags, $var_name));"); } else { - ParseTypePush($l->{DATA_TYPE}, $var_name, $primitives, $deferred); + $self->ParseTypePush($l->{DATA_TYPE}, $var_name, $primitives, $deferred); } } @@ -969,9 +968,9 @@ sub CalcNdrFlags($$$) return undef; } -sub ParseMemCtxPullStart($$$) +sub ParseMemCtxPullStart($$$$) { - my ($e, $l, $ptr_name) = @_; + my ($self, $e, $l, $ptr_name) = @_; my $mem_r_ctx = "_mem_save_$e->{NAME}_$l->{LEVEL_INDEX}"; my $mem_c_ctx = $ptr_name; @@ -991,14 +990,13 @@ sub ParseMemCtxPullStart($$$) } } - pidl "$mem_r_ctx = NDR_PULL_GET_MEM_CTX(ndr);"; - pidl "NDR_PULL_SET_MEM_CTX(ndr, $mem_c_ctx, $mem_c_flags);"; + $self->pidl("$mem_r_ctx = NDR_PULL_GET_MEM_CTX(ndr);"); + $self->pidl("NDR_PULL_SET_MEM_CTX(ndr, $mem_c_ctx, $mem_c_flags);"); } -sub ParseMemCtxPullEnd($$) +sub ParseMemCtxPullEnd($$$) { - my $e = shift; - my $l = shift; + my ($self, $e, $l) = @_; my $mem_r_ctx = "_mem_save_$e->{NAME}_$l->{LEVEL_INDEX}"; my $mem_r_flags = "0"; @@ -1017,21 +1015,21 @@ sub ParseMemCtxPullEnd($$) } } - pidl "NDR_PULL_SET_MEM_CTX(ndr, $mem_r_ctx, $mem_r_flags);"; + $self->pidl("NDR_PULL_SET_MEM_CTX(ndr, $mem_r_ctx, $mem_r_flags);"); } -sub CheckStringTerminator($$$$) +sub CheckStringTerminator($$$$$) { - my ($ndr,$e,$l,$length) = @_; + my ($self,$ndr,$e,$l,$length) = @_; my $nl = GetNextLevel($e, $l); # Make sure last element is zero! - pidl "NDR_CHECK(ndr_check_string_terminator($ndr, $length, sizeof($nl->{DATA_TYPE}_t)));"; + $self->pidl("NDR_CHECK(ndr_check_string_terminator($ndr, $length, sizeof($nl->{DATA_TYPE}_t)));"); } sub ParseElementPullLevel { - my($e,$l,$ndr,$var_name,$env,$primitives,$deferred) = @_; + my($self,$e,$l,$ndr,$var_name,$env,$primitives,$deferred) = @_; my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred); @@ -1042,62 +1040,62 @@ sub ParseElementPullLevel # Only pull something if there's actually something to be pulled if (defined($ndr_flags)) { if ($l->{TYPE} eq "SUBCONTEXT") { - my $subndr = ParseSubcontextPullStart($e, $l, $ndr, $env); - ParseElementPullLevel($e, GetNextLevel($e,$l), $subndr, $var_name, $env, 1, 1); - ParseSubcontextPullEnd($e, $l, $ndr, $env); + my $subndr = $self->ParseSubcontextPullStart($e, $l, $ndr, $env); + $self->ParseElementPullLevel($e, GetNextLevel($e,$l), $subndr, $var_name, $env, 1, 1); + $self->ParseSubcontextPullEnd($e, $l, $ndr, $env); } elsif ($l->{TYPE} eq "ARRAY") { - my $length = ParseArrayPullHeader($e, $l, $ndr, $var_name, $env); + my $length = $self->ParseArrayPullHeader($e, $l, $ndr, $var_name, $env); my $nl = GetNextLevel($e, $l); if (is_charset_array($e,$l)) { if ($l->{IS_ZERO_TERMINATED}) { - CheckStringTerminator($ndr, $e, $l, $length); + $self->CheckStringTerminator($ndr, $e, $l, $length); } - pidl "NDR_CHECK(ndr_pull_charset($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));"; + $self->pidl("NDR_CHECK(ndr_pull_charset($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));"); return; } elsif (has_fast_array($e, $l)) { if ($l->{IS_ZERO_TERMINATED}) { - CheckStringTerminator($ndr,$e,$l,$length); + $self->CheckStringTerminator($ndr,$e,$l,$length); } - pidl "NDR_CHECK(ndr_pull_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));"; + $self->pidl("NDR_CHECK(ndr_pull_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));"); return; } } elsif ($l->{TYPE} eq "POINTER") { - ParsePtrPull($e, $l, $ndr, $var_name); + $self->ParsePtrPull($e, $l, $ndr, $var_name); } elsif ($l->{TYPE} eq "SWITCH") { - ParseSwitchPull($e, $l, $ndr, $var_name, $env); + $self->ParseSwitchPull($e, $l, $ndr, $var_name, $env); } elsif ($l->{TYPE} eq "DATA") { - ParseDataPull($e, $l, $ndr, $var_name, $primitives, $deferred); + $self->ParseDataPull($e, $l, $ndr, $var_name, $primitives, $deferred); } } # add additional constructions if ($l->{TYPE} eq "POINTER" and $deferred) { if ($l->{POINTER_TYPE} ne "ref") { - pidl "if ($var_name) {"; - indent; + $self->pidl("if ($var_name) {"); + $self->indent; if ($l->{POINTER_TYPE} eq "relative") { - pidl "struct ndr_pull_save _relative_save;"; - pidl "ndr_pull_save(ndr, &_relative_save);"; - pidl "NDR_CHECK(ndr_pull_relative_ptr2(ndr, $var_name));"; + $self->pidl("struct ndr_pull_save _relative_save;"); + $self->pidl("ndr_pull_save(ndr, &_relative_save);"); + $self->pidl("NDR_CHECK(ndr_pull_relative_ptr2(ndr, $var_name));"); } } - ParseMemCtxPullStart($e, $l, $var_name); + $self->ParseMemCtxPullStart($e, $l, $var_name); $var_name = get_value_of($var_name); - ParseElementPullLevel($e, GetNextLevel($e,$l), $ndr, $var_name, $env, 1, 1); + $self->ParseElementPullLevel($e, GetNextLevel($e,$l), $ndr, $var_name, $env, 1, 1); - ParseMemCtxPullEnd($e,$l); + $self->ParseMemCtxPullEnd($e,$l); if ($l->{POINTER_TYPE} ne "ref") { if ($l->{POINTER_TYPE} eq "relative") { - pidl "ndr_pull_restore(ndr, &_relative_save);"; + $self->pidl("ndr_pull_restore(ndr, &_relative_save);"); } - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); } } elsif ($l->{TYPE} eq "ARRAY" and not has_fast_array($e,$l) and not is_charset_array($e, $l)) { @@ -1107,42 +1105,42 @@ sub ParseElementPullLevel $var_name = $var_name . "[$counter]"; - ParseMemCtxPullStart($e, $l, $array_name); + $self->ParseMemCtxPullStart($e, $l, $array_name); if (($primitives and not $l->{IS_DEFERRED}) or ($deferred and $l->{IS_DEFERRED})) { my $nl = GetNextLevel($e,$l); if ($l->{IS_ZERO_TERMINATED}) { - CheckStringTerminator($ndr,$e,$l,$length); + $self->CheckStringTerminator($ndr,$e,$l,$length); } - pidl "for ($counter = 0; $counter < $length; $counter++) {"; - indent; - ParseElementPullLevel($e, $nl, $ndr, $var_name, $env, 1, 0); - deindent; - pidl "}"; + $self->pidl("for ($counter = 0; $counter < $length; $counter++) {"); + $self->indent; + $self->ParseElementPullLevel($e, $nl, $ndr, $var_name, $env, 1, 0); + $self->deindent; + $self->pidl("}"); } if ($deferred and ContainsDeferred($e, $l)) { - pidl "for ($counter = 0; $counter < $length; $counter++) {"; - indent; - ParseElementPullLevel($e,GetNextLevel($e,$l), $ndr, $var_name, $env, 0, 1); - deindent; - pidl "}"; + $self->pidl("for ($counter = 0; $counter < $length; $counter++) {"); + $self->indent; + $self->ParseElementPullLevel($e,GetNextLevel($e,$l), $ndr, $var_name, $env, 0, 1); + $self->deindent; + $self->pidl("}"); } - ParseMemCtxPullEnd($e, $l); + $self->ParseMemCtxPullEnd($e, $l); } elsif ($l->{TYPE} eq "SWITCH") { - ParseElementPullLevel($e, GetNextLevel($e,$l), $ndr, $var_name, $env, $primitives, $deferred); + $self->ParseElementPullLevel($e, GetNextLevel($e,$l), $ndr, $var_name, $env, $primitives, $deferred); } } ##################################################################### # parse scalars in a structure element - pull size -sub ParseElementPull($$$$$) +sub ParseElementPull($$$$$$) { - my($e,$ndr,$env,$primitives,$deferred) = @_; + my($self,$e,$ndr,$env,$primitives,$deferred) = @_; my $var_name = $env->{$e->{NAME}}; my $represent_name; @@ -1151,35 +1149,35 @@ sub ParseElementPull($$$$$) return unless $primitives or ($deferred and ContainsDeferred($e, $e->{LEVELS}[0])); if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) { - pidl "{"; - indent; + $self->pidl("{"); + $self->indent; $represent_name = $var_name; $transmit_name = "_transmit_$e->{NAME}"; $var_name = $transmit_name; - pidl mapTypeName($e->{TYPE})." $var_name;"; + $self->pidl(mapTypeName($e->{TYPE})." $var_name;"); } $var_name = append_prefix($e, $var_name); - start_flags($e); + $self->start_flags($e); - ParseElementPullLevel($e,$e->{LEVELS}[0],$ndr,$var_name,$env,$primitives,$deferred); + $self->ParseElementPullLevel($e,$e->{LEVELS}[0],$ndr,$var_name,$env,$primitives,$deferred); - end_flags($e); + $self->end_flags($e); # Representation type is different from transmit_as if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) { - pidl "NDR_CHECK(ndr_$e->{TYPE}_to_$e->{REPRESENTATION_TYPE}($transmit_name, ".get_pointer_to($represent_name)."));"; - deindent; - pidl "}"; + $self->pidl("NDR_CHECK(ndr_$e->{TYPE}_to_$e->{REPRESENTATION_TYPE}($transmit_name, ".get_pointer_to($represent_name)."));"); + $self->deindent; + $self->pidl("}"); } } ##################################################################### # parse a pointer in a struct element or function -sub ParsePtrPull($$$$) +sub ParsePtrPull($$$$$) { - my($e,$l,$ndr,$var_name) = @_; + my($self, $e,$l,$ndr,$var_name) = @_; my $nl = GetNextLevel($e, $l); my $next_is_array = ($nl->{TYPE} eq "ARRAY"); @@ -1188,22 +1186,22 @@ sub ParsePtrPull($$$$) if ($l->{POINTER_TYPE} eq "ref") { if ($l->{LEVEL} eq "EMBEDDED") { - pidl "NDR_CHECK(ndr_pull_ref_ptr($ndr, &_ptr_$e->{NAME}));"; + $self->pidl("NDR_CHECK(ndr_pull_ref_ptr($ndr, &_ptr_$e->{NAME}));"); } if (!$next_is_array and !$next_is_string) { - pidl "if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {"; - pidl "\tNDR_PULL_ALLOC($ndr, $var_name);"; - pidl "}"; + $self->pidl("if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {"); + $self->pidl("\tNDR_PULL_ALLOC($ndr, $var_name);"); + $self->pidl("}"); } return; } elsif (($l->{POINTER_TYPE} eq "unique") or ($l->{POINTER_TYPE} eq "relative") or ($l->{POINTER_TYPE} eq "full")) { - pidl "NDR_CHECK(ndr_pull_generic_ptr($ndr, &_ptr_$e->{NAME}));"; - pidl "if (_ptr_$e->{NAME}) {"; - indent; + $self->pidl("NDR_CHECK(ndr_pull_generic_ptr($ndr, &_ptr_$e->{NAME}));"); + $self->pidl("if (_ptr_$e->{NAME}) {"); + $self->indent; } else { die("Unhandled pointer type $l->{POINTER_TYPE}"); } @@ -1211,28 +1209,28 @@ sub ParsePtrPull($$$$) # Don't do this for arrays, they're allocated at the actual level # of the array unless ($next_is_array or $next_is_string) { - pidl "NDR_PULL_ALLOC($ndr, $var_name);"; + $self->pidl("NDR_PULL_ALLOC($ndr, $var_name);"); } else { # FIXME: Yes, this is nasty. # We allocate an array twice # - once just to indicate that it's there, # - then the real allocation... - pidl "NDR_PULL_ALLOC($ndr, $var_name);"; + $self->pidl("NDR_PULL_ALLOC($ndr, $var_name);"); } - #pidl "memset($var_name, 0, sizeof($var_name));"; + #$self->pidl("memset($var_name, 0, sizeof($var_name));"); if ($l->{POINTER_TYPE} eq "relative") { - pidl "NDR_CHECK(ndr_pull_relative_ptr1($ndr, $var_name, _ptr_$e->{NAME}));"; + $self->pidl("NDR_CHECK(ndr_pull_relative_ptr1($ndr, $var_name, _ptr_$e->{NAME}));"); } - deindent; - pidl "} else {"; - pidl "\t$var_name = NULL;"; - pidl "}"; + $self->deindent; + $self->pidl("} else {"); + $self->pidl("\t$var_name = NULL;"); + $self->pidl("}"); } -sub ParseStructPushPrimitives($$$) +sub ParseStructPushPrimitives($$$$) { - my ($struct, $varname, $env) = @_; + my ($self, $struct, $varname, $env) = @_; # see if the structure contains a conformant array. If it # does, then it must be the last element of the structure, and @@ -1256,39 +1254,39 @@ sub ParseStructPushPrimitives($$$) $size = ParseExpr($e->{LEVELS}[0]->{SIZE_IS}, $env, $e->{ORIGINAL}); } - pidl "NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, $size));"; + $self->pidl("NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, $size));"); } else { - pidl "NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_string_array_size(ndr, $varname->$e->{NAME})));"; + $self->pidl("NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_string_array_size(ndr, $varname->$e->{NAME})));"); } } - pidl "NDR_CHECK(ndr_push_align(ndr, $struct->{ALIGN}));"; + $self->pidl("NDR_CHECK(ndr_push_align(ndr, $struct->{ALIGN}));"); if (defined($struct->{PROPERTIES}{relative_base})) { # set the current offset as base for relative pointers # and store it based on the toplevel struct/union - pidl "NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, $varname, ndr->offset));"; + $self->pidl("NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, $varname, ndr->offset));"); } - ParseElementPush($_, "ndr", $env, 1, 0) foreach (@{$struct->{ELEMENTS}}); + $self->ParseElementPush($_, "ndr", $env, 1, 0) foreach (@{$struct->{ELEMENTS}}); } sub ParseStructPushDeferred($$$) { - my ($struct, $varname, $env) = @_; + my ($self, $struct, $varname, $env) = @_; if (defined($struct->{PROPERTIES}{relative_base})) { # retrieve the current offset as base for relative pointers # based on the toplevel struct/union - pidl "NDR_CHECK(ndr_push_setup_relative_base_offset2(ndr, $varname));"; + $self->pidl("NDR_CHECK(ndr_push_setup_relative_base_offset2(ndr, $varname));"); } - ParseElementPush($_, "ndr", $env, 0, 1) foreach (@{$struct->{ELEMENTS}}); + $self->ParseElementPush($_, "ndr", $env, 0, 1) foreach (@{$struct->{ELEMENTS}}); } ##################################################################### # parse a struct -sub ParseStructPush($$) +sub ParseStructPush($$$) { - my ($struct, $varname) = @_; + my ($self, $struct, $varname) = @_; return unless defined($struct->{ELEMENTS}); @@ -1296,66 +1294,66 @@ sub ParseStructPush($$) EnvSubstituteValue($env, $struct); - DeclareArrayVariables($_) foreach (@{$struct->{ELEMENTS}}); + $self->DeclareArrayVariables($_) foreach (@{$struct->{ELEMENTS}}); - start_flags($struct); + $self->start_flags($struct); - pidl "if (ndr_flags & NDR_SCALARS) {"; - indent; - ParseStructPushPrimitives($struct, $varname, $env); - deindent; - pidl "}"; + $self->pidl("if (ndr_flags & NDR_SCALARS) {"); + $self->indent; + $self->ParseStructPushPrimitives($struct, $varname, $env); + $self->deindent; + $self->pidl("}"); - pidl "if (ndr_flags & NDR_BUFFERS) {"; - indent; - ParseStructPushDeferred($struct, $varname, $env); - deindent; - pidl "}"; + $self->pidl("if (ndr_flags & NDR_BUFFERS) {"); + $self->indent; + $self->ParseStructPushDeferred($struct, $varname, $env); + $self->deindent; + $self->pidl("}"); - end_flags($struct); + $self->end_flags($struct); } ##################################################################### # generate a push function for an enum -sub ParseEnumPush($$) +sub ParseEnumPush($$$) { - my($enum,$varname) = @_; + my($self,$enum,$varname) = @_; my($type_fn) = $enum->{BASE_TYPE}; - start_flags($enum); - pidl "NDR_CHECK(ndr_push_$type_fn(ndr, NDR_SCALARS, $varname));"; - end_flags($enum); + $self->start_flags($enum); + $self->pidl("NDR_CHECK(ndr_push_$type_fn(ndr, NDR_SCALARS, $varname));"); + $self->end_flags($enum); } ##################################################################### # generate a pull function for an enum -sub ParseEnumPull($$) +sub ParseEnumPull($$$) { - my($enum,$varname) = @_; + my($self,$enum,$varname) = @_; my($type_fn) = $enum->{BASE_TYPE}; my($type_v_decl) = mapTypeName($type_fn); - pidl "$type_v_decl v;"; - start_flags($enum); - pidl "NDR_CHECK(ndr_pull_$type_fn(ndr, NDR_SCALARS, &v));"; - pidl "*$varname = v;"; + $self->pidl("$type_v_decl v;"); + $self->start_flags($enum); + $self->pidl("NDR_CHECK(ndr_pull_$type_fn(ndr, NDR_SCALARS, &v));"); + $self->pidl("*$varname = v;"); - end_flags($enum); + $self->end_flags($enum); } ##################################################################### # generate a print function for an enum -sub ParseEnumPrint($$$) +sub ParseEnumPrint($$$$) { - my($enum,$name,$varname) = @_; + my($self,$enum,$name,$varname) = @_; - pidl "const char *val = NULL;"; - pidl ""; + $self->pidl("const char *val = NULL;"); + $self->pidl(""); - start_flags($enum); + $self->start_flags($enum); - pidl "switch ($varname) {"; - indent; + $self->pidl("switch ($varname) {"); + $self->indent; my $els = \@{$enum->{ELEMENTS}}; foreach my $i (0 .. $#{$els}) { my $e = ${$els}[$i]; @@ -1363,15 +1361,15 @@ sub ParseEnumPrint($$$) if ($e =~ /^(.*)=/) { $e = $1; } - pidl "case $e: val = \"$e\"; break;"; + $self->pidl("case $e: val = \"$e\"; break;"); } - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); - pidl "ndr_print_enum(ndr, name, \"$enum->{TYPE}\", val, $varname);"; + $self->pidl("ndr_print_enum(ndr, name, \"$enum->{TYPE}\", val, $varname);"); - end_flags($enum); + $self->end_flags($enum); } sub DeclEnum($$$$) @@ -1390,39 +1388,39 @@ $typefamily{ENUM} = { ##################################################################### # generate a push function for a bitmap -sub ParseBitmapPush($$) +sub ParseBitmapPush($$$) { - my($bitmap,$varname) = @_; + my($self,$bitmap,$varname) = @_; my($type_fn) = $bitmap->{BASE_TYPE}; - start_flags($bitmap); + $self->start_flags($bitmap); - pidl "NDR_CHECK(ndr_push_$type_fn(ndr, NDR_SCALARS, $varname));"; + $self->pidl("NDR_CHECK(ndr_push_$type_fn(ndr, NDR_SCALARS, $varname));"); - end_flags($bitmap); + $self->end_flags($bitmap); } ##################################################################### # generate a pull function for an bitmap -sub ParseBitmapPull($$) +sub ParseBitmapPull($$$) { - my($bitmap,$varname) = @_; + my($self,$bitmap,$varname) = @_; my $type_fn = $bitmap->{BASE_TYPE}; my($type_decl) = mapTypeName($bitmap->{BASE_TYPE}); - pidl "$type_decl v;"; - start_flags($bitmap); - pidl "NDR_CHECK(ndr_pull_$type_fn(ndr, NDR_SCALARS, &v));"; - pidl "*$varname = v;"; + $self->pidl("$type_decl v;"); + $self->start_flags($bitmap); + $self->pidl("NDR_CHECK(ndr_pull_$type_fn(ndr, NDR_SCALARS, &v));"); + $self->pidl("*$varname = v;"); - end_flags($bitmap); + $self->end_flags($bitmap); } ##################################################################### # generate a print function for an bitmap -sub ParseBitmapPrintElement($$$$) +sub ParseBitmapPrintElement($$$$$) { - my($e,$bitmap,$name,$varname) = @_; + my($self,$e,$bitmap,$name,$varname) = @_; my($type_decl) = mapTypeName($bitmap->{BASE_TYPE}); my($type_fn) = $bitmap->{BASE_TYPE}; my($flag); @@ -1433,28 +1431,28 @@ sub ParseBitmapPrintElement($$$$) die "Bitmap: \"$name\" invalid Flag: \"$e\""; } - pidl "ndr_print_bitmap_flag(ndr, sizeof($type_decl), \"$flag\", $flag, $varname);"; + $self->pidl("ndr_print_bitmap_flag(ndr, sizeof($type_decl), \"$flag\", $flag, $varname);"); } ##################################################################### # generate a print function for an bitmap -sub ParseBitmapPrint($$$) +sub ParseBitmapPrint($$$$) { - my($bitmap,$name,$varname) = @_; + my($self,$bitmap,$name,$varname) = @_; my($type_decl) = mapTypeName($bitmap->{TYPE}); my($type_fn) = $bitmap->{BASE_TYPE}; - start_flags($bitmap); + $self->start_flags($bitmap); - pidl "ndr_print_$type_fn(ndr, name, $varname);"; + $self->pidl("ndr_print_$type_fn(ndr, name, $varname);"); - pidl "ndr->depth++;"; + $self->pidl("ndr->depth++;"); foreach my $e (@{$bitmap->{ELEMENTS}}) { - ParseBitmapPrintElement($e, $bitmap, $name, $varname); + $self->ParseBitmapPrintElement($e, $bitmap, $name, $varname); } - pidl "ndr->depth--;"; + $self->pidl("ndr->depth--;"); - end_flags($bitmap); + $self->end_flags($bitmap); } sub DeclBitmap($$$$) @@ -1473,50 +1471,50 @@ $typefamily{BITMAP} = { ##################################################################### # generate a struct print function -sub ParseStructPrint($$$) +sub ParseStructPrint($$$$) { - my($struct,$name,$varname) = @_; + my($self,$struct,$name,$varname) = @_; return unless defined $struct->{ELEMENTS}; my $env = GenerateStructEnv($struct, $varname); - DeclareArrayVariables($_) foreach (@{$struct->{ELEMENTS}}); + $self->DeclareArrayVariables($_) foreach (@{$struct->{ELEMENTS}}); - pidl "ndr_print_struct(ndr, name, \"$name\");"; + $self->pidl("ndr_print_struct(ndr, name, \"$name\");"); - start_flags($struct); + $self->start_flags($struct); - pidl "ndr->depth++;"; + $self->pidl("ndr->depth++;"); - ParseElementPrint($_, $env->{$_->{NAME}}, $env) + $self->ParseElementPrint($_, $env->{$_->{NAME}}, $env) foreach (@{$struct->{ELEMENTS}}); - pidl "ndr->depth--;"; + $self->pidl("ndr->depth--;"); - end_flags($struct); + $self->end_flags($struct); } -sub DeclarePtrVariables($) +sub DeclarePtrVariables($$) { - my $e = shift; + my ($self,$e) = @_; foreach my $l (@{$e->{LEVELS}}) { if ($l->{TYPE} eq "POINTER" and not ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "TOP")) { - pidl "uint32_t _ptr_$e->{NAME};"; + $self->pidl("uint32_t _ptr_$e->{NAME};"); last; } } } -sub DeclareArrayVariables($) +sub DeclareArrayVariables($$) { - my $e = shift; + my ($self,$e) = @_; foreach my $l (@{$e->{LEVELS}}) { next if has_fast_array($e,$l); next if is_charset_array($e,$l); if ($l->{TYPE} eq "ARRAY") { - pidl "uint32_t cntr_$e->{NAME}_$l->{LEVEL_INDEX};"; + $self->pidl("uint32_t cntr_$e->{NAME}_$l->{LEVEL_INDEX};"); } } } @@ -1541,97 +1539,97 @@ sub need_decl_mem_ctx($$) return 0; } -sub DeclareMemCtxVariables($) +sub DeclareMemCtxVariables($$) { - my $e = shift; + my ($self,$e) = @_; foreach my $l (@{$e->{LEVELS}}) { if (need_decl_mem_ctx($e, $l)) { - pidl "TALLOC_CTX *_mem_save_$e->{NAME}_$l->{LEVEL_INDEX};"; + $self->pidl("TALLOC_CTX *_mem_save_$e->{NAME}_$l->{LEVEL_INDEX};"); } } } -sub ParseStructPullPrimitives($$$) +sub ParseStructPullPrimitives($$$$) { - my($struct,$varname,$env) = @_; + my($self,$struct,$varname,$env) = @_; if (defined $struct->{SURROUNDING_ELEMENT}) { - pidl "NDR_CHECK(ndr_pull_array_size(ndr, &$varname->$struct->{SURROUNDING_ELEMENT}->{NAME}));"; + $self->pidl("NDR_CHECK(ndr_pull_array_size(ndr, &$varname->$struct->{SURROUNDING_ELEMENT}->{NAME}));"); } - pidl "NDR_CHECK(ndr_pull_align(ndr, $struct->{ALIGN}));"; + $self->pidl("NDR_CHECK(ndr_pull_align(ndr, $struct->{ALIGN}));"); if (defined($struct->{PROPERTIES}{relative_base})) { # set the current offset as base for relative pointers # and store it based on the toplevel struct/union - pidl "NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, $varname, ndr->offset));"; + $self->pidl("NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, $varname, ndr->offset));"); } - ParseElementPull($_, "ndr", $env, 1, 0) foreach (@{$struct->{ELEMENTS}}); + $self->ParseElementPull($_, "ndr", $env, 1, 0) foreach (@{$struct->{ELEMENTS}}); - add_deferred(); + $self->add_deferred(); } -sub ParseStructPullDeferred($$$) +sub ParseStructPullDeferred($$$$) { - my ($struct,$varname,$env) = @_; + my ($self,$struct,$varname,$env) = @_; if (defined($struct->{PROPERTIES}{relative_base})) { # retrieve the current offset as base for relative pointers # based on the toplevel struct/union - pidl "NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, $varname));"; + $self->pidl("NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, $varname));"); } foreach my $e (@{$struct->{ELEMENTS}}) { - ParseElementPull($e, "ndr", $env, 0, 1); + $self->ParseElementPull($e, "ndr", $env, 0, 1); } - add_deferred(); + $self->add_deferred(); } ##################################################################### # parse a struct - pull side -sub ParseStructPull($$) +sub ParseStructPull($$$) { - my($struct,$varname) = @_; + my($self,$struct,$varname) = @_; return unless defined $struct->{ELEMENTS}; # declare any internal pointers we need foreach my $e (@{$struct->{ELEMENTS}}) { - DeclarePtrVariables($e); - DeclareArrayVariables($e); - DeclareMemCtxVariables($e); + $self->DeclarePtrVariables($e); + $self->DeclareArrayVariables($e); + $self->DeclareMemCtxVariables($e); } - start_flags($struct); + $self->start_flags($struct); my $env = GenerateStructEnv($struct, $varname); - pidl "if (ndr_flags & NDR_SCALARS) {"; - indent; - ParseStructPullPrimitives($struct,$varname,$env); - deindent; - pidl "}"; - pidl "if (ndr_flags & NDR_BUFFERS) {"; - indent; - ParseStructPullDeferred($struct,$varname,$env); - deindent; - pidl "}"; + $self->pidl("if (ndr_flags & NDR_SCALARS) {"); + $self->indent; + $self->ParseStructPullPrimitives($struct,$varname,$env); + $self->deindent; + $self->pidl("}"); + $self->pidl("if (ndr_flags & NDR_BUFFERS) {"); + $self->indent; + $self->ParseStructPullDeferred($struct,$varname,$env); + $self->deindent; + $self->pidl("}"); - end_flags($struct); + $self->end_flags($struct); } ##################################################################### # calculate size of ndr struct -sub ParseStructNdrSize($$$) +sub ParseStructNdrSize($$$$) { - my ($t, $name, $varname) = @_; + my ($self,$t, $name, $varname) = @_; my $sizevar; if (my $flags = has_property($t, "flag")) { - pidl "flags |= $flags;"; + $self->pidl("flags |= $flags;"); } - pidl "return ndr_size_struct($varname, flags, (ndr_push_flags_fn_t)ndr_push_$name);"; + $self->pidl("return ndr_size_struct($varname, flags, (ndr_push_flags_fn_t)ndr_push_$name);"); } sub DeclStruct($$$$) @@ -1659,282 +1657,282 @@ $typefamily{STRUCT} = { # calculate size of ndr struct sub ParseUnionNdrSize($$$) { - my ($t, $name, $varname) = @_; + my ($self, $t, $name, $varname) = @_; my $sizevar; if (my $flags = has_property($t, "flag")) { - pidl "flags |= $flags;"; + $self->pidl("flags |= $flags;"); } - pidl "return ndr_size_union($varname, flags, level, (ndr_push_flags_fn_t)ndr_push_$name);"; + $self->pidl("return ndr_size_union($varname, flags, level, (ndr_push_flags_fn_t)ndr_push_$name);"); } -sub ParseUnionPushPrimitives($$) +sub ParseUnionPushPrimitives($$$) { - my ($e, $varname) = @_; + my ($self, $e, $varname) = @_; my $have_default = 0; - pidl "int level = ndr_push_get_switch_value(ndr, $varname);"; + $self->pidl("int level = ndr_push_get_switch_value(ndr, $varname);"); if (defined($e->{SWITCH_TYPE})) { - pidl "NDR_CHECK(ndr_push_$e->{SWITCH_TYPE}(ndr, NDR_SCALARS, level));"; + $self->pidl("NDR_CHECK(ndr_push_$e->{SWITCH_TYPE}(ndr, NDR_SCALARS, level));"); } - pidl "switch (level) {"; - indent; + $self->pidl("switch (level) {"); + $self->indent; foreach my $el (@{$e->{ELEMENTS}}) { if ($el->{CASE} eq "default") { $have_default = 1; } - pidl "$el->{CASE}:"; + $self->pidl("$el->{CASE}:"); if ($el->{TYPE} ne "EMPTY") { - indent; + $self->indent; if (defined($e->{PROPERTIES}{relative_base})) { - pidl "NDR_CHECK(ndr_push_align(ndr, $el->{ALIGN}));"; + $self->pidl("NDR_CHECK(ndr_push_align(ndr, $el->{ALIGN}));"); # set the current offset as base for relative pointers # and store it based on the toplevel struct/union - pidl "NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, $varname, ndr->offset));"; + $self->pidl("NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, $varname, ndr->offset));"); } - DeclareArrayVariables($el); - ParseElementPush($el, "ndr", {$el->{NAME} => "$varname->$el->{NAME}"}, 1, 0); - deindent; + $self->DeclareArrayVariables($el); + $self->ParseElementPush($el, "ndr", {$el->{NAME} => "$varname->$el->{NAME}"}, 1, 0); + $self->deindent; } - pidl "break;"; - pidl ""; + $self->pidl("break;"); + $self->pidl(""); } if (! $have_default) { - pidl "default:"; - pidl "\treturn ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);"; + $self->pidl("default:"); + $self->pidl("\treturn ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);"); } - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); } -sub ParseUnionPushDeferred($$) +sub ParseUnionPushDeferred($$$) { - my ($e, $varname) = @_; + my ($self,$e,$varname) = @_; my $have_default = 0; - pidl "int level = ndr_push_get_switch_value(ndr, $varname);"; + $self->pidl("int level = ndr_push_get_switch_value(ndr, $varname);"); if (defined($e->{PROPERTIES}{relative_base})) { # retrieve the current offset as base for relative pointers # based on the toplevel struct/union - pidl "NDR_CHECK(ndr_push_setup_relative_base_offset2(ndr, $varname));"; + $self->pidl("NDR_CHECK(ndr_push_setup_relative_base_offset2(ndr, $varname));"); } - pidl "switch (level) {"; - indent; + $self->pidl("switch (level) {"); + $self->indent; foreach my $el (@{$e->{ELEMENTS}}) { if ($el->{CASE} eq "default") { $have_default = 1; } - pidl "$el->{CASE}:"; + $self->pidl("$el->{CASE}:"); if ($el->{TYPE} ne "EMPTY") { - indent; - ParseElementPush($el, "ndr", {$el->{NAME} => "$varname->$el->{NAME}"}, 0, 1); - deindent; + $self->indent; + $self->ParseElementPush($el, "ndr", {$el->{NAME} => "$varname->$el->{NAME}"}, 0, 1); + $self->deindent; } - pidl "break;"; - pidl ""; + $self->pidl("break;"); + $self->pidl(""); } if (! $have_default) { - pidl "default:"; - pidl "\treturn ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);"; + $self->pidl("default:"); + $self->pidl("\treturn ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);"); } - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); } ##################################################################### # parse a union - push side -sub ParseUnionPush($$) +sub ParseUnionPush($$$) { - my ($e,$varname) = @_; + my ($self,$e,$varname) = @_; my $have_default = 0; - start_flags($e); + $self->start_flags($e); - pidl "if (ndr_flags & NDR_SCALARS) {"; - indent; - ParseUnionPushPrimitives($e, $varname); - deindent; - pidl "}"; - pidl "if (ndr_flags & NDR_BUFFERS) {"; - indent; - ParseUnionPushDeferred($e, $varname); - deindent; - pidl "}"; - end_flags($e); + $self->pidl("if (ndr_flags & NDR_SCALARS) {"); + $self->indent; + $self->ParseUnionPushPrimitives($e, $varname); + $self->deindent; + $self->pidl("}"); + $self->pidl("if (ndr_flags & NDR_BUFFERS) {"); + $self->indent; + $self->ParseUnionPushDeferred($e, $varname); + $self->deindent; + $self->pidl("}"); + $self->end_flags($e); } ##################################################################### # print a union -sub ParseUnionPrint($$$) +sub ParseUnionPrint($$$$) { - my ($e,$name,$varname) = @_; + my ($self,$e,$name,$varname) = @_; my $have_default = 0; - pidl "int level;"; + $self->pidl("int level;"); foreach my $el (@{$e->{ELEMENTS}}) { - DeclareArrayVariables($el); + $self->DeclareArrayVariables($el); } - start_flags($e); + $self->start_flags($e); - pidl "level = ndr_print_get_switch_value(ndr, $varname);"; + $self->pidl("level = ndr_print_get_switch_value(ndr, $varname);"); - pidl "ndr_print_union(ndr, name, level, \"$name\");"; + $self->pidl("ndr_print_union(ndr, name, level, \"$name\");"); - pidl "switch (level) {"; - indent; + $self->pidl("switch (level) {"); + $self->indent; foreach my $el (@{$e->{ELEMENTS}}) { if ($el->{CASE} eq "default") { $have_default = 1; } - pidl "$el->{CASE}:"; + $self->pidl("$el->{CASE}:"); if ($el->{TYPE} ne "EMPTY") { - indent; - ParseElementPrint($el, "$varname->$el->{NAME}", {}); - deindent; + $self->indent; + $self->ParseElementPrint($el, "$varname->$el->{NAME}", {}); + $self->deindent; } - pidl "break;"; - pidl ""; + $self->pidl("break;"); + $self->pidl(""); } if (! $have_default) { - pidl "default:"; - pidl "\tndr_print_bad_level(ndr, name, level);"; + $self->pidl("default:"); + $self->pidl("\tndr_print_bad_level(ndr, name, level);"); } - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); - end_flags($e); + $self->end_flags($e); } -sub ParseUnionPullPrimitives($$$) +sub ParseUnionPullPrimitives($$$$) { - my ($e,$varname,$switch_type) = @_; + my ($self,$e,$varname,$switch_type) = @_; my $have_default = 0; if (defined($switch_type)) { - pidl "NDR_CHECK(ndr_pull_$switch_type(ndr, NDR_SCALARS, &_level));"; - pidl "if (_level != level) {"; - pidl "\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value %u for $varname\", _level);"; - pidl "}"; + $self->pidl("NDR_CHECK(ndr_pull_$switch_type(ndr, NDR_SCALARS, &_level));"); + $self->pidl("if (_level != level) {"); + $self->pidl("\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value %u for $varname\", _level);"); + $self->pidl("}"); } - pidl "switch (level) {"; - indent; + $self->pidl("switch (level) {"); + $self->indent; foreach my $el (@{$e->{ELEMENTS}}) { if ($el->{CASE} eq "default") { $have_default = 1; } - pidl "$el->{CASE}: {"; + $self->pidl("$el->{CASE}: {"); if ($el->{TYPE} ne "EMPTY") { - indent; - DeclarePtrVariables($el); - DeclareArrayVariables($el); + $self->indent; + $self->DeclarePtrVariables($el); + $self->DeclareArrayVariables($el); if (defined($e->{PROPERTIES}{relative_base})) { - pidl "NDR_CHECK(ndr_pull_align(ndr, $el->{ALIGN}));"; + $self->pidl("NDR_CHECK(ndr_pull_align(ndr, $el->{ALIGN}));"); # set the current offset as base for relative pointers # and store it based on the toplevel struct/union - pidl "NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, $varname, ndr->offset));"; + $self->pidl("NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, $varname, ndr->offset));"); } - ParseElementPull($el, "ndr", {$el->{NAME} => "$varname->$el->{NAME}"}, 1, 0); - deindent; + $self->ParseElementPull($el, "ndr", {$el->{NAME} => "$varname->$el->{NAME}"}, 1, 0); + $self->deindent; } - pidl "break; }"; - pidl ""; + $self->pidl("break; }"); + $self->pidl(""); } if (! $have_default) { - pidl "default:"; - pidl "\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);"; + $self->pidl("default:"); + $self->pidl("\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);"); } - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); } -sub ParseUnionPullDeferred($$) +sub ParseUnionPullDeferred($$$) { - my ($e,$varname) = @_; + my ($self,$e,$varname) = @_; my $have_default = 0; if (defined($e->{PROPERTIES}{relative_base})) { # retrieve the current offset as base for relative pointers # based on the toplevel struct/union - pidl "NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, $varname));"; + $self->pidl("NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, $varname));"); } - pidl "switch (level) {"; - indent; + $self->pidl("switch (level) {"); + $self->indent; foreach my $el (@{$e->{ELEMENTS}}) { if ($el->{CASE} eq "default") { $have_default = 1; } - pidl "$el->{CASE}:"; + $self->pidl("$el->{CASE}:"); if ($el->{TYPE} ne "EMPTY") { - indent; - ParseElementPull($el, "ndr", {$el->{NAME} => "$varname->$el->{NAME}"}, 0, 1); - deindent; + $self->indent; + $self->ParseElementPull($el, "ndr", {$el->{NAME} => "$varname->$el->{NAME}"}, 0, 1); + $self->deindent; } - pidl "break;"; - pidl ""; + $self->pidl("break;"); + $self->pidl(""); } if (! $have_default) { - pidl "default:"; - pidl "\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);"; + $self->pidl("default:"); + $self->pidl("\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);"); } - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); } ##################################################################### # parse a union - pull side -sub ParseUnionPull($$) +sub ParseUnionPull($$$) { - my ($e,$varname) = @_; + my ($self,$e,$varname) = @_; my $switch_type = $e->{SWITCH_TYPE}; - pidl "int level;"; + $self->pidl("int level;"); if (defined($switch_type)) { if (Parse::Pidl::Typelist::typeIs($switch_type, "ENUM")) { $switch_type = Parse::Pidl::Typelist::enum_type_fn(getType($switch_type)->{DATA}); } - pidl mapTypeName($switch_type) . " _level;"; + $self->pidl(mapTypeName($switch_type) . " _level;"); } my %double_cases = (); foreach my $el (@{$e->{ELEMENTS}}) { next if ($el->{TYPE} eq "EMPTY"); next if ($double_cases{"$el->{NAME}"}); - DeclareMemCtxVariables($el); + $self->DeclareMemCtxVariables($el); $double_cases{"$el->{NAME}"} = 1; } - start_flags($e); + $self->start_flags($e); - pidl "level = ndr_pull_get_switch_value(ndr, $varname);"; + $self->pidl("level = ndr_pull_get_switch_value(ndr, $varname);"); - pidl "if (ndr_flags & NDR_SCALARS) {"; - indent; - ParseUnionPullPrimitives($e,$varname,$switch_type); - deindent; - pidl "}"; + $self->pidl("if (ndr_flags & NDR_SCALARS) {"); + $self->indent; + $self->ParseUnionPullPrimitives($e,$varname,$switch_type); + $self->deindent; + $self->pidl("}"); - pidl "if (ndr_flags & NDR_BUFFERS) {"; - indent; - ParseUnionPullDeferred($e,$varname); - deindent; - pidl "}"; + $self->pidl("if (ndr_flags & NDR_BUFFERS) {"); + $self->indent; + $self->ParseUnionPullDeferred($e,$varname); + $self->deindent; + $self->pidl("}"); - add_deferred(); + $self->add_deferred(); - end_flags($e); + $self->end_flags($e); } sub DeclUnion($$$$) @@ -1960,38 +1958,38 @@ $typefamily{UNION} = { ##################################################################### # parse a typedef - push side -sub ParseTypedefPush($$) +sub ParseTypedefPush($$$) { - my($e,$varname) = @_; + my($self,$e,$varname) = @_; - $typefamily{$e->{DATA}->{TYPE}}->{PUSH_FN_BODY}->($e->{DATA}, $varname); + $typefamily{$e->{DATA}->{TYPE}}->{PUSH_FN_BODY}->($self, $e->{DATA}, $varname); } ##################################################################### # parse a typedef - pull side -sub ParseTypedefPull($$) +sub ParseTypedefPull($$$) { - my($e,$varname) = @_; + my($self,$e,$varname) = @_; - $typefamily{$e->{DATA}->{TYPE}}->{PULL_FN_BODY}->($e->{DATA}, $varname); + $typefamily{$e->{DATA}->{TYPE}}->{PULL_FN_BODY}->($self, $e->{DATA}, $varname); } ##################################################################### # parse a typedef - print side -sub ParseTypedefPrint($$$) +sub ParseTypedefPrint($$$$) { - my($e,$name,$varname) = @_; + my($self,$e,$name,$varname) = @_; - $typefamily{$e->{DATA}->{TYPE}}->{PRINT_FN_BODY}->($e->{DATA}, $name, $varname); + $typefamily{$e->{DATA}->{TYPE}}->{PRINT_FN_BODY}->($self, $e->{DATA}, $name, $varname); } ##################################################################### ## calculate the size of a structure -sub ParseTypedefNdrSize($$$) +sub ParseTypedefNdrSize($$$$) { - my($t,$name,$varname) = @_; + my($self,$t,$name,$varname) = @_; - $typefamily{$t->{DATA}->{TYPE}}->{SIZE_FN_BODY}->($t->{DATA}, $name, $varname); + $typefamily{$t->{DATA}->{TYPE}}->{SIZE_FN_BODY}->($self, $t->{DATA}, $name, $varname); } sub DeclTypedef($$$$) @@ -2018,88 +2016,88 @@ $typefamily{TYPEDEF} = { ##################################################################### # parse a function - print side -sub ParseFunctionPrint($) +sub ParseFunctionPrint($$) { - my($fn) = shift; + my($self, $fn) = @_; - pidl_hdr "void ndr_print_$fn->{NAME}(struct ndr_print *ndr, const char *name, int flags, const struct $fn->{NAME} *r);"; + $self->pidl_hdr("void ndr_print_$fn->{NAME}(struct ndr_print *ndr, const char *name, int flags, const struct $fn->{NAME} *r);"); return if has_property($fn, "noprint"); - pidl "_PUBLIC_ void ndr_print_$fn->{NAME}(struct ndr_print *ndr, const char *name, int flags, const struct $fn->{NAME} *r)"; - pidl "{"; - indent; + $self->pidl("_PUBLIC_ void ndr_print_$fn->{NAME}(struct ndr_print *ndr, const char *name, int flags, const struct $fn->{NAME} *r)"); + $self->pidl("{"); + $self->indent; foreach my $e (@{$fn->{ELEMENTS}}) { - DeclareArrayVariables($e); + $self->DeclareArrayVariables($e); } - pidl "ndr_print_struct(ndr, name, \"$fn->{NAME}\");"; - pidl "ndr->depth++;"; + $self->pidl("ndr_print_struct(ndr, name, \"$fn->{NAME}\");"); + $self->pidl("ndr->depth++;"); - pidl "if (flags & NDR_SET_VALUES) {"; - pidl "\tndr->flags |= LIBNDR_PRINT_SET_VALUES;"; - pidl "}"; + $self->pidl("if (flags & NDR_SET_VALUES) {"); + $self->pidl("\tndr->flags |= LIBNDR_PRINT_SET_VALUES;"); + $self->pidl("}"); - pidl "if (flags & NDR_IN) {"; - indent; - pidl "ndr_print_struct(ndr, \"in\", \"$fn->{NAME}\");"; - pidl "ndr->depth++;"; + $self->pidl("if (flags & NDR_IN) {"); + $self->indent; + $self->pidl("ndr_print_struct(ndr, \"in\", \"$fn->{NAME}\");"); + $self->pidl("ndr->depth++;"); my $env = GenerateFunctionInEnv($fn); foreach my $e (@{$fn->{ELEMENTS}}) { if (grep(/in/,@{$e->{DIRECTION}})) { - ParseElementPrint($e, $env->{$e->{NAME}}, $env); + $self->ParseElementPrint($e, $env->{$e->{NAME}}, $env); } } - pidl "ndr->depth--;"; - deindent; - pidl "}"; + $self->pidl("ndr->depth--;"); + $self->deindent; + $self->pidl("}"); - pidl "if (flags & NDR_OUT) {"; - indent; - pidl "ndr_print_struct(ndr, \"out\", \"$fn->{NAME}\");"; - pidl "ndr->depth++;"; + $self->pidl("if (flags & NDR_OUT) {"); + $self->indent; + $self->pidl("ndr_print_struct(ndr, \"out\", \"$fn->{NAME}\");"); + $self->pidl("ndr->depth++;"); $env = GenerateFunctionOutEnv($fn); foreach my $e (@{$fn->{ELEMENTS}}) { if (grep(/out/,@{$e->{DIRECTION}})) { - ParseElementPrint($e, $env->{$e->{NAME}}, $env); + $self->ParseElementPrint($e, $env->{$e->{NAME}}, $env); } } if ($fn->{RETURN_TYPE}) { - pidl "ndr_print_$fn->{RETURN_TYPE}(ndr, \"result\", r->out.result);"; + $self->pidl("ndr_print_$fn->{RETURN_TYPE}(ndr, \"result\", r->out.result);"); } - pidl "ndr->depth--;"; - deindent; - pidl "}"; + $self->pidl("ndr->depth--;"); + $self->deindent; + $self->pidl("}"); - pidl "ndr->depth--;"; - deindent; - pidl "}"; - pidl ""; + $self->pidl("ndr->depth--;"); + $self->deindent; + $self->pidl("}"); + $self->pidl(""); } ##################################################################### # parse a function -sub ParseFunctionPush($) +sub ParseFunctionPush($$) { - my($fn) = shift; + my($self, $fn) = @_; - fn_declare("push", $fn, "NTSTATUS ndr_push_$fn->{NAME}(struct ndr_push *ndr, int flags, const struct $fn->{NAME} *r)") or return; + $self->fn_declare("push", $fn, "NTSTATUS ndr_push_$fn->{NAME}(struct ndr_push *ndr, int flags, const struct $fn->{NAME} *r)") or return; return if has_property($fn, "nopush"); - pidl "{"; - indent; + $self->pidl("{"); + $self->indent; foreach my $e (@{$fn->{ELEMENTS}}) { - DeclareArrayVariables($e); + $self->DeclareArrayVariables($e); } - pidl "if (flags & NDR_IN) {"; - indent; + $self->pidl("if (flags & NDR_IN) {"); + $self->indent; my $env = GenerateFunctionInEnv($fn); @@ -2107,38 +2105,38 @@ sub ParseFunctionPush($) foreach my $e (@{$fn->{ELEMENTS}}) { if (grep(/in/,@{$e->{DIRECTION}})) { - ParseElementPush($e, "ndr", $env, 1, 1); + $self->ParseElementPush($e, "ndr", $env, 1, 1); } } - deindent; - pidl "}"; + $self->deindent; + $self->pidl("}"); - pidl "if (flags & NDR_OUT) {"; - indent; + $self->pidl("if (flags & NDR_OUT) {"); + $self->indent; $env = GenerateFunctionOutEnv($fn); foreach my $e (@{$fn->{ELEMENTS}}) { if (grep(/out/,@{$e->{DIRECTION}})) { - ParseElementPush($e, "ndr", $env, 1, 1); + $self->ParseElementPush($e, "ndr", $env, 1, 1); } } if ($fn->{RETURN_TYPE}) { - pidl "NDR_CHECK(ndr_push_$fn->{RETURN_TYPE}(ndr, NDR_SCALARS, r->out.result));"; + $self->pidl("NDR_CHECK(ndr_push_$fn->{RETURN_TYPE}(ndr, NDR_SCALARS, r->out.result));"); } - deindent; - pidl "}"; - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}"; - pidl ""; + $self->deindent; + $self->pidl("}"); + $self->pidl("return NT_STATUS_OK;"); + $self->deindent; + $self->pidl("}"); + $self->pidl(""); } -sub AllocateArrayLevel($$$$$) +sub AllocateArrayLevel($$$$$$) { - my ($e,$l,$ndr,$env,$size) = @_; + my ($self,$e,$l,$ndr,$env,$size) = @_; my $var = ParseExpr($e->{NAME}, $env, $e->{ORIGINAL}); @@ -2147,47 +2145,47 @@ sub AllocateArrayLevel($$$$$) $pl->{TYPE} eq "POINTER" and $pl->{POINTER_TYPE} eq "ref" and not $l->{IS_ZERO_TERMINATED}) { - pidl "if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {"; - pidl "\tNDR_PULL_ALLOC_N($ndr, $var, $size);"; - pidl "}"; + $self->pidl("if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {"); + $self->pidl("\tNDR_PULL_ALLOC_N($ndr, $var, $size);"); + $self->pidl("}"); if (grep(/in/,@{$e->{DIRECTION}}) and grep(/out/,@{$e->{DIRECTION}})) { - pidl "memcpy(r->out.$e->{NAME}, r->in.$e->{NAME}, $size * sizeof(*r->in.$e->{NAME}));"; + $self->pidl("memcpy(r->out.$e->{NAME}, r->in.$e->{NAME}, $size * sizeof(*r->in.$e->{NAME}));"); } return; } - pidl "NDR_PULL_ALLOC_N($ndr, $var, $size);"; + $self->pidl("NDR_PULL_ALLOC_N($ndr, $var, $size);"); } ##################################################################### # parse a function -sub ParseFunctionPull($) +sub ParseFunctionPull($$) { - my($fn) = shift; + my($self,$fn) = @_; # pull function args - fn_declare("pull", $fn, "NTSTATUS ndr_pull_$fn->{NAME}(struct ndr_pull *ndr, int flags, struct $fn->{NAME} *r)") or return; + $self->fn_declare("pull", $fn, "NTSTATUS ndr_pull_$fn->{NAME}(struct ndr_pull *ndr, int flags, struct $fn->{NAME} *r)") or return; - pidl "{"; - indent; + $self->pidl("{"); + $self->indent; # declare any internal pointers we need foreach my $e (@{$fn->{ELEMENTS}}) { - DeclarePtrVariables($e); - DeclareArrayVariables($e); + $self->DeclarePtrVariables($e); + $self->DeclareArrayVariables($e); } my %double_cases = (); foreach my $e (@{$fn->{ELEMENTS}}) { next if ($e->{TYPE} eq "EMPTY"); next if ($double_cases{"$e->{NAME}"}); - DeclareMemCtxVariables($e); + $self->DeclareMemCtxVariables($e); $double_cases{"$e->{NAME}"} = 1; } - pidl "if (flags & NDR_IN) {"; - indent; + $self->pidl("if (flags & NDR_IN) {"); + $self->indent; # auto-init the out section of a structure. I originally argued that # this was a bad idea as it hides bugs, but coping correctly @@ -2195,8 +2193,8 @@ sub ParseFunctionPull($) # out to be too tricky (tridge) foreach my $e (@{$fn->{ELEMENTS}}) { next unless grep(/out/, @{$e->{DIRECTION}}); - pidl "ZERO_STRUCT(r->out);"; - pidl ""; + $self->pidl("ZERO_STRUCT(r->out);"); + $self->pidl(""); last; } @@ -2204,7 +2202,7 @@ sub ParseFunctionPull($) foreach my $e (@{$fn->{ELEMENTS}}) { next unless (grep(/in/, @{$e->{DIRECTION}})); - ParseElementPull($e, "ndr", $env, 1, 1); + $self->ParseElementPull($e, "ndr", $env, 1, 1); } # allocate the "simple" out ref variables. FIXME: Shouldn't this have it's @@ -2220,96 +2218,96 @@ sub ParseFunctionPull($) and $e->{LEVELS}[1]->{IS_ZERO_TERMINATED}); if ($e->{LEVELS}[1]->{TYPE} eq "ARRAY") { - my $size = ParseExprExt($e->{LEVELS}[1]->{SIZE_IS}, $env, $e->{ORIGINAL}, check_null_pointer($e, $env, \&pidl, "return NT_STATUS_INVALID_PARAMETER_MIX;"), + my $size = ParseExprExt($e->{LEVELS}[1]->{SIZE_IS}, $env, $e->{ORIGINAL}, check_null_pointer($e, $env, sub { $self->pidl(shift); }, "return NT_STATUS_INVALID_PARAMETER_MIX;"), check_fully_dereferenced($e, $env)); - pidl "NDR_PULL_ALLOC_N(ndr, r->out.$e->{NAME}, $size);"; + $self->pidl("NDR_PULL_ALLOC_N(ndr, r->out.$e->{NAME}, $size);"); if (grep(/in/, @{$e->{DIRECTION}})) { - pidl "memcpy(r->out.$e->{NAME}, r->in.$e->{NAME}, $size * sizeof(*r->in.$e->{NAME}));"; + $self->pidl("memcpy(r->out.$e->{NAME}, r->in.$e->{NAME}, $size * sizeof(*r->in.$e->{NAME}));"); } else { - pidl "memset(r->out.$e->{NAME}, 0, $size * sizeof(*r->out.$e->{NAME}));"; + $self->pidl("memset(r->out.$e->{NAME}, 0, $size * sizeof(*r->out.$e->{NAME}));"); } } else { - pidl "NDR_PULL_ALLOC(ndr, r->out.$e->{NAME});"; + $self->pidl("NDR_PULL_ALLOC(ndr, r->out.$e->{NAME});"); if (grep(/in/, @{$e->{DIRECTION}})) { - pidl "*r->out.$e->{NAME} = *r->in.$e->{NAME};"; + $self->pidl("*r->out.$e->{NAME} = *r->in.$e->{NAME};"); } else { - pidl "ZERO_STRUCTP(r->out.$e->{NAME});"; + $self->pidl("ZERO_STRUCTP(r->out.$e->{NAME});"); } } } - add_deferred(); - deindent; - pidl "}"; + $self->add_deferred(); + $self->deindent; + $self->pidl("}"); - pidl "if (flags & NDR_OUT) {"; - indent; + $self->pidl("if (flags & NDR_OUT) {"); + $self->indent; $env = GenerateFunctionOutEnv($fn); foreach my $e (@{$fn->{ELEMENTS}}) { next unless grep(/out/, @{$e->{DIRECTION}}); - ParseElementPull($e, "ndr", $env, 1, 1); + $self->ParseElementPull($e, "ndr", $env, 1, 1); } if ($fn->{RETURN_TYPE}) { - pidl "NDR_CHECK(ndr_pull_$fn->{RETURN_TYPE}(ndr, NDR_SCALARS, &r->out.result));"; + $self->pidl("NDR_CHECK(ndr_pull_$fn->{RETURN_TYPE}(ndr, NDR_SCALARS, &r->out.result));"); } - add_deferred(); - deindent; - pidl "}"; + $self->add_deferred(); + $self->deindent; + $self->pidl("}"); - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}"; - pidl ""; + $self->pidl("return NT_STATUS_OK;"); + $self->deindent; + $self->pidl("}"); + $self->pidl(""); } ##################################################################### # produce a function call table -sub FunctionTable($) +sub FunctionTable($$) { - my($interface) = shift; + my($self,$interface) = @_; my $count = 0; my $uname = uc $interface->{NAME}; return if ($#{$interface->{FUNCTIONS}}+1 == 0); return unless defined ($interface->{PROPERTIES}->{uuid}); - pidl "static const struct dcerpc_interface_call $interface->{NAME}\_calls[] = {"; + $self->pidl("static const struct dcerpc_interface_call $interface->{NAME}\_calls[] = {"); foreach my $d (@{$interface->{FUNCTIONS}}) { next if not defined($d->{OPNUM}); - pidl "\t{"; - pidl "\t\t\"$d->{NAME}\","; - pidl "\t\tsizeof(struct $d->{NAME}),"; - pidl "\t\t(ndr_push_flags_fn_t) ndr_push_$d->{NAME},"; - pidl "\t\t(ndr_pull_flags_fn_t) ndr_pull_$d->{NAME},"; - pidl "\t\t(ndr_print_function_t) ndr_print_$d->{NAME},"; - pidl "\t\t".($d->{ASYNC}?"True":"False").","; - pidl "\t},"; + $self->pidl("\t{"); + $self->pidl("\t\t\"$d->{NAME}\","); + $self->pidl("\t\tsizeof(struct $d->{NAME}),"); + $self->pidl("\t\t(ndr_push_flags_fn_t) ndr_push_$d->{NAME},"); + $self->pidl("\t\t(ndr_pull_flags_fn_t) ndr_pull_$d->{NAME},"); + $self->pidl("\t\t(ndr_print_function_t) ndr_print_$d->{NAME},"); + $self->pidl("\t\t".($d->{ASYNC}?"True":"False").","); + $self->pidl("\t},"); $count++; } - pidl "\t{ NULL, 0, NULL, NULL, NULL, False }"; - pidl "};"; - pidl ""; + $self->pidl("\t{ NULL, 0, NULL, NULL, NULL, False }"); + $self->pidl("};"); + $self->pidl(""); - pidl "static const char * const $interface->{NAME}\_endpoint_strings[] = {"; + $self->pidl("static const char * const $interface->{NAME}\_endpoint_strings[] = {"); foreach my $ep (@{$interface->{ENDPOINTS}}) { - pidl "\t$ep, "; + $self->pidl("\t$ep, "); } my $endpoint_count = $#{$interface->{ENDPOINTS}}+1; - pidl "};"; - pidl ""; + $self->pidl("};"); + $self->pidl(""); - pidl "static const struct dcerpc_endpoint_list $interface->{NAME}\_endpoints = {"; - pidl "\t.count\t= $endpoint_count,"; - pidl "\t.names\t= $interface->{NAME}\_endpoint_strings"; - pidl "};"; - pidl ""; + $self->pidl("static const struct dcerpc_endpoint_list $interface->{NAME}\_endpoints = {"); + $self->pidl("\t.count\t= $endpoint_count,"); + $self->pidl("\t.names\t= $interface->{NAME}\_endpoint_strings"); + $self->pidl("};"); + $self->pidl(""); if (! defined $interface->{PROPERTIES}->{authservice}) { $interface->{PROPERTIES}->{authservice} = "\"host\""; @@ -2318,32 +2316,32 @@ sub FunctionTable($) my @a = split / /, $interface->{PROPERTIES}->{authservice}; my $authservice_count = $#a + 1; - pidl "static const char * const $interface->{NAME}\_authservice_strings[] = {"; + $self->pidl("static const char * const $interface->{NAME}\_authservice_strings[] = {"); foreach my $ap (@a) { - pidl "\t$ap, "; + $self->pidl("\t$ap, "); } - pidl "};"; - pidl ""; + $self->pidl("};"); + $self->pidl(""); - pidl "static const struct dcerpc_authservice_list $interface->{NAME}\_authservices = {"; - pidl "\t.count\t= $endpoint_count,"; - pidl "\t.names\t= $interface->{NAME}\_authservice_strings"; - pidl "};"; - pidl ""; + $self->pidl("static const struct dcerpc_authservice_list $interface->{NAME}\_authservices = {"); + $self->pidl("\t.count\t= $endpoint_count,"); + $self->pidl("\t.names\t= $interface->{NAME}\_authservice_strings"); + $self->pidl("};"); + $self->pidl(""); - pidl "\nconst struct dcerpc_interface_table dcerpc_table_$interface->{NAME} = {"; - pidl "\t.name\t\t= \"$interface->{NAME}\","; - pidl "\t.syntax_id\t= {"; - pidl "\t\t" . print_uuid($interface->{UUID}) .","; - pidl "\t\tDCERPC_$uname\_VERSION"; - pidl "\t},"; - pidl "\t.helpstring\t= DCERPC_$uname\_HELPSTRING,"; - pidl "\t.num_calls\t= $count,"; - pidl "\t.calls\t\t= $interface->{NAME}\_calls,"; - pidl "\t.endpoints\t= &$interface->{NAME}\_endpoints,"; - pidl "\t.authservices\t= &$interface->{NAME}\_authservices"; - pidl "};"; - pidl ""; + $self->pidl("\nconst struct dcerpc_interface_table dcerpc_table_$interface->{NAME} = {"); + $self->pidl("\t.name\t\t= \"$interface->{NAME}\","); + $self->pidl("\t.syntax_id\t= {"); + $self->pidl("\t\t" . print_uuid($interface->{UUID}) .","); + $self->pidl("\t\tDCERPC_$uname\_VERSION"); + $self->pidl("\t},"); + $self->pidl("\t.helpstring\t= DCERPC_$uname\_HELPSTRING,"); + $self->pidl("\t.num_calls\t= $count,"); + $self->pidl("\t.calls\t\t= $interface->{NAME}\_calls,"); + $self->pidl("\t.endpoints\t= &$interface->{NAME}\_endpoints,"); + $self->pidl("\t.authservices\t= &$interface->{NAME}\_authservices"); + $self->pidl("};"); + $self->pidl(""); } @@ -2351,11 +2349,12 @@ sub FunctionTable($) # generate include statements for imported idl files sub HeaderImport { + my $self = shift; my @imports = @_; foreach (@imports) { s/\.idl\"$//; s/^\"//; - pidl choose_header("librpc/gen_ndr/ndr_$_\.h", "gen_ndr/ndr_$_.h"); + $self->pidl(choose_header("librpc/gen_ndr/ndr_$_\.h", "gen_ndr/ndr_$_.h")); } } @@ -2363,9 +2362,10 @@ sub HeaderImport # generate include statements for included header files sub HeaderInclude { + my $self = shift; my @includes = @_; foreach (@includes) { - pidl_hdr "#include $_"; + $self->pidl_hdr("#include $_"); } } @@ -2373,37 +2373,37 @@ sub HeaderInclude # generate prototypes and defines for the interface definitions # FIXME: these prototypes are for the DCE/RPC client functions, not the # NDR parser and so do not belong here, technically speaking -sub HeaderInterface($) +sub HeaderInterface($$) { - my($interface) = shift; + my($self,$interface) = @_; my $count = 0; - pidl_hdr choose_header("librpc/ndr/libndr.h", "ndr.h"); + $self->pidl_hdr(choose_header("librpc/ndr/libndr.h", "ndr.h")); if (has_property($interface, "object")) { - pidl choose_header("librpc/gen_ndr/ndr_orpc.h", "ndr/orpc.h"); + $self->pidl(choose_header("librpc/gen_ndr/ndr_orpc.h", "ndr/orpc.h")); } if (defined $interface->{PROPERTIES}->{helper}) { - HeaderInclude(split / /, $interface->{PROPERTIES}->{helper}); + $self->HeaderInclude(split / /, $interface->{PROPERTIES}->{helper}); } if (defined $interface->{PROPERTIES}->{uuid}) { my $name = uc $interface->{NAME}; - pidl_hdr "#define DCERPC_$name\_UUID " . - Parse::Pidl::Util::make_str(lc($interface->{PROPERTIES}->{uuid})); + $self->pidl_hdr("#define DCERPC_$name\_UUID " . + Parse::Pidl::Util::make_str(lc($interface->{PROPERTIES}->{uuid}))); if(!defined $interface->{PROPERTIES}->{version}) { $interface->{PROPERTIES}->{version} = "0.0"; } - pidl_hdr "#define DCERPC_$name\_VERSION $interface->{PROPERTIES}->{version}"; + $self->pidl_hdr("#define DCERPC_$name\_VERSION $interface->{PROPERTIES}->{version}"); - pidl_hdr "#define DCERPC_$name\_NAME \"$interface->{NAME}\""; + $self->pidl_hdr("#define DCERPC_$name\_NAME \"$interface->{NAME}\""); if(!defined $interface->{PROPERTIES}->{helpstring}) { $interface->{PROPERTIES}->{helpstring} = "NULL"; } - pidl_hdr "#define DCERPC_$name\_HELPSTRING $interface->{PROPERTIES}->{helpstring}"; + $self->pidl_hdr("#define DCERPC_$name\_HELPSTRING $interface->{PROPERTIES}->{helpstring}"); - pidl_hdr "extern const struct dcerpc_interface_table dcerpc_table_$interface->{NAME};"; - pidl_hdr "NTSTATUS dcerpc_server_$interface->{NAME}_init(void);"; + $self->pidl_hdr("extern const struct dcerpc_interface_table dcerpc_table_$interface->{NAME};"); + $self->pidl_hdr("NTSTATUS dcerpc_server_$interface->{NAME}_init(void);"); } foreach (@{$interface->{FUNCTIONS}}) { @@ -2416,9 +2416,9 @@ sub HeaderInterface($) $val .= " + DCERPC_" . uc $interface->{BASE} . "_CALL_COUNT"; } - pidl_hdr "#define DCERPC_$u_name ($val)"; + $self->pidl_hdr("#define DCERPC_$u_name ($val)"); - pidl_hdr ""; + $self->pidl_hdr(""); $count++; } @@ -2428,198 +2428,195 @@ sub HeaderInterface($) $val .= " + DCERPC_" . uc $interface->{BASE} . "_CALL_COUNT"; } - pidl_hdr "#define DCERPC_" . uc $interface->{NAME} . "_CALL_COUNT ($val)"; + $self->pidl_hdr("#define DCERPC_" . uc $interface->{NAME} . "_CALL_COUNT ($val)"); } -sub ParseTypePush($$$$) +sub ParseTypePush($$$$$) { - my ($e, $varname, $primitives, $deferred) = @_; + my ($self,$e,$varname, $primitives, $deferred) = @_; # save the old relative_base_offset - pidl "uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);" if defined(has_property($e, "relative_base")); - $typefamily{$e->{TYPE}}->{PUSH_FN_BODY}->($e, $varname); + $self->pidl("uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);") if defined(has_property($e, "relative_base")); + $typefamily{$e->{TYPE}}->{PUSH_FN_BODY}->($self, $e, $varname); # restore the old relative_base_offset - pidl "ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);" if defined(has_property($e, "relative_base")); + $self->pidl("ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);") if defined(has_property($e, "relative_base")); } -sub ParseTypePushFunction($$) +sub ParseTypePushFunction($$$) { - my ($e, $varname) = @_; + my ($self, $e, $varname) = @_; my $args = $typefamily{$e->{TYPE}}->{DECL}->($e, "push", $e->{NAME}, $varname); - fn_declare("push", $e, "NTSTATUS ".TypeFunctionName("ndr_push", $e)."(struct ndr_push *ndr, int ndr_flags, $args)") or return; + $self->fn_declare("push", $e, "NTSTATUS ".TypeFunctionName("ndr_push", $e)."(struct ndr_push *ndr, int ndr_flags, $args)") or return; - pidl "{"; - indent; - ParseTypePush($e, $varname, 1, 1); - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}"; - pidl "";; + $self->pidl("{"); + $self->indent; + $self->ParseTypePush($e, $varname, 1, 1); + $self->pidl("return NT_STATUS_OK;"); + $self->deindent; + $self->pidl("}"); + $self->pidl("");; } -sub ParseTypePull($$$$) +sub ParseTypePull($$$$$) { - my ($e, $varname, $primitives, $deferred) = @_; + my ($self, $e, $varname, $primitives, $deferred) = @_; # save the old relative_base_offset - pidl "uint32_t _save_relative_base_offset = ndr_pull_get_relative_base_offset(ndr);" if defined(has_property($e, "relative_base")); - $typefamily{$e->{TYPE}}->{PULL_FN_BODY}->($e, $varname); + $self->pidl("uint32_t _save_relative_base_offset = ndr_pull_get_relative_base_offset(ndr);") if defined(has_property($e, "relative_base")); + $typefamily{$e->{TYPE}}->{PULL_FN_BODY}->($self, $e, $varname); # restore the old relative_base_offset - pidl "ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);" if defined(has_property($e, "relative_base")); + $self->pidl("ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);") if defined(has_property($e, "relative_base")); } sub ParseTypePullFunction($$) { - my ($e, $varname) = @_; + my ($self, $e, $varname) = @_; my $args = $typefamily{$e->{TYPE}}->{DECL}->($e, "pull", $e->{NAME}, $varname); - fn_declare("pull", $e, "NTSTATUS ".TypeFunctionName("ndr_pull", $e)."(struct ndr_pull *ndr, int ndr_flags, $args)") or return; + $self->fn_declare("pull", $e, "NTSTATUS ".TypeFunctionName("ndr_pull", $e)."(struct ndr_pull *ndr, int ndr_flags, $args)") or return; - pidl "{"; - indent; - ParseTypePull($e, $varname, 1, 1); - pidl "return NT_STATUS_OK;"; - deindent; - pidl "}"; - pidl ""; + $self->pidl("{"); + $self->indent; + $self->ParseTypePull($e, $varname, 1, 1); + $self->pidl("return NT_STATUS_OK;"); + $self->deindent; + $self->pidl("}"); + $self->pidl(""); } -sub ParseTypePrint($$) +sub ParseTypePrint($$$) { - my ($e, $varname) = @_; + my ($self, $e, $varname) = @_; - $typefamily{$e->{TYPE}}->{PRINT_FN_BODY}->($e, $e->{NAME}, $varname); + $typefamily{$e->{TYPE}}->{PRINT_FN_BODY}->($self, $e, $e->{NAME}, $varname); } -sub ParseTypePrintFunction($$) +sub ParseTypePrintFunction($$$) { - my ($e, $varname) = @_; + my ($self, $e, $varname) = @_; my $args = $typefamily{$e->{TYPE}}->{DECL}->($e, "print", $e->{NAME}, $varname); - pidl_hdr "void ".TypeFunctionName("ndr_print", $e)."(struct ndr_print *ndr, const char *name, $args);"; + $self->pidl_hdr("void ".TypeFunctionName("ndr_print", $e)."(struct ndr_print *ndr, const char *name, $args);"); return if (has_property($e, "noprint")); - pidl "_PUBLIC_ void ".TypeFunctionName("ndr_print", $e)."(struct ndr_print *ndr, const char *name, $args)"; - pidl "{"; - indent; - ParseTypePrint($e, $varname); - deindent; - pidl "}"; - pidl ""; + $self->pidl("_PUBLIC_ void ".TypeFunctionName("ndr_print", $e)."(struct ndr_print *ndr, const char *name, $args)"); + $self->pidl("{"); + $self->indent; + $self->ParseTypePrint($e, $varname); + $self->deindent; + $self->pidl("}"); + $self->pidl(""); } -sub ParseTypeNdrSize($) +sub ParseTypeNdrSize($$) { - my ($t) = @_; + my ($self,$t) = @_; my $varname = "r"; my $tf = $typefamily{$t->{TYPE}}; my $args = $tf->{SIZE_FN_ARGS}->($t, $t->{NAME}, $varname); - fn_declare("size", $t, "size_t ndr_size_$t->{NAME}($args)") or return; + $self->fn_declare("size", $t, "size_t ndr_size_$t->{NAME}($args)") or return; - pidl "{"; - indent; - $typefamily{$t->{TYPE}}->{SIZE_FN_BODY}->($t, $t->{NAME}, $varname); - deindent; - pidl "}"; - pidl ""; + $self->pidl("{"); + $self->indent; + $typefamily{$t->{TYPE}}->{SIZE_FN_BODY}->($self,$t, $t->{NAME}, $varname); + $self->deindent; + $self->pidl("}"); + $self->pidl(""); } ##################################################################### # parse the interface definitions -sub ParseInterface($$) +sub ParseInterface($$$) { - my($interface,$needed) = @_; + my($self,$interface,$needed) = @_; - pidl_hdr "#ifndef _HEADER_NDR_$interface->{NAME}"; - pidl_hdr "#define _HEADER_NDR_$interface->{NAME}"; + $self->pidl_hdr("#ifndef _HEADER_NDR_$interface->{NAME}"); + $self->pidl_hdr("#define _HEADER_NDR_$interface->{NAME}"); - pidl_hdr ""; + $self->pidl_hdr(""); if ($needed->{"compression"}) { - pidl choose_header("librpc/ndr/ndr_compression.h", "ndr/compression.h"); + $self->pidl(choose_header("librpc/ndr/ndr_compression.h", "ndr/compression.h")); } - HeaderInterface($interface); + $self->HeaderInterface($interface); # Typedefs foreach my $d (@{$interface->{TYPES}}) { - ($needed->{TypeFunctionName("ndr_push", $d)}) && ParseTypePushFunction($d, "r"); - ($needed->{TypeFunctionName("ndr_pull", $d)}) && ParseTypePullFunction($d, "r"); - ($needed->{TypeFunctionName("ndr_print", $d)}) && ParseTypePrintFunction($d, "r"); + ($needed->{TypeFunctionName("ndr_push", $d)}) && $self->ParseTypePushFunction($d, "r"); + ($needed->{TypeFunctionName("ndr_pull", $d)}) && $self->ParseTypePullFunction($d, "r"); + ($needed->{TypeFunctionName("ndr_print", $d)}) && $self->ParseTypePrintFunction($d, "r"); # Make sure we don't generate a function twice... $needed->{TypeFunctionName("ndr_push", $d)} = $needed->{TypeFunctionName("ndr_pull", $d)} = $needed->{TypeFunctionName("ndr_print", $d)} = 0; - ($needed->{"ndr_size_$d->{NAME}"}) && ParseTypeNdrSize($d); + ($needed->{"ndr_size_$d->{NAME}"}) && $self->ParseTypeNdrSize($d); } # Functions foreach my $d (@{$interface->{FUNCTIONS}}) { - ($needed->{"ndr_push_$d->{NAME}"}) && ParseFunctionPush($d); - ($needed->{"ndr_pull_$d->{NAME}"}) && ParseFunctionPull($d); - ($needed->{"ndr_print_$d->{NAME}"}) && ParseFunctionPrint($d); + ($needed->{"ndr_push_$d->{NAME}"}) && $self->ParseFunctionPush($d); + ($needed->{"ndr_pull_$d->{NAME}"}) && $self->ParseFunctionPull($d); + ($needed->{"ndr_print_$d->{NAME}"}) && $self->ParseFunctionPrint($d); # Make sure we don't generate a function twice... $needed->{"ndr_push_$d->{NAME}"} = $needed->{"ndr_pull_$d->{NAME}"} = $needed->{"ndr_print_$d->{NAME}"} = 0; } - FunctionTable($interface); + $self->FunctionTable($interface); - pidl_hdr "#endif /* _HEADER_NDR_$interface->{NAME} */"; + $self->pidl_hdr("#endif /* _HEADER_NDR_$interface->{NAME} */"); } -sub GenerateIncludes() +sub GenerateIncludes($) { + my ($self) = @_; if (is_intree()) { - pidl "#include \"includes.h\""; + $self->pidl("#include \"includes.h\""); } else { - pidl "#define _GNU_SOURCE"; - pidl "#include <stdint.h>"; - pidl "#include <stdlib.h>"; - pidl "#include <stdio.h>"; - pidl "#include <stdbool.h>"; - pidl "#include <stdarg.h>"; - pidl "#include <string.h>"; + $self->pidl("#define _GNU_SOURCE"); + $self->pidl("#include <stdint.h>"); + $self->pidl("#include <stdlib.h>"); + $self->pidl("#include <stdio.h>"); + $self->pidl("#include <stdbool.h>"); + $self->pidl("#include <stdarg.h>"); + $self->pidl("#include <string.h>"); } # Samba3 has everything in include/includes.h if (is_intree() != 3) { - pidl choose_header("libcli/util/nterr.h", "core/nterr.h"); - pidl choose_header("librpc/gen_ndr/ndr_misc.h", "gen_ndr/ndr_misc.h"); - pidl choose_header("librpc/gen_ndr/ndr_dcerpc.h", "gen_ndr/ndr_dcerpc.h"); - pidl choose_header("librpc/rpc/dcerpc.h", "dcerpc.h"); #FIXME: This shouldn't be here! + $self->pidl(choose_header("libcli/util/nterr.h", "core/nterr.h")); + $self->pidl(choose_header("librpc/gen_ndr/ndr_misc.h", "gen_ndr/ndr_misc.h")); + $self->pidl(choose_header("librpc/gen_ndr/ndr_dcerpc.h", "gen_ndr/ndr_dcerpc.h")); + $self->pidl(choose_header("librpc/rpc/dcerpc.h", "dcerpc.h")); #FIXME: This shouldn't be here! } } ##################################################################### # parse a parsed IDL structure back into an IDL file -sub Parse($$$) +sub Parse($$$$) { - my($ndr,$gen_header,$ndr_header) = @_; - - $tabs = ""; - $res = ""; + my($self, $ndr,$gen_header,$ndr_header) = @_; - $res_hdr = ""; - pidl_hdr "/* header auto-generated by pidl */"; - pidl_hdr ""; - pidl_hdr "#include \"$gen_header\"" if ($gen_header); - pidl_hdr ""; + $self->pidl_hdr("/* header auto-generated by pidl */"); + $self->pidl_hdr(""); + $self->pidl_hdr("#include \"$gen_header\"") if ($gen_header); + $self->pidl_hdr(""); - pidl "/* parser auto-generated by pidl */"; - pidl ""; - GenerateIncludes(); - pidl "#include \"$ndr_header\"" if ($ndr_header); - pidl ""; + $self->pidl("/* parser auto-generated by pidl */"); + $self->pidl(""); + $self->GenerateIncludes(); + $self->pidl("#include \"$ndr_header\"") if ($ndr_header); + $self->pidl(""); my %needed = (); @@ -2628,12 +2625,12 @@ sub Parse($$$) } foreach (@{$ndr}) { - ($_->{TYPE} eq "INTERFACE") && ParseInterface($_, \%needed); - ($_->{TYPE} eq "IMPORT") && HeaderImport(@{$_->{PATHS}}); - ($_->{TYPE} eq "INCLUDE") && HeaderInclude(@{$_->{PATHS}}); + ($_->{TYPE} eq "INTERFACE") && $self->ParseInterface($_, \%needed); + ($_->{TYPE} eq "IMPORT") && $self->HeaderImport(@{$_->{PATHS}}); + ($_->{TYPE} eq "INCLUDE") && $self->HeaderInclude(@{$_->{PATHS}}); } - return ($res_hdr, $res); + return ($self->{res_hdr}, $self->{res}); } sub NeededElement($$$) diff --git a/tools/pidl/lib/Parse/Pidl/Samba4/TDR.pm b/tools/pidl/lib/Parse/Pidl/Samba4/TDR.pm index f1f23bf84b..a3cb4f3016 100644 --- a/tools/pidl/lib/Parse/Pidl/Samba4/TDR.pm +++ b/tools/pidl/lib/Parse/Pidl/Samba4/TDR.pm @@ -17,14 +17,16 @@ $VERSION = '0.01'; use strict; -our $ret; -our $ret_hdr; -my $tabs = ""; - -sub indent() { $tabs.="\t"; } -sub deindent() { $tabs = substr($tabs, 1); } -sub pidl($) { $ret .= $tabs.(shift)."\n"; } -sub pidl_hdr($) { $ret_hdr .= (shift)."\n"; } +sub new($) { + my ($class) = shift; + my $self = { ret => "", ret_hdr => "", tabs => "" }; + bless($self, $class); +} + +sub indent($) { my $self = shift; $self->{tabs}.="\t"; } +sub deindent($) { my $self = shift; $self->{tabs} = substr($self->{tabs}, 1); } +sub pidl($$) { my $self = shift; $self->{ret} .= $self->{tabs}.(shift)."\n"; } +sub pidl_hdr($$) { my $self = shift; $self->{ret_hdr} .= (shift)."\n"; } sub typearg($) { my $t = shift; return(", const char *name") if ($t eq "print"); @@ -32,10 +34,14 @@ sub typearg($) { return(""); } -sub fn_declare($$) +sub fn_declare($$$) { - my ($p, $d) = @_; - if ($p) { pidl $d; pidl_hdr "$d;"; } else { pidl "static $d"; } + my ($self, $p, $d) = @_; + if ($p) { + $self->pidl($d); $self->pidl_hdr("$d;"); + } else { + $self->pidl("static $d"); + } } sub ContainsArray($) @@ -50,9 +56,9 @@ sub ContainsArray($) return 0; } -sub ParserElement($$$) +sub ParserElement($$$$) { - my ($e,$t,$env) = @_; + my ($self, $e,$t,$env) = @_; my $switch = ""; my $array = ""; my $name = ""; @@ -67,10 +73,10 @@ sub ParserElement($$$) } if (has_property($e, "flag")) { - pidl "{"; - indent; - pidl "uint32_t saved_flags = tdr->flags;"; - pidl "tdr->flags |= $e->{PROPERTIES}->{flag};"; + $self->pidl("{"); + $self->indent; + $self->pidl("uint32_t saved_flags = tdr->flags;"); + $self->pidl("tdr->flags |= $e->{PROPERTIES}->{flag};"); } if (has_property($e, "charset")) { @@ -79,7 +85,7 @@ sub ParserElement($$$) my $len = ParseExpr(@{$e->{ARRAY_LEN}}[0], $env, $e); if ($len eq "*") { $len = "-1"; } $name = ", mem_ctx" if ($t eq "pull"); - pidl "TDR_CHECK(tdr_$t\_charset(tdr$name, &v->$e->{NAME}, $len, sizeof($e->{TYPE}_t), CH_$e->{PROPERTIES}->{charset}));"; + $self->pidl("TDR_CHECK(tdr_$t\_charset(tdr$name, &v->$e->{NAME}, $len, sizeof($e->{TYPE}_t), CH_$e->{PROPERTIES}->{charset}));"); return; } @@ -91,12 +97,12 @@ sub ParserElement($$$) my $len = ParseExpr($e->{ARRAY_LEN}[0], $env, $e); if ($t eq "pull" and not is_constant($len)) { - pidl "TDR_ALLOC(mem_ctx, v->$e->{NAME}, $len);"; + $self->pidl("TDR_ALLOC(mem_ctx, v->$e->{NAME}, $len);"); $mem_ctx = "v->$e->{NAME}"; } - pidl "for (i = 0; i < $len; i++) {"; - indent; + $self->pidl("for (i = 0; i < $len; i++) {"); + $self->indent; $array = "[i]"; } @@ -105,116 +111,116 @@ sub ParserElement($$$) } if (has_property($e, "value") && $t eq "push") { - pidl "v->$e->{NAME} = ".ParseExpr($e->{PROPERTIES}->{value}, $env, $e).";"; + $self->pidl("v->$e->{NAME} = ".ParseExpr($e->{PROPERTIES}->{value}, $env, $e).";"); } - pidl "TDR_CHECK(tdr_$t\_$e->{TYPE}(tdr$name$switch, &v->$e->{NAME}$array));"; + $self->pidl("TDR_CHECK(tdr_$t\_$e->{TYPE}(tdr$name$switch, &v->$e->{NAME}$array));"); - if ($array) { deindent; pidl "}"; } + if ($array) { $self->deindent; $self->pidl("}"); } if (has_property($e, "flag")) { - pidl "tdr->flags = saved_flags;"; - deindent; - pidl "}"; + $self->pidl("tdr->flags = saved_flags;"); + $self->deindent; + $self->pidl("}"); } } -sub ParserStruct($$$$) +sub ParserStruct($$$$$) { - my ($e,$t,$p) = @_; + my ($self, $e,$t,$p) = @_; - fn_declare($p,"NTSTATUS tdr_$t\_$e->{NAME} (struct tdr_$t *tdr".typearg($t).", struct $e->{NAME} *v)"); - pidl "{"; indent; - pidl "int i;" if (ContainsArray($e)); + $self->fn_declare($p,"NTSTATUS tdr_$t\_$e->{NAME} (struct tdr_$t *tdr".typearg($t).", struct $e->{NAME} *v)"); + $self->pidl("{"); $self->indent; + $self->pidl("int i;") if (ContainsArray($e)); if ($t eq "print") { - pidl "tdr->print(tdr, \"\%-25s: struct $e->{NAME}\", name);"; - pidl "tdr->level++;"; + $self->pidl("tdr->print(tdr, \"\%-25s: struct $e->{NAME}\", name);"); + $self->pidl("tdr->level++;"); } my %env = map { $_->{NAME} => "v->$_->{NAME}" } @{$e->{ELEMENTS}}; $env{"this"} = "v"; - ParserElement($_, $t, \%env) foreach (@{$e->{ELEMENTS}}); + $self->ParserElement($_, $t, \%env) foreach (@{$e->{ELEMENTS}}); if ($t eq "print") { - pidl "tdr->level--;"; + $self->pidl("tdr->level--;"); } - pidl "return NT_STATUS_OK;"; + $self->pidl("return NT_STATUS_OK;"); - deindent; pidl "}"; + $self->deindent; $self->pidl("}"); } -sub ParserUnion($$$) +sub ParserUnion($$$$) { - my ($e,$t,$p) = @_; + my ($self, $e,$t,$p) = @_; - fn_declare($p,"NTSTATUS tdr_$t\_$e->{NAME}(struct tdr_$t *tdr".typearg($t).", int level, union $e->{NAME} *v)"); - pidl "{"; indent; - pidl "int i;" if (ContainsArray($e)); + $self->fn_declare($p,"NTSTATUS tdr_$t\_$e->{NAME}(struct tdr_$t *tdr".typearg($t).", int level, union $e->{NAME} *v)"); + $self->pidl("{"); $self->indent; + $self->pidl("int i;") if (ContainsArray($e)); if ($t eq "print") { - pidl "tdr->print(tdr, \"\%-25s: union $e->{NAME}\", name);"; - pidl "tdr->level++;"; + $self->pidl("tdr->print(tdr, \"\%-25s: union $e->{NAME}\", name);"); + $self->pidl("tdr->level++;"); } - pidl "switch (level) {"; indent; + $self->pidl("switch (level) {"); $self->indent; foreach (@{$e->{ELEMENTS}}) { if (has_property($_, "case")) { - pidl "case " . $_->{PROPERTIES}->{case} . ":"; + $self->pidl("case " . $_->{PROPERTIES}->{case} . ":"); } elsif (has_property($_, "default")) { - pidl "default:"; + $self->pidl("default:"); } - indent; ParserElement($_, $t, {}); deindent; - pidl "break;"; + $self->indent; $self->ParserElement($_, $t, {}); $self->deindent; + $self->pidl("break;"); } - deindent; pidl "}"; + $self->deindent; $self->pidl("}"); if ($t eq "print") { - pidl "tdr->level--;"; + $self->pidl("tdr->level--;"); } - pidl "return NT_STATUS_OK;\n"; - deindent; pidl "}"; + $self->pidl("return NT_STATUS_OK;\n"); + $self->deindent; $self->pidl("}"); } -sub ParserBitmap($$$) +sub ParserBitmap($$$$) { - my ($e,$t,$p) = @_; + my ($self,$e,$t,$p) = @_; return if ($p); - pidl "#define tdr_$t\_$e->{NAME} tdr_$t\_" . Parse::Pidl::Typelist::bitmap_type_fn($e); + $self->pidl("#define tdr_$t\_$e->{NAME} tdr_$t\_" . Parse::Pidl::Typelist::bitmap_type_fn($e)); } -sub ParserEnum($$$) +sub ParserEnum($$$$) { - my ($e,$t,$p) = @_; + my ($self,$e,$t,$p) = @_; my $bt = ($e->{PROPERTIES}->{base_type} or "uint8"); - fn_declare($p, "NTSTATUS tdr_$t\_$e->{NAME} (struct tdr_$t *tdr".typearg($t).", enum $e->{NAME} *v)"); - pidl "{"; + $self->fn_declare($p, "NTSTATUS tdr_$t\_$e->{NAME} (struct tdr_$t *tdr".typearg($t).", enum $e->{NAME} *v)"); + $self->pidl("{"); if ($t eq "pull") { - pidl "\t$bt\_t r;"; - pidl "\tTDR_CHECK(tdr_$t\_$bt(tdr, mem_ctx, \&r));"; - pidl "\t*v = r;"; + $self->pidl("\t$bt\_t r;"); + $self->pidl("\tTDR_CHECK(tdr_$t\_$bt(tdr, mem_ctx, \&r));"); + $self->pidl("\t*v = r;"); } elsif ($t eq "push") { - pidl "\tTDR_CHECK(tdr_$t\_$bt(tdr, ($bt\_t *)v));"; + $self->pidl("\tTDR_CHECK(tdr_$t\_$bt(tdr, ($bt\_t *)v));"); } elsif ($t eq "print") { - pidl "\t/* FIXME */"; + $self->pidl("\t/* FIXME */"); } - pidl "\treturn NT_STATUS_OK;"; - pidl "}"; + $self->pidl("\treturn NT_STATUS_OK;"); + $self->pidl("}"); } -sub ParserTypedef($$$) +sub ParserTypedef($$$$) { - my ($e,$t,$p) = @_; + my ($self, $e,$t,$p) = @_; - ParserType($e->{DATA},$t); + $self->ParserType($e->{DATA},$t); } -sub ParserType($$) +sub ParserType($$$) { - my ($e,$t) = @_; + my ($self, $e,$t) = @_; return if (has_property($e, "no$t")); @@ -224,53 +230,52 @@ sub ParserType($$) TYPEDEF => \&ParserTypedef }; - $handlers->{$e->{TYPE}}->($e, $t, has_property($e, "public")) + $handlers->{$e->{TYPE}}->($self, $e, $t, has_property($e, "public")) if (defined($handlers->{$e->{TYPE}})); - pidl ""; + $self->pidl(""); } -sub ParserInterface($) +sub ParserInterface($$) { - my $x = shift; + my ($self,$x) = @_; - pidl_hdr "#ifndef __TDR_$x->{NAME}_HEADER__"; - pidl_hdr "#define __TDR_$x->{NAME}_HEADER__"; + $self->pidl_hdr("#ifndef __TDR_$x->{NAME}_HEADER__"); + $self->pidl_hdr("#define __TDR_$x->{NAME}_HEADER__"); foreach (@{$x->{DATA}}) { - ParserType($_, "pull"); - ParserType($_, "push"); - ParserType($_, "print"); + $self->ParserType($_, "pull"); + $self->ParserType($_, "push"); + $self->ParserType($_, "print"); } - pidl_hdr "#endif /* __TDR_$x->{NAME}_HEADER__ */"; + $self->pidl_hdr("#endif /* __TDR_$x->{NAME}_HEADER__ */"); } -sub Parser($$$) +sub Parser($$$$) { - my ($idl,$hdrname,$baseheader) = @_; - $ret = ""; $ret_hdr = ""; - pidl "/* autogenerated by pidl */"; + my ($self,$idl,$hdrname,$baseheader) = @_; + $self->pidl("/* autogenerated by pidl */"); if (is_intree()) { - pidl "#include \"includes.h\""; + $self->pidl("#include \"includes.h\""); } else { - pidl "#include <stdio.h>"; - pidl "#include <stdbool.h>"; - pidl "#include <stdlib.h>"; - pidl "#include <stdint.h>"; - pidl "#include <stdarg.h>"; - pidl "#include <string.h>"; - pidl "#include <core/nterr.h>"; + $self->pidl("#include <stdio.h>"); + $self->pidl("#include <stdbool.h>"); + $self->pidl("#include <stdlib.h>"); + $self->pidl("#include <stdint.h>"); + $self->pidl("#include <stdarg.h>"); + $self->pidl("#include <string.h>"); + $self->pidl("#include <core/nterr.h>"); } - pidl "#include \"$hdrname\""; - pidl ""; - pidl_hdr "/* autogenerated by pidl */"; - pidl_hdr "#include \"$baseheader\""; - pidl_hdr choose_header("tdr/tdr.h", "tdr.h"); - pidl_hdr ""; - - foreach (@$idl) { ParserInterface($_) if ($_->{TYPE} eq "INTERFACE"); } - return ($ret_hdr, $ret); + $self->pidl("#include \"$hdrname\""); + $self->pidl(""); + $self->pidl_hdr("/* autogenerated by pidl */"); + $self->pidl_hdr("#include \"$baseheader\""); + $self->pidl_hdr(choose_header("tdr/tdr.h", "tdr.h")); + $self->pidl_hdr(""); + + foreach (@$idl) { $self->ParserInterface($_) if ($_->{TYPE} eq "INTERFACE"); } + return ($self->{ret_hdr}, $self->{ret}); } 1; diff --git a/tools/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm b/tools/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm index 44eb77f836..b53c56e741 100644 --- a/tools/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm +++ b/tools/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm @@ -124,6 +124,12 @@ sub handle_type($$$$$$$$$$) warning($pos, "invalid BASE_TYPE `$base_type'"); } + $dissectorname =~ s/^\"(.*)\"$/$1/g; + + if (not ($dissectorname =~ /;$/)) { + warning($pos, "missing semicolon"); + } + $data->{types}->{$name} = { NAME => $name, POS => $pos, diff --git a/tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm b/tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm index 7490b8267c..ea3f0db961 100644 --- a/tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm +++ b/tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm @@ -18,7 +18,7 @@ package Parse::Pidl::Wireshark::NDR; use Exporter; @ISA = qw(Exporter); -@EXPORT_OK = qw(field2name @ett %res PrintIdl StripPrefixes %hf_used RegisterInterfaceHandoff $conformance register_hf_field CheckUsed ProcessImport ProcessInclude find_type DumpEttList DumpEttDeclaration DumpHfList DumpHfDeclaration DumpFunctionTable register_type register_ett); +@EXPORT_OK = qw(field2name %res PrintIdl StripPrefixes RegisterInterfaceHandoff register_hf_field CheckUsed ProcessImport ProcessInclude find_type DumpEttList DumpEttDeclaration DumpHfList DumpHfDeclaration DumpFunctionTable register_type register_ett); use strict; use Parse::Pidl qw(error warning); @@ -32,14 +32,9 @@ use File::Basename; use vars qw($VERSION); $VERSION = '0.01'; -our @ett; - -our %hf_used = (); my %return_types = (); my %dissector_used = (); -our $conformance = undef; - my %ptrtype_mappings = ( "unique" => "NDR_POINTER_UNIQUE", "ref" => "NDR_POINTER_REF", @@ -70,157 +65,166 @@ sub field2name($) return $field; } -our %res = (); -my $tabs = ""; -my $cur_fn = undef; -sub pidl_fn_start($) +sub new($) +{ + my ($class) = @_; + my $self = {res => {hdr => "", def => "", code => ""}, tabs => "", cur_fn => undef, + hf_used => {}, ett => [], conformance => undef + + }; + bless($self, $class); +} + +sub pidl_fn_start($$) { - my $fn = shift; - $cur_fn = $fn; + my ($self, $fn) = @_; + $self->{cur_fn} = $fn; } -sub pidl_fn_end($) +sub pidl_fn_end($$) { - my $fn = shift; - die("Inconsistent state: $fn != $cur_fn") if ($fn ne $cur_fn); - $cur_fn = undef; + my ($self, $fn) = @_; + die("Inconsistent state: $fn != $self->{cur_fn}") if ($fn ne $self->{cur_fn}); + $self->{cur_fn} = undef; } -sub pidl_code($) +sub pidl_code($$) { - my $d = shift; - return if (defined($cur_fn) and defined($conformance->{manual}->{$cur_fn})); + my ($self, $d) = @_; + return if (defined($self->{cur_fn}) and defined($self->{conformance}->{manual}->{$self->{cur_fn}})); if ($d) { - $res{code} .= $tabs; - $res{code} .= $d; + $self->{res}->{code} .= $self->{tabs}; + $self->{res}->{code} .= $d; } - $res{code} .="\n"; + $self->{res}->{code} .="\n"; } -sub pidl_hdr($) { my $x = shift; $res{hdr} .= "$x\n"; } -sub pidl_def($) { my $x = shift; $res{def} .= "$x\n"; } +sub pidl_hdr($$) { my ($self,$x) = @_; $self->{res}->{hdr} .= "$x\n"; } +sub pidl_def($$) { my ($self,$x) = @_; $self->{res}->{def} .= "$x\n"; } -sub indent() +sub indent($) { - $tabs .= "\t"; + my ($self) = @_; + $self->{tabs} .= "\t"; } -sub deindent() +sub deindent($) { - $tabs = substr($tabs, 0, -1); + my ($self) = @_; + $self->{tabs} = substr($self->{tabs}, 0, -1); } -sub PrintIdl($) +sub PrintIdl($$) { - my ($idl) = @_; + my ($self, $idl) = @_; foreach (split /\n/, $idl) { - pidl_code "/* IDL: $_ */"; + $self->pidl_code("/* IDL: $_ */"); } - pidl_code ""; + $self->pidl_code(""); } ##################################################################### # parse the interface definitions -sub Interface($) +sub Interface($$) { - my($interface) = @_; - Const($_,$interface->{NAME}) foreach (@{$interface->{CONSTS}}); - Type($_, $_->{NAME}, $interface->{NAME}) foreach (@{$interface->{TYPES}}); - Function($_,$interface->{NAME}) foreach (@{$interface->{FUNCTIONS}}); + my($self, $interface) = @_; + $self->Const($_,$interface->{NAME}) foreach (@{$interface->{CONSTS}}); + $self->Type($_, $_->{NAME}, $interface->{NAME}) foreach (@{$interface->{TYPES}}); + $self->Function($_,$interface->{NAME}) foreach (@{$interface->{FUNCTIONS}}); } -sub Enum($$$) +sub Enum($$$$) { - my ($e,$name,$ifname) = @_; + my ($self, $e,$name,$ifname) = @_; my $valsstring = "$ifname\_$name\_vals"; - my $dissectorname = "$ifname\_dissect\_enum\_".StripPrefixes($name, $conformance->{strip_prefixes}); + my $dissectorname = "$ifname\_dissect\_enum\_".StripPrefixes($name, $self->{conformance}->{strip_prefixes}); - return if (defined($conformance->{noemit}->{StripPrefixes($name, $conformance->{strip_prefixes})})); + return if (defined($self->{conformance}->{noemit}->{StripPrefixes($name, $self->{conformance}->{strip_prefixes})})); foreach (@{$e->{ELEMENTS}}) { if (/([^=]*)=(.*)/) { - pidl_hdr "#define $1 ($2)"; + $self->pidl_hdr("#define $1 ($2)"); } } - pidl_hdr "extern const value_string $valsstring\[];"; - pidl_hdr "int $dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 *param _U_);"; + $self->pidl_hdr("extern const value_string $valsstring\[];"); + $self->pidl_hdr("int $dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 *param _U_);"); - pidl_def "const value_string ".$valsstring."[] = {"; + $self->pidl_def("const value_string ".$valsstring."[] = {"); foreach (@{$e->{ELEMENTS}}) { next unless (/([^=]*)=(.*)/); - pidl_def "\t{ $1, \"$1\" },"; + $self->pidl_def("\t{ $1, \"$1\" },"); } - pidl_def "{ 0, NULL }"; - pidl_def "};"; - - pidl_fn_start $dissectorname; - pidl_code "int"; - pidl_code "$dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 *param _U_)"; - pidl_code "{"; - indent; - pidl_code "g$e->{BASE_TYPE} parameter=0;"; - pidl_code "if(param){"; - indent; - pidl_code "parameter=(g$e->{BASE_TYPE})*param;"; - deindent; - pidl_code "}"; - pidl_code "offset = dissect_ndr_$e->{BASE_TYPE}(tvb, offset, pinfo, tree, drep, hf_index, ¶meter);"; - pidl_code "if(param){"; - indent; - pidl_code "*param=(guint32)parameter;"; - deindent; - pidl_code "}"; - pidl_code "return offset;"; - deindent; - pidl_code "}\n"; - pidl_fn_end $dissectorname; + $self->pidl_def("{ 0, NULL }"); + $self->pidl_def("};"); + + $self->pidl_fn_start($dissectorname); + $self->pidl_code("int"); + $self->pidl_code("$dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 *param _U_)"); + $self->pidl_code("{"); + $self->indent; + $self->pidl_code("g$e->{BASE_TYPE} parameter=0;"); + $self->pidl_code("if(param){"); + $self->indent; + $self->pidl_code("parameter=(g$e->{BASE_TYPE})*param;"); + $self->deindent; + $self->pidl_code("}"); + $self->pidl_code("offset = dissect_ndr_$e->{BASE_TYPE}(tvb, offset, pinfo, tree, drep, hf_index, ¶meter);"); + $self->pidl_code("if(param){"); + $self->indent; + $self->pidl_code("*param=(guint32)parameter;"); + $self->deindent; + $self->pidl_code("}"); + $self->pidl_code("return offset;"); + $self->deindent; + $self->pidl_code("}\n"); + $self->pidl_fn_end($dissectorname); my $enum_size = $e->{BASE_TYPE}; $enum_size =~ s/uint//g; - register_type($name, "offset = $dissectorname(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_UINT$enum_size", "BASE_DEC", "0", "VALS($valsstring)", $enum_size / 8); + $self->register_type($name, "offset = $dissectorname(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_UINT$enum_size", "BASE_DEC", "0", "VALS($valsstring)", $enum_size / 8); } -sub Bitmap($$$) +sub Bitmap($$$$) { - my ($e,$name,$ifname) = @_; - my $dissectorname = "$ifname\_dissect\_bitmap\_".StripPrefixes($name, $conformance->{strip_prefixes}); + my ($self,$e,$name,$ifname) = @_; + my $dissectorname = "$ifname\_dissect\_bitmap\_".StripPrefixes($name, $self->{conformance}->{strip_prefixes}); - register_ett("ett_$ifname\_$name"); + $self->register_ett("ett_$ifname\_$name"); - pidl_hdr "int $dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 param _U_);"; + $self->pidl_hdr("int $dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 param _U_);"); - pidl_fn_start $dissectorname; - pidl_code "int"; - pidl_code "$dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *parent_tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 param _U_)"; - pidl_code "{"; - indent; - pidl_code "proto_item *item = NULL;"; - pidl_code "proto_tree *tree = NULL;"; - pidl_code ""; + $self->pidl_fn_start($dissectorname); + $self->pidl_code("int"); + $self->pidl_code("$dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *parent_tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 param _U_)"); + $self->pidl_code("{"); + $self->indent; + $self->pidl_code("proto_item *item = NULL;"); + $self->pidl_code("proto_tree *tree = NULL;"); + $self->pidl_code(""); - pidl_code "g$e->{BASE_TYPE} flags;"; + $self->pidl_code("g$e->{BASE_TYPE} flags;"); if ($e->{ALIGN} > 1) { - pidl_code "ALIGN_TO_$e->{ALIGN}_BYTES;"; + $self->pidl_code("ALIGN_TO_$e->{ALIGN}_BYTES;"); } - pidl_code ""; + $self->pidl_code(""); - pidl_code "if (parent_tree) {"; - indent; - pidl_code "item = proto_tree_add_item(parent_tree, hf_index, tvb, offset, $e->{ALIGN}, TRUE);"; - pidl_code "tree = proto_item_add_subtree(item,ett_$ifname\_$name);"; - deindent; - pidl_code "}\n"; + $self->pidl_code("if (parent_tree) {"); + $self->indent; + $self->pidl_code("item = proto_tree_add_item(parent_tree, hf_index, tvb, offset, $e->{ALIGN}, TRUE);"); + $self->pidl_code("tree = proto_item_add_subtree(item,ett_$ifname\_$name);"); + $self->deindent; + $self->pidl_code("}\n"); - pidl_code "offset = dissect_ndr_$e->{BASE_TYPE}(tvb, offset, pinfo, NULL, drep, -1, &flags);"; + $self->pidl_code("offset = dissect_ndr_$e->{BASE_TYPE}(tvb, offset, pinfo, NULL, drep, -1, &flags);"); - pidl_code "proto_item_append_text(item, \": \");\n"; - pidl_code "if (!flags)"; - pidl_code "\tproto_item_append_text(item, \"(No values set)\");\n"; + $self->pidl_code("proto_item_append_text(item, \": \");\n"); + $self->pidl_code("if (!flags)"); + $self->pidl_code("\tproto_item_append_text(item, \"(No values set)\");\n"); foreach (@{$e->{ELEMENTS}}) { next unless (/([^ ]*) (.*)/); @@ -228,52 +232,52 @@ sub Bitmap($$$) my $hf_bitname = "hf_$ifname\_$name\_$en"; my $filtername = "$ifname\.$name\.$en"; - $hf_used{$hf_bitname} = 1; + $self->{hf_used}->{$hf_bitname} = 1; - register_hf_field($hf_bitname, field2name($en), $filtername, "FT_BOOLEAN", $e->{ALIGN} * 8, "TFS(&$name\_$en\_tfs)", $ev, ""); + $self->register_hf_field($hf_bitname, field2name($en), $filtername, "FT_BOOLEAN", $e->{ALIGN} * 8, "TFS(&$name\_$en\_tfs)", $ev, ""); - pidl_def "static const true_false_string $name\_$en\_tfs = {"; - if (defined($conformance->{tfs}->{$hf_bitname})) { - pidl_def " $conformance->{tfs}->{$hf_bitname}->{TRUE_STRING},"; - pidl_def " $conformance->{tfs}->{$hf_bitname}->{FALSE_STRING},"; - $conformance->{tfs}->{$hf_bitname}->{USED} = 1; + $self->pidl_def("static const true_false_string $name\_$en\_tfs = {"); + if (defined($self->{conformance}->{tfs}->{$hf_bitname})) { + $self->pidl_def(" $self->{conformance}->{tfs}->{$hf_bitname}->{TRUE_STRING},"); + $self->pidl_def(" $self->{conformance}->{tfs}->{$hf_bitname}->{FALSE_STRING},"); + $self->{conformance}->{tfs}->{$hf_bitname}->{USED} = 1; } else { - pidl_def " \"$en is SET\","; - pidl_def " \"$en is NOT SET\","; + $self->pidl_def(" \"$en is SET\","); + $self->pidl_def(" \"$en is NOT SET\","); } - pidl_def "};"; + $self->pidl_def("};"); - pidl_code "proto_tree_add_boolean(tree, $hf_bitname, tvb, offset-$e->{ALIGN}, $e->{ALIGN}, flags);"; - pidl_code "if (flags&$ev){"; - pidl_code "\tproto_item_append_text(item, \"$en\");"; - pidl_code "\tif (flags & (~$ev))"; - pidl_code "\t\tproto_item_append_text(item, \", \");"; - pidl_code "}"; - pidl_code "flags&=(~$ev);"; - pidl_code ""; + $self->pidl_code("proto_tree_add_boolean(tree, $hf_bitname, tvb, offset-$e->{ALIGN}, $e->{ALIGN}, flags);"); + $self->pidl_code("if (flags&$ev){"); + $self->pidl_code("\tproto_item_append_text(item, \"$en\");"); + $self->pidl_code("\tif (flags & (~$ev))"); + $self->pidl_code("\t\tproto_item_append_text(item, \", \");"); + $self->pidl_code("}"); + $self->pidl_code("flags&=(~$ev);"); + $self->pidl_code(""); } - pidl_code "if (flags) {"; - pidl_code "\tproto_item_append_text(item, \"Unknown bitmap value 0x%x\", flags);"; - pidl_code "}\n"; - pidl_code "return offset;"; - deindent; - pidl_code "}\n"; - pidl_fn_end $dissectorname; + $self->pidl_code("if (flags) {"); + $self->pidl_code("\tproto_item_append_text(item, \"Unknown bitmap value 0x%x\", flags);"); + $self->pidl_code("}\n"); + $self->pidl_code("return offset;"); + $self->deindent; + $self->pidl_code("}\n"); + $self->pidl_fn_end($dissectorname); my $size = $e->{BASE_TYPE}; $size =~ s/uint//g; - register_type($name, "offset = $dissectorname(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_UINT$size", "BASE_HEX", "0", "NULL", $size/8); + $self->register_type($name, "offset = $dissectorname(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_UINT$size", "BASE_HEX", "0", "NULL", $size/8); } -sub ElementLevel($$$$$$) +sub ElementLevel($$$$$$$) { - my ($e,$l,$hf,$myname,$pn,$ifname) = @_; + my ($self,$e,$l,$hf,$myname,$pn,$ifname) = @_; my $param = 0; - if (defined($conformance->{dissectorparams}->{$myname})) { - $param = $conformance->{dissectorparams}->{$myname}->{PARAM}; + if (defined($self->{conformance}->{dissectorparams}->{$myname})) { + $param = $self->{conformance}->{dissectorparams}->{$myname}->{PARAM}; } if ($l->{TYPE} eq "POINTER") { @@ -283,27 +287,27 @@ sub ElementLevel($$$$$$) } elsif ($l->{LEVEL} eq "EMBEDDED") { $type = "embedded"; } - pidl_code "offset = dissect_ndr_$type\_pointer(tvb, offset, pinfo, tree, drep, $myname\_, $ptrtype_mappings{$l->{POINTER_TYPE}}, \"Pointer to ".field2name(StripPrefixes($e->{NAME}, $conformance->{strip_prefixes})) . " ($e->{TYPE})\",$hf);"; + $self->pidl_code("offset = dissect_ndr_$type\_pointer(tvb, offset, pinfo, tree, drep, $myname\_, $ptrtype_mappings{$l->{POINTER_TYPE}}, \"Pointer to ".field2name(StripPrefixes($e->{NAME}, $self->{conformance}->{strip_prefixes})) . " ($e->{TYPE})\",$hf);"); } elsif ($l->{TYPE} eq "ARRAY") { if ($l->{IS_INLINE}) { error($e->{ORIGINAL}, "Inline arrays not supported"); } elsif ($l->{IS_FIXED}) { - pidl_code "int i;"; - pidl_code "for (i = 0; i < $l->{SIZE_IS}; i++)"; - pidl_code "\toffset = $myname\_(tvb, offset, pinfo, tree, drep);"; + $self->pidl_code("int i;"); + $self->pidl_code("for (i = 0; i < $l->{SIZE_IS}; i++)"); + $self->pidl_code("\toffset = $myname\_(tvb, offset, pinfo, tree, drep);"); } else { my $type = ""; $type .= "c" if ($l->{IS_CONFORMANT}); $type .= "v" if ($l->{IS_VARYING}); unless ($l->{IS_ZERO_TERMINATED}) { - pidl_code "offset = dissect_ndr_u" . $type . "array(tvb, offset, pinfo, tree, drep, $myname\_);"; + $self->pidl_code("offset = dissect_ndr_u" . $type . "array(tvb, offset, pinfo, tree, drep, $myname\_);"); } else { my $nl = GetNextLevel($e,$l); - pidl_code "char *data;"; - pidl_code ""; - pidl_code "offset = dissect_ndr_$type" . "string(tvb, offset, pinfo, tree, drep, sizeof(g$nl->{DATA_TYPE}), $hf, FALSE, &data);"; - pidl_code "proto_item_append_text(tree, \": %s\", data);"; + $self->pidl_code("char *data;"); + $self->pidl_code(""); + $self->pidl_code("offset = dissect_ndr_$type" . "string(tvb, offset, pinfo, tree, drep, sizeof(g$nl->{DATA_TYPE}), $hf, FALSE, &data);"); + $self->pidl_code("proto_item_append_text(tree, \": %s\", data);"); } } } elsif ($l->{TYPE} eq "DATA") { @@ -314,47 +318,47 @@ sub ElementLevel($$$$$$) ($bs = 1) if (property_matches($e, "flag", ".*LIBNDR_FLAG_STR_ASCII.*")); if (property_matches($e, "flag", ".*LIBNDR_FLAG_STR_SIZE4.*") and property_matches($e, "flag", ".*LIBNDR_FLAG_STR_LEN4.*")) { - pidl_code "char *data;\n"; - pidl_code "offset = dissect_ndr_cvstring(tvb, offset, pinfo, tree, drep, $bs, $hf, FALSE, &data);"; - pidl_code "proto_item_append_text(tree, \": %s\", data);"; + $self->pidl_code("char *data;\n"); + $self->pidl_code("offset = dissect_ndr_cvstring(tvb, offset, pinfo, tree, drep, $bs, $hf, FALSE, &data);"); + $self->pidl_code("proto_item_append_text(tree, \": %s\", data);"); } elsif (property_matches($e, "flag", ".*LIBNDR_FLAG_STR_SIZE4.*")) { - pidl_code "offset = dissect_ndr_vstring(tvb, offset, pinfo, tree, drep, $bs, $hf, FALSE, NULL);"; + $self->pidl_code("offset = dissect_ndr_vstring(tvb, offset, pinfo, tree, drep, $bs, $hf, FALSE, NULL);"); } else { warn("Unable to handle string with flags $e->{PROPERTIES}->{flag}"); } } else { my $call; - if ($conformance->{imports}->{$l->{DATA_TYPE}}) { - $call = $conformance->{imports}->{$l->{DATA_TYPE}}->{DATA}; - $conformance->{imports}->{$l->{DATA_TYPE}}->{USED} = 1; - } elsif (defined($conformance->{imports}->{"$pn.$e->{NAME}"})) { - $call = $conformance->{imports}->{"$pn.$e->{NAME}"}->{DATA}; - $conformance->{imports}->{"$pn.$e->{NAME}"}->{USED} = 1; + if ($self->{conformance}->{imports}->{$l->{DATA_TYPE}}) { + $call = $self->{conformance}->{imports}->{$l->{DATA_TYPE}}->{DATA}; + $self->{conformance}->{imports}->{$l->{DATA_TYPE}}->{USED} = 1; + } elsif (defined($self->{conformance}->{imports}->{"$pn.$e->{NAME}"})) { + $call = $self->{conformance}->{imports}->{"$pn.$e->{NAME}"}->{DATA}; + $self->{conformance}->{imports}->{"$pn.$e->{NAME}"}->{USED} = 1; - } elsif (defined($conformance->{types}->{$l->{DATA_TYPE}})) { - $call= $conformance->{types}->{$l->{DATA_TYPE}}->{DISSECTOR_NAME}; - $conformance->{types}->{$l->{DATA_TYPE}}->{USED} = 1; + } elsif (defined($self->{conformance}->{types}->{$l->{DATA_TYPE}})) { + $call= $self->{conformance}->{types}->{$l->{DATA_TYPE}}->{DISSECTOR_NAME}; + $self->{conformance}->{types}->{$l->{DATA_TYPE}}->{USED} = 1; } else { - pidl_code "offset = $ifname\_dissect_struct_" . $l->{DATA_TYPE} . "(tvb,offset,pinfo,tree,drep,$hf,$param);"; + $self->pidl_code("offset = $ifname\_dissect_struct_" . $l->{DATA_TYPE} . "(tvb,offset,pinfo,tree,drep,$hf,$param);"); return; } $call =~ s/\@HF\@/$hf/g; $call =~ s/\@PARAM\@/$param/g; - pidl_code "$call"; + $self->pidl_code($call); } } elsif ($_->{TYPE} eq "SUBCONTEXT") { my $num_bits = ($l->{HEADER_SIZE}*8); - pidl_code "guint$num_bits size;"; - pidl_code "int start_offset = offset;"; - pidl_code "tvbuff_t *subtvb;"; - pidl_code "offset = dissect_ndr_uint$num_bits(tvb, offset, pinfo, tree, drep, $hf, &size);"; - pidl_code "proto_tree_add_text(tree, tvb, start_offset, offset - start_offset + size, \"Subcontext size\");"; - - pidl_code "subtvb = tvb_new_subset(tvb, offset, size, -1);"; - pidl_code "$myname\_(subtvb, 0, pinfo, tree, drep);"; + $self->pidl_code("guint$num_bits size;"); + $self->pidl_code("int start_offset = offset;"); + $self->pidl_code("tvbuff_t *subtvb;"); + $self->pidl_code("offset = dissect_ndr_uint$num_bits(tvb, offset, pinfo, tree, drep, $hf, &size);"); + $self->pidl_code("proto_tree_add_text(tree, tvb, start_offset, offset - start_offset + size, \"Subcontext size\");"); + + $self->pidl_code("subtvb = tvb_new_subset(tvb, offset, size, -1);"); + $self->pidl_code("$myname\_(subtvb, 0, pinfo, tree, drep);"); } else { die("Unknown type `$_->{TYPE}'"); } @@ -362,13 +366,13 @@ sub ElementLevel($$$$$$) sub Element($$$) { - my ($e,$pn,$ifname) = @_; + my ($self,$e,$pn,$ifname) = @_; - my $dissectorname = "$ifname\_dissect\_element\_".StripPrefixes($pn, $conformance->{strip_prefixes})."\_".StripPrefixes($e->{NAME}, $conformance->{strip_prefixes}); + my $dissectorname = "$ifname\_dissect\_element\_".StripPrefixes($pn, $self->{conformance}->{strip_prefixes})."\_".StripPrefixes($e->{NAME}, $self->{conformance}->{strip_prefixes}); my $call_code = "offset = $dissectorname(tvb, offset, pinfo, tree, drep);"; - my $type = find_type($e->{TYPE}); + my $type = $self->find_type($e->{TYPE}); if (not defined($type)) { # default settings @@ -389,11 +393,11 @@ sub Element($$$) }; } - my $hf = register_hf_field("hf_$ifname\_$pn\_$e->{NAME}", field2name($e->{NAME}), "$ifname.$pn.$e->{NAME}", $type->{FT_TYPE}, $type->{BASE_TYPE}, $type->{VALSSTRING}, $type->{MASK}, ""); - $hf_used{$hf} = 1; + my $hf = $self->register_hf_field("hf_$ifname\_$pn\_$e->{NAME}", field2name($e->{NAME}), "$ifname.$pn.$e->{NAME}", $type->{FT_TYPE}, $type->{BASE_TYPE}, $type->{VALSSTRING}, $type->{MASK}, ""); + $self->{hf_used}->{$hf} = 1; - my $eltname = StripPrefixes($pn, $conformance->{strip_prefixes}) . ".$e->{NAME}"; - if (defined($conformance->{noemit}->{$eltname})) { + my $eltname = StripPrefixes($pn, $self->{conformance}->{strip_prefixes}) . ".$e->{NAME}"; + if (defined($self->{conformance}->{noemit}->{$eltname})) { return $call_code; } @@ -401,20 +405,20 @@ sub Element($$$) foreach (@{$e->{LEVELS}}) { next if ($_->{TYPE} eq "SWITCH"); - pidl_def "static int $dissectorname$add(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_);"; - pidl_fn_start "$dissectorname$add"; - pidl_code "static int"; - pidl_code "$dissectorname$add(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_)"; - pidl_code "{"; - indent; - - ElementLevel($e,$_,$hf,$dissectorname.$add,$pn,$ifname); - - pidl_code ""; - pidl_code "return offset;"; - deindent; - pidl_code "}\n"; - pidl_fn_end "$dissectorname$add"; + $self->pidl_def("static int $dissectorname$add(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_);"); + $self->pidl_fn_start("$dissectorname$add"); + $self->pidl_code("static int"); + $self->pidl_code("$dissectorname$add(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_)"); + $self->pidl_code("{"); + $self->indent; + + $self->ElementLevel($e,$_,$hf,$dissectorname.$add,$pn,$ifname); + + $self->pidl_code(""); + $self->pidl_code("return offset;"); + $self->deindent; + $self->pidl_code("}\n"); + $self->pidl_fn_end("$dissectorname$add"); $add.="_"; last if ($_->{TYPE} eq "ARRAY" and $_->{IS_ZERO_TERMINATED}); } @@ -424,32 +428,32 @@ sub Element($$$) sub Function($$$) { - my ($fn,$ifname) = @_; + my ($self, $fn,$ifname) = @_; my %dissectornames; foreach (@{$fn->{ELEMENTS}}) { - $dissectornames{$_->{NAME}} = Element($_, $fn->{NAME}, $ifname) if not defined($dissectornames{$_->{NAME}}); + $dissectornames{$_->{NAME}} = $self->Element($_, $fn->{NAME}, $ifname) if not defined($dissectornames{$_->{NAME}}); } my $fn_name = $_->{NAME}; $fn_name =~ s/^${ifname}_//; - PrintIdl DumpFunction($fn->{ORIGINAL}); - pidl_fn_start "$ifname\_dissect\_$fn_name\_response"; - pidl_code "static int"; - pidl_code "$ifname\_dissect\_${fn_name}_response(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_)"; - pidl_code "{"; - indent; + $self->PrintIdl(DumpFunction($fn->{ORIGINAL})); + $self->pidl_fn_start("$ifname\_dissect\_$fn_name\_response"); + $self->pidl_code("static int"); + $self->pidl_code("$ifname\_dissect\_${fn_name}_response(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_)"); + $self->pidl_code("{"); + $self->indent; if ( not defined($fn->{RETURN_TYPE})) { } elsif ($fn->{RETURN_TYPE} eq "NTSTATUS" or $fn->{RETURN_TYPE} eq "WERROR") { - pidl_code "guint32 status;\n"; + $self->pidl_code("guint32 status;\n"); } elsif (my $type = getType($fn->{RETURN_TYPE})) { if ($type->{DATA}->{TYPE} eq "ENUM") { - pidl_code "g".Parse::Pidl::Typelist::enum_type_fn($type->{DATA}) . " status;\n"; + $self->pidl_code("g".Parse::Pidl::Typelist::enum_type_fn($type->{DATA}) . " status;\n"); } elsif ($type->{DATA}->{TYPE} eq "SCALAR") { - pidl_code "g$fn->{RETURN_TYPE} status;\n"; + $self->pidl_code("g$fn->{RETURN_TYPE} status;\n"); } else { error($fn, "return type `$fn->{RETURN_TYPE}' not yet supported"); } @@ -457,25 +461,25 @@ sub Function($$$) error($fn, "unknown return type `$fn->{RETURN_TYPE}'"); } - pidl_code "pinfo->dcerpc_procedure_name=\"${fn_name}\";"; + $self->pidl_code("pinfo->dcerpc_procedure_name=\"${fn_name}\";"); foreach (@{$fn->{ELEMENTS}}) { if (grep(/out/,@{$_->{DIRECTION}})) { - pidl_code "$dissectornames{$_->{NAME}}"; - pidl_code "offset = dissect_deferred_pointers(pinfo, tvb, offset, drep);"; - pidl_code ""; + $self->pidl_code("$dissectornames{$_->{NAME}}"); + $self->pidl_code("offset = dissect_deferred_pointers(pinfo, tvb, offset, drep);"); + $self->pidl_code(""); } } if (not defined($fn->{RETURN_TYPE})) { } elsif ($fn->{RETURN_TYPE} eq "NTSTATUS") { - pidl_code "offset = dissect_ntstatus(tvb, offset, pinfo, tree, drep, hf\_$ifname\_status, &status);\n"; - pidl_code "if (status != 0 && check_col(pinfo->cinfo, COL_INFO))"; - pidl_code "\tcol_append_fstr(pinfo->cinfo, COL_INFO, \", Error: %s\", val_to_str(status, NT_errors, \"Unknown NT status 0x%08x\"));\n"; + $self->pidl_code("offset = dissect_ntstatus(tvb, offset, pinfo, tree, drep, hf\_$ifname\_status, &status);\n"); + $self->pidl_code("if (status != 0 && check_col(pinfo->cinfo, COL_INFO))"); + $self->pidl_code("\tcol_append_fstr(pinfo->cinfo, COL_INFO, \", Error: %s\", val_to_str(status, NT_errors, \"Unknown NT status 0x%08x\"));\n"); $return_types{$ifname}->{"status"} = ["NTSTATUS", "NT Error"]; } elsif ($fn->{RETURN_TYPE} eq "WERROR") { - pidl_code "offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf\_$ifname\_werror, &status);\n"; - pidl_code "if (status != 0 && check_col(pinfo->cinfo, COL_INFO))"; - pidl_code "\tcol_append_fstr(pinfo->cinfo, COL_INFO, \", Error: %s\", val_to_str(status, WERR_errors, \"Unknown DOS error 0x%08x\"));\n"; + $self->pidl_code("offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf\_$ifname\_werror, &status);\n"); + $self->pidl_code("if (status != 0 && check_col(pinfo->cinfo, COL_INFO))"); + $self->pidl_code("\tcol_append_fstr(pinfo->cinfo, COL_INFO, \", Error: %s\", val_to_str(status, WERR_errors, \"Unknown DOS error 0x%08x\"));\n"); $return_types{$ifname}->{"werror"} = ["WERROR", "Windows Error"]; } elsif (my $type = getType($fn->{RETURN_TYPE})) { @@ -483,108 +487,107 @@ sub Function($$$) my $return_type = "g".Parse::Pidl::Typelist::enum_type_fn($type->{DATA}); my $return_dissect = "dissect_ndr_" .Parse::Pidl::Typelist::enum_type_fn($type->{DATA}); - pidl_code "offset = $return_dissect(tvb, offset, pinfo, tree, drep, hf\_$ifname\_$fn->{RETURN_TYPE}_status, &status);"; - pidl_code "if (status != 0 && check_col(pinfo->cinfo, COL_INFO))"; - pidl_code "\tcol_append_fstr(pinfo->cinfo, COL_INFO, \", Status: %s\", val_to_str(status, $ifname\_$fn->{RETURN_TYPE}\_vals, \"Unknown " . $fn->{RETURN_TYPE} . " error 0x%08x\"));\n"; + $self->pidl_code("offset = $return_dissect(tvb, offset, pinfo, tree, drep, hf\_$ifname\_$fn->{RETURN_TYPE}_status, &status);"); + $self->pidl_code("if (status != 0 && check_col(pinfo->cinfo, COL_INFO))"); + $self->pidl_code("\tcol_append_fstr(pinfo->cinfo, COL_INFO, \", Status: %s\", val_to_str(status, $ifname\_$fn->{RETURN_TYPE}\_vals, \"Unknown " . $fn->{RETURN_TYPE} . " error 0x%08x\"));\n"); $return_types{$ifname}->{$fn->{RETURN_TYPE}."_status"} = [$fn->{RETURN_TYPE}, $fn->{RETURN_TYPE}]; } elsif ($type->{DATA}->{TYPE} eq "SCALAR") { - pidl_code "offset = dissect_ndr_$fn->{RETURN_TYPE}(tvb, offset, pinfo, tree, drep, hf\_$ifname\_$fn->{RETURN_TYPE}_status, &status);"; - pidl_code "if (status != 0 && check_col(pinfo->cinfo, COL_INFO))"; - pidl_code "\tcol_append_fstr(pinfo->cinfo, COL_INFO, \", Status: %d\", status);\n"; + $self->pidl_code("offset = dissect_ndr_$fn->{RETURN_TYPE}(tvb, offset, pinfo, tree, drep, hf\_$ifname\_$fn->{RETURN_TYPE}_status, &status);"); + $self->pidl_code("if (status != 0 && check_col(pinfo->cinfo, COL_INFO))"); + $self->pidl_code("\tcol_append_fstr(pinfo->cinfo, COL_INFO, \", Status: %d\", status);\n"); $return_types{$ifname}->{$fn->{RETURN_TYPE}."_status"} = [$fn->{RETURN_TYPE}, $fn->{RETURN_TYPE}]; } } - - pidl_code "return offset;"; - deindent; - pidl_code "}\n"; - pidl_fn_end "$ifname\_dissect\_$fn_name\_response"; - - pidl_fn_start "$ifname\_dissect\_$fn_name\_request"; - pidl_code "static int"; - pidl_code "$ifname\_dissect\_${fn_name}_request(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_)"; - pidl_code "{"; - indent; - pidl_code "pinfo->dcerpc_procedure_name=\"${fn_name}\";"; + $self->pidl_code("return offset;"); + $self->deindent; + $self->pidl_code("}\n"); + $self->pidl_fn_end("$ifname\_dissect\_$fn_name\_response"); + + $self->pidl_fn_start("$ifname\_dissect\_$fn_name\_request"); + $self->pidl_code("static int"); + $self->pidl_code("$ifname\_dissect\_${fn_name}_request(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_)"); + $self->pidl_code("{"); + $self->indent; + $self->pidl_code("pinfo->dcerpc_procedure_name=\"${fn_name}\";"); foreach (@{$fn->{ELEMENTS}}) { if (grep(/in/,@{$_->{DIRECTION}})) { - pidl_code "$dissectornames{$_->{NAME}}"; - pidl_code "offset = dissect_deferred_pointers(pinfo, tvb, offset, drep);"; + $self->pidl_code("$dissectornames{$_->{NAME}}"); + $self->pidl_code("offset = dissect_deferred_pointers(pinfo, tvb, offset, drep);"); } } - pidl_code "return offset;"; - deindent; - pidl_code "}\n"; - pidl_fn_end "$ifname\_dissect\_$fn_name\_request"; + $self->pidl_code("return offset;"); + $self->deindent; + $self->pidl_code("}\n"); + $self->pidl_fn_end("$ifname\_dissect\_$fn_name\_request"); } -sub Struct($$$) +sub Struct($$$$) { - my ($e,$name,$ifname) = @_; - my $dissectorname = "$ifname\_dissect\_struct\_".StripPrefixes($name, $conformance->{strip_prefixes}); + my ($self,$e,$name,$ifname) = @_; + my $dissectorname = "$ifname\_dissect\_struct\_".StripPrefixes($name, $self->{conformance}->{strip_prefixes}); - return if (defined($conformance->{noemit}->{StripPrefixes($name, $conformance->{strip_prefixes})})); + return if (defined($self->{conformance}->{noemit}->{StripPrefixes($name, $self->{conformance}->{strip_prefixes})})); - register_ett("ett_$ifname\_$name"); + $self->register_ett("ett_$ifname\_$name"); my $res = ""; - ($res.="\t".Element($_, $name, $ifname)."\n\n") foreach (@{$e->{ELEMENTS}}); + ($res.="\t".$self->Element($_, $name, $ifname)."\n\n") foreach (@{$e->{ELEMENTS}}); - pidl_hdr "int $dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *parent_tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 param _U_);"; + $self->pidl_hdr("int $dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *parent_tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 param _U_);"); - pidl_fn_start $dissectorname; - pidl_code "int"; - pidl_code "$dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *parent_tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 param _U_)"; - pidl_code "{"; - indent; - pidl_code "proto_item *item = NULL;"; - pidl_code "proto_tree *tree = NULL;"; - pidl_code "int old_offset;"; - pidl_code ""; + $self->pidl_fn_start($dissectorname); + $self->pidl_code("int"); + $self->pidl_code("$dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *parent_tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 param _U_)"); + $self->pidl_code("{"); + $self->indent; + $self->pidl_code("proto_item *item = NULL;"); + $self->pidl_code("proto_tree *tree = NULL;"); + $self->pidl_code("int old_offset;"); + $self->pidl_code(""); if ($e->{ALIGN} > 1) { - pidl_code "ALIGN_TO_$e->{ALIGN}_BYTES;"; + $self->pidl_code("ALIGN_TO_$e->{ALIGN}_BYTES;"); } - pidl_code ""; - - pidl_code "old_offset = offset;"; - pidl_code ""; - pidl_code "if (parent_tree) {"; - indent; - pidl_code "item = proto_tree_add_item(parent_tree, hf_index, tvb, offset, -1, TRUE);"; - pidl_code "tree = proto_item_add_subtree(item, ett_$ifname\_$name);"; - deindent; - pidl_code "}"; - - pidl_code "\n$res"; - - pidl_code "proto_item_set_len(item, offset-old_offset);\n"; - pidl_code "return offset;"; - deindent; - pidl_code "}\n"; - pidl_fn_end $dissectorname; - - register_type($name, "offset = $dissectorname(tvb,offset,pinfo,tree,drep,\@HF\@,\@PARAM\@);", "FT_NONE", "BASE_NONE", 0, "NULL", 0); + $self->pidl_code(""); + + $self->pidl_code("old_offset = offset;"); + $self->pidl_code(""); + $self->pidl_code("if (parent_tree) {"); + $self->indent; + $self->pidl_code("item = proto_tree_add_item(parent_tree, hf_index, tvb, offset, -1, TRUE);"); + $self->pidl_code("tree = proto_item_add_subtree(item, ett_$ifname\_$name);"); + $self->deindent; + $self->pidl_code("}"); + + $self->pidl_code("\n$res"); + + $self->pidl_code("proto_item_set_len(item, offset-old_offset);\n"); + $self->pidl_code("return offset;"); + $self->deindent; + $self->pidl_code("}\n"); + $self->pidl_fn_end($dissectorname); + + $self->register_type($name, "offset = $dissectorname(tvb,offset,pinfo,tree,drep,\@HF\@,\@PARAM\@);", "FT_NONE", "BASE_NONE", 0, "NULL", 0); } -sub Union($$$) +sub Union($$$$) { - my ($e,$name,$ifname) = @_; + my ($self,$e,$name,$ifname) = @_; - my $dissectorname = "$ifname\_dissect_".StripPrefixes($name, $conformance->{strip_prefixes}); + my $dissectorname = "$ifname\_dissect_".StripPrefixes($name, $self->{conformance}->{strip_prefixes}); - return if (defined($conformance->{noemit}->{StripPrefixes($name, $conformance->{strip_prefixes})})); + return if (defined($self->{conformance}->{noemit}->{StripPrefixes($name, $self->{conformance}->{strip_prefixes})})); - register_ett("ett_$ifname\_$name"); + $self->register_ett("ett_$ifname\_$name"); my $res = ""; foreach (@{$e->{ELEMENTS}}) { $res.="\n\t\t$_->{CASE}:\n"; if ($_->{TYPE} ne "EMPTY") { - $res.="\t\t\t".Element($_, $name, $ifname)."\n"; + $res.="\t\t\t".$self->Element($_, $name, $ifname)."\n"; } $res.="\t\tbreak;\n"; } @@ -600,68 +603,68 @@ sub Union($$$) $switch_dissect = "dissect_ndr_$e->{SWITCH_TYPE}"; } - pidl_fn_start $dissectorname; - pidl_code "static int"; - pidl_code "$dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *parent_tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 param _U_)"; - pidl_code "{"; - indent; - pidl_code "proto_item *item = NULL;"; - pidl_code "proto_tree *tree = NULL;"; - pidl_code "int old_offset;"; - pidl_code "$switch_type level;"; - pidl_code ""; + $self->pidl_fn_start($dissectorname); + $self->pidl_code("static int"); + $self->pidl_code("$dissectorname(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *parent_tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 param _U_)"); + $self->pidl_code("{"); + $self->indent; + $self->pidl_code("proto_item *item = NULL;"); + $self->pidl_code("proto_tree *tree = NULL;"); + $self->pidl_code("int old_offset;"); + $self->pidl_code("$switch_type level;"); + $self->pidl_code(""); if ($e->{ALIGN} > 1) { - pidl_code "ALIGN_TO_$e->{ALIGN}_BYTES;"; + $self->pidl_code("ALIGN_TO_$e->{ALIGN}_BYTES;"); } - pidl_code ""; + $self->pidl_code(""); - pidl_code "old_offset = offset;"; - pidl_code "if (parent_tree) {"; - indent; - pidl_code "item = proto_tree_add_text(parent_tree, tvb, offset, -1, \"$name\");"; - pidl_code "tree = proto_item_add_subtree(item, ett_$ifname\_$name);"; - deindent; - pidl_code "}"; + $self->pidl_code("old_offset = offset;"); + $self->pidl_code("if (parent_tree) {"); + $self->indent; + $self->pidl_code("item = proto_tree_add_text(parent_tree, tvb, offset, -1, \"$name\");"); + $self->pidl_code("tree = proto_item_add_subtree(item, ett_$ifname\_$name);"); + $self->deindent; + $self->pidl_code("}"); - pidl_code ""; + $self->pidl_code(""); - pidl_code "offset = $switch_dissect(tvb, offset, pinfo, tree, drep, hf_index, &level);"; + $self->pidl_code("offset = $switch_dissect(tvb, offset, pinfo, tree, drep, hf_index, &level);"); - pidl_code "switch(level) {$res\t}"; - pidl_code "proto_item_set_len(item, offset-old_offset);\n"; - pidl_code "return offset;"; - deindent; - pidl_code "}"; - pidl_fn_end $dissectorname; + $self->pidl_code("switch(level) {$res\t}"); + $self->pidl_code("proto_item_set_len(item, offset-old_offset);\n"); + $self->pidl_code("return offset;"); + $self->deindent; + $self->pidl_code("}"); + $self->pidl_fn_end($dissectorname); - register_type($name, "offset = $dissectorname(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_NONE", "BASE_NONE", 0, "NULL", 0); + $self->register_type($name, "offset = $dissectorname(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_NONE", "BASE_NONE", 0, "NULL", 0); } -sub Const($$) +sub Const($$$) { - my ($const,$ifname) = @_; + my ($self,$const,$ifname) = @_; if (!defined($const->{ARRAY_LEN}[0])) { - pidl_hdr "#define $const->{NAME}\t( $const->{VALUE} )\n"; + $self->pidl_hdr("#define $const->{NAME}\t( $const->{VALUE} )\n"); } else { - pidl_hdr "#define $const->{NAME}\t $const->{VALUE}\n"; + $self->pidl_hdr("#define $const->{NAME}\t $const->{VALUE}\n"); } } -sub Typedef($$$) +sub Typedef($$$$) { - my ($e,$name,$ifname) = @_; + my ($self,$e,$name,$ifname) = @_; - Type($e->{DATA}, $name, $ifname); + $self->Type($e->{DATA}, $name, $ifname); } -sub Type($$$) +sub Type($$$$) { - my ($e, $name, $ifname) = @_; + my ($self, $e, $name, $ifname) = @_; - PrintIdl DumpType($e->{ORIGINAL}); + $self->PrintIdl(DumpType($e->{ORIGINAL})); { ENUM => \&Enum, @@ -669,20 +672,20 @@ sub Type($$$) UNION => \&Union, BITMAP => \&Bitmap, TYPEDEF => \&Typedef - }->{$e->{TYPE}}->($e, $name, $ifname); + }->{$e->{TYPE}}->($self, $e, $name, $ifname); } -sub RegisterInterface($) +sub RegisterInterface($$) { - my ($x) = @_; + my ($self, $x) = @_; - pidl_fn_start "proto_register_dcerpc_$x->{NAME}"; - pidl_code "void proto_register_dcerpc_$x->{NAME}(void)"; - pidl_code "{"; - indent; + $self->pidl_fn_start("proto_register_dcerpc_$x->{NAME}"); + $self->pidl_code("void proto_register_dcerpc_$x->{NAME}(void)"); + $self->pidl_code("{"); + $self->indent; - $res{code}.=DumpHfList()."\n"; - $res{code}.="\n".DumpEttList(@ett)."\n"; + $self->{res}->{code}.=$self->DumpHfList()."\n"; + $self->{res}->{code}.="\n".DumpEttList($self->{ett})."\n"; if (defined($x->{UUID})) { # These can be changed to non-pidl_code names if the old dissectors @@ -696,140 +699,144 @@ sub RegisterInterface($) $name = $x->{PROPERTIES}->{helpstring}; } - if (defined($conformance->{protocols}->{$x->{NAME}})) { - $short_name = $conformance->{protocols}->{$x->{NAME}}->{SHORTNAME}; - $name = $conformance->{protocols}->{$x->{NAME}}->{LONGNAME}; - $filter_name = $conformance->{protocols}->{$x->{NAME}}->{FILTERNAME}; + if (defined($self->{conformance}->{protocols}->{$x->{NAME}})) { + $short_name = $self->{conformance}->{protocols}->{$x->{NAME}}->{SHORTNAME}; + $name = $self->{conformance}->{protocols}->{$x->{NAME}}->{LONGNAME}; + $filter_name = $self->{conformance}->{protocols}->{$x->{NAME}}->{FILTERNAME}; } - pidl_code "proto_dcerpc_$x->{NAME} = proto_register_protocol(".make_str($name).", ".make_str($short_name).", ".make_str($filter_name).");"; + $self->pidl_code("proto_dcerpc_$x->{NAME} = proto_register_protocol(".make_str($name).", ".make_str($short_name).", ".make_str($filter_name).");"); - pidl_code "proto_register_field_array(proto_dcerpc_$x->{NAME}, hf, array_length (hf));"; - pidl_code "proto_register_subtree_array(ett, array_length(ett));"; + $self->pidl_code("proto_register_field_array(proto_dcerpc_$x->{NAME}, hf, array_length (hf));"); + $self->pidl_code("proto_register_subtree_array(ett, array_length(ett));"); } else { - pidl_code "proto_dcerpc = proto_get_id_by_filter_name(\"dcerpc\");"; - pidl_code "proto_register_field_array(proto_dcerpc, hf, array_length(hf));"; - pidl_code "proto_register_subtree_array(ett, array_length(ett));"; + $self->pidl_code("proto_dcerpc = proto_get_id_by_filter_name(\"dcerpc\");"); + $self->pidl_code("proto_register_field_array(proto_dcerpc, hf, array_length(hf));"); + $self->pidl_code("proto_register_subtree_array(ett, array_length(ett));"); } - deindent; - pidl_code "}\n"; - pidl_fn_end "proto_register_dcerpc_$x->{NAME}"; + $self->deindent; + $self->pidl_code("}\n"); + $self->pidl_fn_end("proto_register_dcerpc_$x->{NAME}"); } -sub RegisterInterfaceHandoff($) +sub RegisterInterfaceHandoff($$) { - my $x = shift; + my ($self,$x) = @_; if (defined($x->{UUID})) { - pidl_fn_start "proto_reg_handoff_dcerpc_$x->{NAME}"; - pidl_code "void proto_reg_handoff_dcerpc_$x->{NAME}(void)"; - pidl_code "{"; - indent; - pidl_code "dcerpc_init_uuid(proto_dcerpc_$x->{NAME}, ett_dcerpc_$x->{NAME},"; - pidl_code "\t&uuid_dcerpc_$x->{NAME}, ver_dcerpc_$x->{NAME},"; - pidl_code "\t$x->{NAME}_dissectors, hf_$x->{NAME}_opnum);"; - deindent; - pidl_code "}"; - pidl_fn_end "proto_reg_handoff_dcerpc_$x->{NAME}"; - - $hf_used{"hf_$x->{NAME}_opnum"} = 1; + $self->pidl_fn_start("proto_reg_handoff_dcerpc_$x->{NAME}"); + $self->pidl_code("void proto_reg_handoff_dcerpc_$x->{NAME}(void)"); + $self->pidl_code("{"); + $self->indent; + $self->pidl_code("dcerpc_init_uuid(proto_dcerpc_$x->{NAME}, ett_dcerpc_$x->{NAME},"); + $self->pidl_code("\t&uuid_dcerpc_$x->{NAME}, ver_dcerpc_$x->{NAME},"); + $self->pidl_code("\t$x->{NAME}_dissectors, hf_$x->{NAME}_opnum);"); + $self->deindent; + $self->pidl_code("}"); + $self->pidl_fn_end("proto_reg_handoff_dcerpc_$x->{NAME}"); + + $self->{hf_used}->{"hf_$x->{NAME}_opnum"} = 1; } } sub ProcessInclude { + my $self = shift; my @includes = @_; foreach (@includes) { - pidl_hdr "#include \"$_\""; + $self->pidl_hdr("#include \"$_\""); } - pidl_hdr ""; + $self->pidl_hdr(""); } sub ProcessImport { + my $self = shift; my @imports = @_; foreach (@imports) { next if($_ eq "security"); s/\.idl\"$//; s/^\"//; - pidl_hdr "#include \"packet-dcerpc-$_\.h\""; + $self->pidl_hdr("#include \"packet-dcerpc-$_\.h\""); } - pidl_hdr ""; + $self->pidl_hdr(""); } -sub ProcessInterface($) +sub ProcessInterface($$) { - my ($x) = @_; + my ($self, $x) = @_; - push(@{$conformance->{strip_prefixes}}, $x->{NAME}); + push(@{$self->{conformance}->{strip_prefixes}}, $x->{NAME}); my $define = "__PACKET_DCERPC_" . uc($_->{NAME}) . "_H"; - pidl_hdr "#ifndef $define"; - pidl_hdr "#define $define"; - pidl_hdr ""; + $self->pidl_hdr("#ifndef $define"); + $self->pidl_hdr("#define $define"); + $self->pidl_hdr(""); - pidl_def "static gint proto_dcerpc_$x->{NAME} = -1;"; - register_ett("ett_dcerpc_$x->{NAME}"); - register_hf_field("hf_$x->{NAME}_opnum", "Operation", "$x->{NAME}.opnum", "FT_UINT16", "BASE_DEC", "NULL", 0, ""); + $self->pidl_def("static gint proto_dcerpc_$x->{NAME} = -1;"); + $self->register_ett("ett_dcerpc_$x->{NAME}"); + $self->register_hf_field("hf_$x->{NAME}_opnum", "Operation", "$x->{NAME}.opnum", "FT_UINT16", "BASE_DEC", "NULL", 0, ""); if (defined($x->{UUID})) { my $if_uuid = $x->{UUID}; - pidl_def "/* Version information */\n\n"; + $self->pidl_def("/* Version information */\n\n"); - pidl_def "static e_uuid_t uuid_dcerpc_$x->{NAME} = {"; - pidl_def "\t0x" . substr($if_uuid, 1, 8) + $self->pidl_def("static e_uuid_t uuid_dcerpc_$x->{NAME} = {"); + $self->pidl_def("\t0x" . substr($if_uuid, 1, 8) . ", 0x" . substr($if_uuid, 10, 4) - . ", 0x" . substr($if_uuid, 15, 4) . ","; - pidl_def "\t{ 0x" . substr($if_uuid, 20, 2) + . ", 0x" . substr($if_uuid, 15, 4) . ","); + $self->pidl_def("\t{ 0x" . substr($if_uuid, 20, 2) . ", 0x" . substr($if_uuid, 22, 2) . ", 0x" . substr($if_uuid, 25, 2) . ", 0x" . substr($if_uuid, 27, 2) . ", 0x" . substr($if_uuid, 29, 2) . ", 0x" . substr($if_uuid, 31, 2) . ", 0x" . substr($if_uuid, 33, 2) - . ", 0x" . substr($if_uuid, 35, 2) . " }"; - pidl_def "};"; + . ", 0x" . substr($if_uuid, 35, 2) . " }"); + $self->pidl_def("};"); my $maj = $x->{VERSION}; $maj =~ s/\.(.*)$//g; - pidl_def "static guint16 ver_dcerpc_$x->{NAME} = $maj;"; - pidl_def ""; + $self->pidl_def("static guint16 ver_dcerpc_$x->{NAME} = $maj;"); + $self->pidl_def(""); } $return_types{$x->{NAME}} = {}; - Interface($x); + $self->Interface($x); - pidl_code "\n".DumpFunctionTable($x); + $self->pidl_code("\n".DumpFunctionTable($x)); foreach (keys %{$return_types{$x->{NAME}}}) { my ($type, $desc) = @{$return_types{$x->{NAME}}->{$_}}; - my $dt = find_type($type); + my $dt = $self->find_type($type); $dt or die("Unable to find information about return type `$type'"); - register_hf_field("hf_$x->{NAME}_$_", $desc, "$x->{NAME}.$_", $dt->{FT_TYPE}, "BASE_HEX", $dt->{VALSSTRING}, 0, ""); - $hf_used{"hf_$x->{NAME}_$_"} = 1; + $self->register_hf_field("hf_$x->{NAME}_$_", $desc, "$x->{NAME}.$_", $dt->{FT_TYPE}, "BASE_HEX", $dt->{VALSSTRING}, 0, ""); + $self->{hf_used}->{"hf_$x->{NAME}_$_"} = 1; } - RegisterInterface($x); - RegisterInterfaceHandoff($x); + $self->RegisterInterface($x); + $self->RegisterInterfaceHandoff($x); - pidl_hdr "#endif /* $define */"; + $self->pidl_hdr("#endif /* $define */"); } -sub find_type($) +sub find_type($$) { - my $n = shift; + my ($self, $n) = @_; - return $conformance->{types}->{$n}; + return $self->{conformance}->{types}->{$n}; } -sub register_type($$$$$$$) +sub register_type($$$$$$$$) { - my ($type,$call,$ft,$base,$mask,$vals,$length) = @_; + my ($self, $type,$call,$ft,$base,$mask,$vals,$length) = @_; - $conformance->{types}->{$type} = { + return if (defined($self->{conformance}->{types}->{$type})); + + $self->{conformance}->{types}->{$type} = { NAME => $type, DISSECTOR_NAME => $call, FT_TYPE => $ft, @@ -841,61 +848,57 @@ sub register_type($$$$$$$) } # Loads the default types -sub Initialize($) +sub Initialize($$) { - my $cnf_file = shift; + my ($self, $cnf_file) = @_; - $conformance = { + $self->{conformance} = { imports => {}, header_fields=> {} }; - ReadConformance($cnf_file, $conformance) or print STDERR "warning: No conformance file `$cnf_file'\n"; + ReadConformance($cnf_file, $self->{conformance}) or print STDERR "warning: No conformance file `$cnf_file'\n"; foreach my $bytes (qw(1 2 4 8)) { my $bits = $bytes * 8; - register_type("uint$bits", "offset = PIDL_dissect_uint$bits(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_UINT$bits", "BASE_DEC", 0, "NULL", $bytes); - register_type("int$bits", "offset = PIDL_dissect_uint$bits(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_INT$bits", "BASE_DEC", 0, "NULL", $bytes); + $self->register_type("uint$bits", "offset = PIDL_dissect_uint$bits(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_UINT$bits", "BASE_DEC", 0, "NULL", $bytes); + $self->register_type("int$bits", "offset = PIDL_dissect_uint$bits(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);", "FT_INT$bits", "BASE_DEC", 0, "NULL", $bytes); } - register_type("udlong", "offset = dissect_ndr_duint32(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);", "FT_UINT64", "BASE_DEC", 0, "NULL", 4); - register_type("bool8", "offset = PIDL_dissect_uint8(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_INT8", "BASE_DEC", 0, "NULL", 1); - register_type("char", "offset = PIDL_dissect_uint8(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_INT8", "BASE_DEC", 0, "NULL", 1); - register_type("long", "offset = PIDL_dissect_uint32(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_INT32", "BASE_DEC", 0, "NULL", 4); - register_type("dlong", "offset = dissect_ndr_duint32(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);","FT_INT64", "BASE_DEC", 0, "NULL", 8); - register_type("GUID", "offset = dissect_ndr_uuid_t(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);","FT_GUID", "BASE_NONE", 0, "NULL", 4); - register_type("policy_handle", "offset = PIDL_dissect_policy_hnd(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_BYTES", "BASE_NONE", 0, "NULL", 4); - register_type("NTTIME", "offset = dissect_ndr_nt_NTTIME(tvb, offset, pinfo, tree, drep, \@HF\@);","FT_ABSOLUTE_TIME", "BASE_NONE", 0, "NULL", 4); - register_type("NTTIME_hyper", "offset = dissect_ndr_nt_NTTIME(tvb, offset, pinfo, tree, drep, \@HF\@);","FT_ABSOLUTE_TIME", "BASE_NONE", 0, "NULL", 4); - register_type("time_t", "offset = dissect_ndr_time_t(tvb, offset, pinfo,tree, drep, \@HF\@, NULL);","FT_ABSOLUTE_TIME", "BASE_DEC", 0, "NULL", 4); - register_type("NTTIME_1sec", "offset = dissect_ndr_nt_NTTIME(tvb, offset, pinfo, tree, drep, \@HF\@);", "FT_ABSOLUTE_TIME", "BASE_NONE", 0, "NULL", 4); - register_type("SID", " + $self->register_type("udlong", "offset = dissect_ndr_duint32(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);", "FT_UINT64", "BASE_DEC", 0, "NULL", 4); + $self->register_type("bool8", "offset = PIDL_dissect_uint8(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_INT8", "BASE_DEC", 0, "NULL", 1); + $self->register_type("char", "offset = PIDL_dissect_uint8(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_INT8", "BASE_DEC", 0, "NULL", 1); + $self->register_type("long", "offset = PIDL_dissect_uint32(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_INT32", "BASE_DEC", 0, "NULL", 4); + $self->register_type("dlong", "offset = dissect_ndr_duint32(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);","FT_INT64", "BASE_DEC", 0, "NULL", 8); + $self->register_type("GUID", "offset = dissect_ndr_uuid_t(tvb, offset, pinfo, tree, drep, \@HF\@, NULL);","FT_GUID", "BASE_NONE", 0, "NULL", 4); + $self->register_type("policy_handle", "offset = PIDL_dissect_policy_hnd(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_BYTES", "BASE_NONE", 0, "NULL", 4); + $self->register_type("NTTIME", "offset = dissect_ndr_nt_NTTIME(tvb, offset, pinfo, tree, drep, \@HF\@);","FT_ABSOLUTE_TIME", "BASE_NONE", 0, "NULL", 4); + $self->register_type("NTTIME_hyper", "offset = dissect_ndr_nt_NTTIME(tvb, offset, pinfo, tree, drep, \@HF\@);","FT_ABSOLUTE_TIME", "BASE_NONE", 0, "NULL", 4); + $self->register_type("time_t", "offset = dissect_ndr_time_t(tvb, offset, pinfo,tree, drep, \@HF\@, NULL);","FT_ABSOLUTE_TIME", "BASE_DEC", 0, "NULL", 4); + $self->register_type("NTTIME_1sec", "offset = dissect_ndr_nt_NTTIME(tvb, offset, pinfo, tree, drep, \@HF\@);", "FT_ABSOLUTE_TIME", "BASE_NONE", 0, "NULL", 4); + $self->register_type("SID", " dcerpc_info *di = (dcerpc_info *)pinfo->private_data; di->hf_index = \@HF\@; offset = dissect_ndr_nt_SID_with_options(tvb, offset, pinfo, tree, drep, param); ","FT_STRING", "BASE_DEC", 0, "NULL", 4); - register_type("WERROR", + $self->register_type("WERROR", "offset = PIDL_dissect_uint32(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_UINT32", "BASE_DEC", 0, "VALS(WERR_errors)", 4); - register_type("NTSTATUS", + $self->register_type("NTSTATUS", "offset = PIDL_dissect_uint32(tvb, offset, pinfo, tree, drep, \@HF\@, \@PARAM\@);","FT_UINT32", "BASE_DEC", 0, "VALS(NT_errors)", 4); } ##################################################################### # Generate Wireshark parser and header code -sub Parse($$$$) +sub Parse($$$$$) { - my($ndr,$idl_file,$h_filename,$cnf_file) = @_; - Initialize($cnf_file); - - return (undef, undef) if defined($conformance->{noemit_dissector}); - - $tabs = ""; + my($self,$ndr,$idl_file,$h_filename,$cnf_file) = @_; + + $self->Initialize($cnf_file); - %res = (code=>"",def=>"",hdr=>""); - @ett = (); + return (undef, undef) if defined($self->{conformance}->{noemit_dissector}); my $notice = "/* DO NOT EDIT @@ -910,60 +913,50 @@ sub Parse($$$$) "; - pidl_hdr $notice; - - $res{headers} = "\n"; - $res{headers} .= "#ifdef HAVE_CONFIG_H\n"; - $res{headers} .= "#include \"config.h\"\n"; - $res{headers} .= "#endif\n\n"; - - $res{headers} .= "#ifdef _MSC_VER\n"; - $res{headers} .= "#pragma warning(disable:4005)\n"; - $res{headers} .= "#pragma warning(disable:4013)\n"; - $res{headers} .= "#pragma warning(disable:4018)\n"; - $res{headers} .= "#pragma warning(disable:4101)\n"; - $res{headers} .= "#endif\n\n"; - - + $self->pidl_hdr($notice); - $res{headers} .= "#include <glib.h>\n"; - $res{headers} .= "#include <string.h>\n"; - $res{headers} .= "#include <epan/packet.h>\n\n"; + $self->{res}->{headers} = "\n"; + $self->{res}->{headers} .= "#ifdef HAVE_CONFIG_H\n"; + $self->{res}->{headers} .= "#include \"config.h\"\n"; + $self->{res}->{headers} .= "#endif\n\n"; + $self->{res}->{headers} .= "#include <glib.h>\n"; + $self->{res}->{headers} .= "#include <string.h>\n"; + $self->{res}->{headers} .= "#include <epan/packet.h>\n\n"; - $res{headers} .= "#include \"packet-dcerpc.h\"\n"; - $res{headers} .= "#include \"packet-dcerpc-nt.h\"\n"; - $res{headers} .= "#include \"packet-windows-common.h\"\n"; + $self->{res}->{headers} .= "#include \"packet-dcerpc.h\"\n"; + $self->{res}->{headers} .= "#include \"packet-dcerpc-nt.h\"\n"; + $self->{res}->{headers} .= "#include \"packet-windows-common.h\"\n"; my $h_basename = basename($h_filename); - $res{headers} .= "#include \"$h_basename\"\n"; - pidl_code ""; + $self->{res}->{headers} .= "#include \"$h_basename\"\n"; + $self->pidl_code(""); # Wireshark protocol registration foreach (@$ndr) { - ProcessInterface($_) if ($_->{TYPE} eq "INTERFACE"); - ProcessImport(@{$_->{PATHS}}) if ($_->{TYPE} eq "IMPORT"); - ProcessInclude(@{$_->{PATHS}}) if ($_->{TYPE} eq "INCLUDE"); + $self->ProcessInterface($_) if ($_->{TYPE} eq "INTERFACE"); + $self->ProcessImport(@{$_->{PATHS}}) if ($_->{TYPE} eq "IMPORT"); + $self->ProcessInclude(@{$_->{PATHS}}) if ($_->{TYPE} eq "INCLUDE"); } - $res{ett} = DumpEttDeclaration(@ett); - $res{hf} = DumpHfDeclaration(); + $self->{res}->{ett} = DumpEttDeclaration($self->{ett}); + $self->{res}->{hf} = $self->DumpHfDeclaration(); my $parser = $notice; - $parser.= $res{headers}; - $parser.=$res{ett}; - $parser.=$res{hf}; - $parser.=$res{def}; - if (exists ($conformance->{override})) { - $parser.=$conformance->{override}; + $parser.= $self->{res}->{headers}; + $parser.=$self->{res}->{ett}; + $parser.=$self->{res}->{hf}; + $parser.=$self->{res}->{def}; + if (exists ($self->{conformance}->{override})) { + $parser.=$self->{conformance}->{override}; } - $parser.=$res{code}; + $parser.=$self->{res}->{code}; my $header = "/* autogenerated by pidl */\n\n"; - $header.=$res{hdr}; + $header.=$self->{res}->{hdr}; - CheckUsed($conformance); + $self->CheckUsed($self->{conformance}); return ($parser,$header); } @@ -972,18 +965,18 @@ sub Parse($$$$) # ETT ############################################################################### -sub register_ett($) +sub register_ett($$) { - my $name = shift; + my ($self, $name) = @_; - push (@ett, $name); + push (@{$self->{ett}}, $name); } sub DumpEttList { - my @ett = @_; + my ($ett) = @_; my $res = "\tstatic gint *ett[] = {\n"; - foreach (@ett) { + foreach (@$ett) { $res .= "\t\t&$_,\n"; } @@ -992,9 +985,9 @@ sub DumpEttList sub DumpEttDeclaration { - my @ett = @_; + my ($ett) = @_; my $res = "\n/* Ett declarations */\n"; - foreach (@ett) { + foreach (@$ett) { $res .= "static gint $_ = -1;\n"; } @@ -1005,16 +998,16 @@ sub DumpEttDeclaration # HF ############################################################################### -sub register_hf_field($$$$$$$$) +sub register_hf_field($$$$$$$$$) { - my ($index,$name,$filter_name,$ft_type,$base_type,$valsstring,$mask,$blurb) = @_; + my ($self,$index,$name,$filter_name,$ft_type,$base_type,$valsstring,$mask,$blurb) = @_; - if (defined ($conformance->{hf_renames}->{$index})) { - $conformance->{hf_renames}->{$index}->{USED} = 1; - return $conformance->{hf_renames}->{$index}->{NEWNAME}; + if (defined ($self->{conformance}->{hf_renames}->{$index})) { + $self->{conformance}->{hf_renames}->{$index}->{USED} = 1; + return $self->{conformance}->{hf_renames}->{$index}->{NEWNAME}; } - $conformance->{header_fields}->{$index} = { + $self->{conformance}->{header_fields}->{$index} = { INDEX => $index, NAME => $name, FILTER => $filter_name, @@ -1026,22 +1019,23 @@ sub register_hf_field($$$$$$$$) }; if ((not defined($blurb) or $blurb eq "") and - defined($conformance->{fielddescription}->{$index})) { - $conformance->{header_fields}->{$index}->{BLURB} = - $conformance->{fielddescription}->{$index}->{DESCRIPTION}; - $conformance->{fielddescription}->{$index}->{USED} = 1; + defined($self->{conformance}->{fielddescription}->{$index})) { + $self->{conformance}->{header_fields}->{$index}->{BLURB} = + $self->{conformance}->{fielddescription}->{$index}->{DESCRIPTION}; + $self->{conformance}->{fielddescription}->{$index}->{USED} = 1; } return $index; } -sub DumpHfDeclaration() +sub DumpHfDeclaration($) { + my ($self) = @_; my $res = ""; $res = "\n/* Header field declarations */\n"; - foreach (keys %{$conformance->{header_fields}}) + foreach (keys %{$self->{conformance}->{header_fields}}) { $res .= "static gint $_ = -1;\n"; } @@ -1049,11 +1043,12 @@ sub DumpHfDeclaration() return "$res\n"; } -sub DumpHfList() +sub DumpHfList($) { + my ($self) = @_; my $res = "\tstatic hf_register_info hf[] = {\n"; - foreach (values %{$conformance->{header_fields}}) + foreach (values %{$self->{conformance}->{header_fields}}) { $res .= "\t{ &$_->{INDEX}, { ".make_str($_->{NAME}).", ".make_str($_->{FILTER}).", $_->{FT_TYPE}, $_->{BASE_TYPE}, $_->{VALSSTRING}, $_->{MASK}, ".make_str($_->{BLURB}).", HFILL }}, @@ -1085,11 +1080,11 @@ sub DumpFunctionTable($) return "$res};\n"; } -sub CheckUsed($) +sub CheckUsed($$) { - my $conformance = shift; + my ($self, $conformance) = @_; foreach (values %{$conformance->{header_fields}}) { - if (not defined($hf_used{$_->{INDEX}})) { + if (not defined($self->{hf_used}->{$_->{INDEX}})) { warning($_->{POS}, "hf field `$_->{INDEX}' not used"); } } diff --git a/tools/pidl/pidl b/tools/pidl/pidl index b04e278902..5ce9b0f004 100755 --- a/tools/pidl/pidl +++ b/tools/pidl/pidl @@ -645,7 +645,8 @@ sub process_file($) if (defined($opt_ejs)) { require Parse::Pidl::Samba4::EJS; - my ($hdr,$prsr) = Parse::Pidl::Samba4::EJS::Parse($ndr, $h_filename); + my $generator = new Parse::Pidl::Samba4::EJS(); + my ($hdr,$prsr) = $generator->Parse($ndr, $h_filename); FileSave("$outputdir/ndr_$basename\_ejs.c", $prsr); FileSave("$outputdir/ndr_$basename\_ejs.h", $hdr); } @@ -659,8 +660,8 @@ sub process_file($) if (defined($opt_ndr_parser)) { my $parser_fname = ($opt_ndr_parser or "$outputdir/ndr_$basename.c"); require Parse::Pidl::Samba4::NDR::Parser; - my ($header,$parser) = Parse::Pidl::Samba4::NDR::Parser::Parse($ndr, $gen_header, $h_filename); - + my $generator = new Parse::Pidl::Samba4::NDR::Parser(); + my ($header,$parser) = $generator->Parse($ndr, $gen_header, $h_filename); FileSave($parser_fname, $parser); FileSave($h_filename, $header); @@ -675,7 +676,8 @@ sub process_file($) my $cnffile = $idl_file; $cnffile =~ s/\.idl$/\.cnf/; - my ($dp, $dh) = Parse::Pidl::Wireshark::NDR::Parse($ndr, $idl_file, $eheader, $cnffile); + my $generator = new Parse::Pidl::Wireshark::NDR(); + my ($dp, $dh) = $generator->Parse($ndr, $idl_file, $eheader, $cnffile); FileSave($eparser, $dp) if defined($dp); FileSave($eheader, $dh) if defined($dh); } @@ -685,7 +687,8 @@ sub process_file($) my $tdr_header = $tdr_parser; $tdr_header =~ s/\.c$/\.h/; require Parse::Pidl::Samba4::TDR; - my ($hdr,$prsr) = Parse::Pidl::Samba4::TDR::Parser($pidl, $tdr_header, $gen_header); + my $generator = new Parse::Pidl::Samba4::TDR(); + my ($hdr,$prsr) = $generator->Parser($pidl, $tdr_header, $gen_header); FileSave($tdr_parser, $prsr); FileSave($tdr_header, $hdr); } @@ -699,7 +702,8 @@ sub process_file($) my $client = ($opt_samba3_ndr_client or "$outputdir/cli_$basename.c"); my $header = $client; $header =~ s/\.c$/\.h/; require Parse::Pidl::Samba3::ClientNDR; - my ($c_code,$h_code) = Parse::Pidl::Samba3::ClientNDR::Parse($ndr, $header, $h_filename); + my $generator = new Parse::Pidl::Samba3::ClientNDR(); + my ($c_code,$h_code) = $generator->Parse($ndr, $header, $h_filename); FileSave($client, $c_code); FileSave($header, $h_code); } diff --git a/tools/pidl/tests/Util.pm b/tools/pidl/tests/Util.pm index a65cd89c55..48a08b5749 100644 --- a/tools/pidl/tests/Util.pm +++ b/tools/pidl/tests/Util.pm @@ -54,7 +54,8 @@ sub test_samba4_ndr ok(defined($header), "($name) generate generic header"); my $pndr = Parse::Pidl::NDR::Parse($pidl); ok(defined($pndr), "($name) generate NDR tree"); - my ($ndrheader,$ndrparser) = Parse::Pidl::Samba4::NDR::Parser::Parse($pndr, undef, undef); + my $generator = new Parse::Pidl::Samba4::NDR::Parser(); + my ($ndrheader,$ndrparser) = $generator->Parse($pndr, undef, undef); ok(defined($ndrparser), "($name) generate NDR parser"); ok(defined($ndrheader), "($name) generate NDR header"); diff --git a/tools/pidl/tests/samba-ejs.pl b/tools/pidl/tests/samba-ejs.pl index 39fc22329c..adc00e224f 100755 --- a/tools/pidl/tests/samba-ejs.pl +++ b/tools/pidl/tests/samba-ejs.pl @@ -10,7 +10,7 @@ use lib "$RealBin"; use Util; use Parse::Pidl::Util qw(MyDumper); use Parse::Pidl::Samba4::EJS qw(get_pointer_to get_value_of check_null_pointer - $res $res_hdr fn_declare TypeFunctionName); + fn_declare TypeFunctionName); is("&foo", get_pointer_to("foo")); is("&(&foo)", get_pointer_to(get_pointer_to("foo"))); @@ -21,25 +21,24 @@ is("foo", get_value_of("&foo")); is("*foo", get_value_of("foo")); is("**foo", get_value_of("*foo")); -$res = ""; -check_null_pointer("bla"); -is($res, ""); - -$res = ""; -check_null_pointer("*bla"); -is($res, "if (bla == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;\n"); - -$res = ""; -$res_hdr = ""; -fn_declare({ PROPERTIES => { public => 1 } }, "myproto(int x)"); -is($res, "_PUBLIC_ myproto(int x)\n"); -is($res_hdr, "myproto(int x);\n"); - -$res = ""; -$res_hdr = ""; -fn_declare({ PROPERTIES => {} }, "mybla(int foo)"); -is($res, "static mybla(int foo)\n"); -is($res_hdr, ""); +my $ejs = new Parse::Pidl::Samba4::EJS(); + +$ejs->check_null_pointer("bla"); +is($ejs->{res}, ""); + +$ejs = new Parse::Pidl::Samba4::EJS(); +$ejs->check_null_pointer("*bla"); +is($ejs->{res}, "if (bla == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;\n"); + +$ejs = new Parse::Pidl::Samba4::EJS(); +$ejs->fn_declare({ PROPERTIES => { public => 1 } }, "myproto(int x)"); +is($ejs->{res}, "_PUBLIC_ myproto(int x)\n"); +is($ejs->{res_hdr}, "myproto(int x);\n"); + +$ejs = new Parse::Pidl::Samba4::EJS(); +$ejs->fn_declare({ PROPERTIES => {} }, "mybla(int foo)"); +is($ejs->{res}, "static mybla(int foo)\n"); +is($ejs->{res_hdr}, ""); is(TypeFunctionName("ejs_pull", "uint32"), "ejs_pull_uint32"); is(TypeFunctionName("ejs_pull", {TYPE => "ENUM", NAME => "bar"}), "ejs_pull_ENUM_bar"); diff --git a/tools/pidl/tests/samba-ndr.pl b/tools/pidl/tests/samba-ndr.pl index cf79cd006f..05c3c1c0df 100755 --- a/tools/pidl/tests/samba-ndr.pl +++ b/tools/pidl/tests/samba-ndr.pl @@ -8,10 +8,11 @@ use Test::More tests => 41; use FindBin qw($RealBin); use lib "$RealBin"; use Util; +use strict; use Parse::Pidl::Util qw(MyDumper); use Parse::Pidl::Samba4::NDR::Parser qw(check_null_pointer GenerateFunctionInEnv GenerateFunctionOutEnv GenerateStructEnv - EnvSubstituteValue NeededFunction NeededElement NeededType $res + EnvSubstituteValue NeededFunction NeededElement NeededType NeededInterface TypeFunctionName ParseElementPrint); my $output; @@ -260,21 +261,21 @@ is_deeply($needed, { ndr_pull_bla => 1, ndr_push_bla => 1, ndr_print_bla => 1, ndr_pull_bar => 1, ndr_push_bar => 1, ndr_bar_to_rep => 1, ndr_rep_to_bar => 1}); -$res = ""; -Parse::Pidl::Samba4::NDR::Parser::ParseStructPush({ +my $generator = new Parse::Pidl::Samba4::NDR::Parser(); +$generator->ParseStructPush({ NAME => "mystruct", TYPE => "STRUCT", PROPERTIES => {}, ALIGN => 4, ELEMENTS => [ ]}, "x"); -is($res, "if (ndr_flags & NDR_SCALARS) { +is($generator->{res}, "if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); } if (ndr_flags & NDR_BUFFERS) { } "); -$res = ""; +$generator = new Parse::Pidl::Samba4::NDR::Parser(); my $e = { NAME => "el1", TYPE => "mytype", @@ -283,14 +284,14 @@ my $e = { LEVELS => [ { LEVEL_INDEX => 0, TYPE => "DATA", DATA_TYPE => "mytype" } ] }; -Parse::Pidl::Samba4::NDR::Parser::ParseStructPush({ +$generator->ParseStructPush({ NAME => "mystruct", TYPE => "STRUCT", PROPERTIES => {}, ALIGN => 4, SURROUNDING_ELEMENT => $e, ELEMENTS => [ $e ]}, "x"); -is($res, "if (ndr_flags & NDR_SCALARS) { +is($generator->{res}, "if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_string_array_size(ndr, x->el1))); NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_mytype(ndr, NDR_SCALARS, &x->el1)); @@ -305,21 +306,21 @@ is(TypeFunctionName("ndr_pull", {TYPE => "TYPEDEF", NAME => "bar", DATA => undef is(TypeFunctionName("ndr_push", {TYPE => "STRUCT", NAME => "bar"}), "ndr_push_STRUCT_bar"); # check noprint works -$res = ""; -ParseElementPrint({ NAME => "x", TYPE => "rt", REPRESENTATION_TYPE => "rt", +$generator = new Parse::Pidl::Samba4::NDR::Parser(); +$generator->ParseElementPrint({ NAME => "x", TYPE => "rt", REPRESENTATION_TYPE => "rt", PROPERTIES => { noprint => 1}, LEVELS => [ { TYPE => "DATA", DATA_TYPE => "rt"} ]}, "var", { "x" => "r->foobar" } ); -is($res, ""); +is($generator->{res}, ""); -$res = ""; -ParseElementPrint({ NAME => "x", TYPE => "rt", REPRESENTATION_TYPE => "rt", +$generator = new Parse::Pidl::Samba4::NDR::Parser(); +$generator->ParseElementPrint({ NAME => "x", TYPE => "rt", REPRESENTATION_TYPE => "rt", PROPERTIES => {}, LEVELS => [ { TYPE => "DATA", DATA_TYPE => "rt" }]}, "var", { "x" => "r->foobar" } ); -is($res, "ndr_print_rt(ndr, \"x\", &var);\n"); +is($generator->{res}, "ndr_print_rt(ndr, \"x\", &var);\n"); # make sure that a print function for an element with value() set works -$res = ""; -ParseElementPrint({ NAME => "x", TYPE => "uint32", REPRESENTATION_TYPE => "uint32", +$generator = new Parse::Pidl::Samba4::NDR::Parser(); +$generator->ParseElementPrint({ NAME => "x", TYPE => "uint32", REPRESENTATION_TYPE => "uint32", PROPERTIES => { value => "23" }, LEVELS => [ { TYPE => "DATA", DATA_TYPE => "uint32"} ]}, "var", { "x" => "r->foobar" } ); -is($res, "ndr_print_uint32(ndr, \"x\", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?23:var);\n"); +is($generator->{res}, "ndr_print_uint32(ndr, \"x\", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?23:var);\n"); diff --git a/tools/pidl/tests/samba3-cli.pl b/tools/pidl/tests/samba3-cli.pl index 1d1bae8550..c5537c145e 100755 --- a/tools/pidl/tests/samba3-cli.pl +++ b/tools/pidl/tests/samba3-cli.pl @@ -9,8 +9,7 @@ use FindBin qw($RealBin); use lib "$RealBin"; use Util; use Parse::Pidl::Util qw(MyDumper); -use Parse::Pidl::Samba3::ClientNDR qw(GenerateFunctionInEnv ParseFunction $res - $res_hdr); +use Parse::Pidl::Samba3::ClientNDR qw(GenerateFunctionInEnv ParseFunction); # Make sure GenerateFunctionInEnv and GenerateFunctionOutEnv work my $fn = { ELEMENTS => [ { DIRECTION => ["in"], NAME => "foo" } ] }; @@ -22,9 +21,11 @@ is_deeply({ "foo" => "r.in.foo" }, GenerateFunctionInEnv($fn)); $fn = { ELEMENTS => [ { DIRECTION => ["out"], NAME => "foo" } ] }; is_deeply({ }, GenerateFunctionInEnv($fn)); +my $x = new Parse::Pidl::Samba3::ClientNDR(); + $fn = { NAME => "bar", ELEMENTS => [ ] }; -ParseFunction("foo", $fn); -is($res, "NTSTATUS rpccli_bar(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx) +$x->ParseFunction("foo", $fn); +is($x->{res}, "NTSTATUS rpccli_bar(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx) { \tstruct bar r; \tNTSTATUS status; diff --git a/tools/pidl/tests/tdr.pl b/tools/pidl/tests/tdr.pl index 35e54f53fc..d6cd7a03d4 100755 --- a/tools/pidl/tests/tdr.pl +++ b/tools/pidl/tests/tdr.pl @@ -8,21 +8,23 @@ use Test::More tests => 6; use FindBin qw($RealBin); use lib "$RealBin"; use Util; -use Parse::Pidl::Samba4::TDR qw($ret $ret_hdr ParserType); +use Parse::Pidl::Samba4::TDR qw(ParserType); -ParserType({TYPE => "STRUCT", NAME => "foo", PROPERTIES => {public => 1}}, "pull"); -is($ret, "NTSTATUS tdr_pull_foo (struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, struct foo *v) +my $tdr = new Parse::Pidl::Samba4::TDR(); + +$tdr->ParserType({TYPE => "STRUCT", NAME => "foo", PROPERTIES => {public => 1}}, "pull"); +is($tdr->{ret}, "NTSTATUS tdr_pull_foo (struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, struct foo *v) { return NT_STATUS_OK; } "); -is($ret_hdr, "NTSTATUS tdr_pull_foo (struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, struct foo *v);\n"); +is($tdr->{ret_hdr}, "NTSTATUS tdr_pull_foo (struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, struct foo *v);\n"); -$ret = ""; $ret_hdr = ""; -ParserType({TYPE => "UNION", NAME => "bar", PROPERTIES => {public => 1}}, "pull"); -is($ret, "NTSTATUS tdr_pull_bar(struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, int level, union bar *v) +$tdr = new Parse::Pidl::Samba4::TDR(); +$tdr->ParserType({TYPE => "UNION", NAME => "bar", PROPERTIES => {public => 1}}, "pull"); +is($tdr->{ret}, "NTSTATUS tdr_pull_bar(struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, int level, union bar *v) { switch (level) { } @@ -31,12 +33,11 @@ is($ret, "NTSTATUS tdr_pull_bar(struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, int l } "); -is($ret_hdr, "NTSTATUS tdr_pull_bar(struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, int level, union bar *v);\n"); - -$ret = ""; $ret_hdr = ""; +is($tdr->{ret_hdr}, "NTSTATUS tdr_pull_bar(struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, int level, union bar *v);\n"); -ParserType({TYPE => "UNION", NAME => "bar", PROPERTIES => {}}, "pull"); -is($ret, "static NTSTATUS tdr_pull_bar(struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, int level, union bar *v) +$tdr = new Parse::Pidl::Samba4::TDR(); +$tdr->ParserType({TYPE => "UNION", NAME => "bar", PROPERTIES => {}}, "pull"); +is($tdr->{ret}, "static NTSTATUS tdr_pull_bar(struct tdr_pull *tdr, TALLOC_CTX *mem_ctx, int level, union bar *v) { switch (level) { } @@ -45,4 +46,4 @@ is($ret, "static NTSTATUS tdr_pull_bar(struct tdr_pull *tdr, TALLOC_CTX *mem_ctx } "); -is($ret_hdr, ""); +is($tdr->{ret_hdr}, ""); diff --git a/tools/pidl/tests/wireshark-conf.pl b/tools/pidl/tests/wireshark-conf.pl index 617a63029a..d6fe3158aa 100755 --- a/tools/pidl/tests/wireshark-conf.pl +++ b/tools/pidl/tests/wireshark-conf.pl @@ -5,7 +5,7 @@ use strict; use warnings; -use Test::More tests => 45; +use Test::More tests => 47; use FindBin qw($RealBin); use lib "$RealBin"; use Util; @@ -61,11 +61,11 @@ is_deeply(parse_conf("CODE START\ndata\nmore data\nCODE END\n"), { override => " test_warnings("nofile:1: Unknown command `CODE'\n", sub { parse_conf("CODE END\n"); } ); -is_deeply(parse_conf("TYPE winreg_String dissect_myminregstring FT_STRING BASE_DEC 0 0 2\n"), { types => { winreg_String => { +is_deeply(parse_conf("TYPE winreg_String dissect_myminregstring(); FT_STRING BASE_DEC 0 0 2\n"), { types => { winreg_String => { NAME => "winreg_String", POS => { FILE => "nofile", LINE => 1 }, USED => 0, - DISSECTOR_NAME => "dissect_myminregstring", + DISSECTOR_NAME => "dissect_myminregstring();", FT_TYPE => "FT_STRING", BASE_TYPE => "BASE_DEC", MASK => 0, @@ -87,13 +87,13 @@ test_errors("nofile:1: incomplete TYPE command\n", sub { parse_conf("TYPE mytype dissector\n"); }); test_warnings("nofile:1: dissector name does not contain `dissect'\n", - sub { parse_conf("TYPE winreg_String myminregstring FT_STRING BASE_DEC 0 0 2\n"); }); + sub { parse_conf("TYPE winreg_String myminregstring; FT_STRING BASE_DEC 0 0 2\n"); }); test_warnings("nofile:1: invalid FT_TYPE `BLA'\n", - sub { parse_conf("TYPE winreg_String dissect_myminregstring BLA BASE_DEC 0 0 2\n"); }); + sub { parse_conf("TYPE winreg_String dissect_myminregstring; BLA BASE_DEC 0 0 2\n"); }); test_warnings("nofile:1: invalid BASE_TYPE `BLOE'\n", - sub { parse_conf("TYPE winreg_String dissect_myminregstring FT_UINT32 BLOE 0 0 2\n"); }); + sub { parse_conf("TYPE winreg_String dissect_myminregstring; FT_UINT32 BLOE 0 0 2\n"); }); is_deeply(parse_conf("TFS hf_bla \"True string\" \"False String\"\n"), { tfs => { hf_bla => { @@ -163,3 +163,38 @@ test_errors("nofile:1: no dissectorname specified\n", test_errors("nofile:1: incomplete HF_FIELD command\n", sub { parse_conf("HF_FIELD hf_idx\n"); }); + +is_deeply(parse_conf("TYPE winreg_String dissect_myminregstring(); FT_STRING BASE_DEC 0 0 0 2\n"), { + types => { + winreg_String => { + NAME => "winreg_String", + POS => { FILE => "nofile", LINE => 1 }, + USED => 0, + DISSECTOR_NAME => "dissect_myminregstring();", + FT_TYPE => "FT_STRING", + BASE_TYPE => "BASE_DEC", + MASK => 0, + VALSSTRING => 0, + ALIGNMENT => 0 + } + } + } +); + + +is_deeply(parse_conf("TYPE winreg_String \"offset = dissect_myminregstring(\@HF\@);\" FT_STRING BASE_DEC 0 0 0 2\n"), { + types => { + winreg_String => { + NAME => "winreg_String", + POS => { FILE => "nofile", LINE => 1 }, + USED => 0, + DISSECTOR_NAME => "offset = dissect_myminregstring(\@HF\@);", + FT_TYPE => "FT_STRING", + BASE_TYPE => "BASE_DEC", + MASK => 0, + VALSSTRING => 0, + ALIGNMENT => 0 + } + } + } +); diff --git a/tools/pidl/tests/wireshark-ndr.pl b/tools/pidl/tests/wireshark-ndr.pl index 40e22d958c..8c2cd47584 100755 --- a/tools/pidl/tests/wireshark-ndr.pl +++ b/tools/pidl/tests/wireshark-ndr.pl @@ -10,44 +10,44 @@ use FindBin qw($RealBin); use lib "$RealBin"; use Util; use Parse::Pidl::Util qw(MyDumper); -use Parse::Pidl::Wireshark::NDR qw(field2name %res PrintIdl StripPrefixes %hf_used RegisterInterfaceHandoff $conformance register_hf_field CheckUsed ProcessImport ProcessInclude find_type DumpEttList DumpEttDeclaration DumpHfList DumpHfDeclaration DumpFunctionTable register_type @ett register_ett); +use strict; +use Parse::Pidl::Wireshark::NDR qw(field2name %res PrintIdl StripPrefixes RegisterInterfaceHandoff register_hf_field ProcessImport ProcessInclude find_type DumpEttList DumpEttDeclaration DumpHfList DumpHfDeclaration DumpFunctionTable register_type register_ett); is("Access Mask", field2name("access_mask")); is("Accessmask", field2name("AccessMask")); -$res{code} = ""; -PrintIdl("foo\nbar\n"); +my $x = new Parse::Pidl::Wireshark::NDR(); +$x->PrintIdl("foo\nbar\n"); is("/* IDL: foo */ /* IDL: bar */ -", $res{code}); +", $x->{res}->{code}); is("bla_foo", StripPrefixes("bla_foo", [])); is("foo", StripPrefixes("bla_foo", ["bla"])); is("foo_bla", StripPrefixes("foo_bla", ["bla"])); -%hf_used = (); -$res{code} = ""; -RegisterInterfaceHandoff({}); -is($res{code}, ""); -ok(not defined($hf_used{hf_bla_opnum})); +$x = new Parse::Pidl::Wireshark::NDR(); +$x->RegisterInterfaceHandoff({}); +is($x->{res}->{code}, ""); +ok(not defined($x->{hf_used}->{hf_bla_opnum})); -%hf_used = (); -$res{code} = ""; -RegisterInterfaceHandoff({UUID => "uuid", NAME => "bla"}); -is($res{code}, 'void proto_reg_handoff_dcerpc_bla(void) +$x = new Parse::Pidl::Wireshark::NDR(); +$x->{res}->{code} = ""; +$x->RegisterInterfaceHandoff({UUID => "uuid", NAME => "bla"}); +is($x->{res}->{code}, 'void proto_reg_handoff_dcerpc_bla(void) { dcerpc_init_uuid(proto_dcerpc_bla, ett_dcerpc_bla, &uuid_dcerpc_bla, ver_dcerpc_bla, bla_dissectors, hf_bla_opnum); } '); -is($hf_used{hf_bla_opnum}, 1); +is($x->{hf_used}->{hf_bla_opnum}, 1); -$conformance = {}; +$x->{conformance} = {}; is("hf_bla_idx", - register_hf_field("hf_bla_idx", "bla", "my.filter", "FT_UINT32", "BASE_HEX", "NULL", 0xF, undef)); -is_deeply($conformance, { + $x->register_hf_field("hf_bla_idx", "bla", "my.filter", "FT_UINT32", "BASE_HEX", "NULL", 0xF, undef)); +is_deeply($x->{conformance}, { header_fields => { "hf_bla_idx" => { INDEX => "hf_bla_idx", @@ -64,10 +64,10 @@ is_deeply($conformance, { fielddescription => {} }); -$conformance = { fielddescription => { hf_bla_idx => { DESCRIPTION => "Some Description" }}}; +$x->{conformance} = { fielddescription => { hf_bla_idx => { DESCRIPTION => "Some Description" }}}; is("hf_bla_idx", - register_hf_field("hf_bla_idx", "bla", "my.filter", "FT_UINT32", "BASE_HEX", "NULL", 0xF, undef)); -is_deeply($conformance, { + $x->register_hf_field("hf_bla_idx", "bla", "my.filter", "FT_UINT32", "BASE_HEX", "NULL", 0xF, undef)); +is_deeply($x->{conformance}, { fielddescription => { hf_bla_idx => { DESCRIPTION => "Some Description", @@ -89,11 +89,11 @@ is_deeply($conformance, { hf_renames => {}, }); -$conformance = { fielddescription => { hf_bla_idx => { DESCRIPTION => "Some Description" }}}; +$x->{conformance} = { fielddescription => { hf_bla_idx => { DESCRIPTION => "Some Description" }}}; is("hf_bla_idx", - register_hf_field("hf_bla_idx", "bla", "my.filter", "FT_UINT32", "BASE_HEX", "NULL", 0xF, + $x->register_hf_field("hf_bla_idx", "bla", "my.filter", "FT_UINT32", "BASE_HEX", "NULL", 0xF, "Actual Description")); -is_deeply($conformance, { +is_deeply($x->{conformance}, { fielddescription => { hf_bla_idx => { DESCRIPTION => "Some Description" } }, @@ -114,21 +114,21 @@ is_deeply($conformance, { -$conformance = { hf_renames => { "hf_bla_idx" => { NEWNAME => "hf_bloe_idx" } } }; -register_hf_field("hf_bla_idx", "bla", "my.filter", "FT_UINT32", "BASE_HEX", "NULL", 0xF, undef); -is_deeply($conformance, { +$x->{conformance} = { hf_renames => { "hf_bla_idx" => { NEWNAME => "hf_bloe_idx" } } }; +$x->register_hf_field("hf_bla_idx", "bla", "my.filter", "FT_UINT32", "BASE_HEX", "NULL", 0xF, undef); +is_deeply($x->{conformance}, { hf_renames => { hf_bla_idx => { USED => 1, NEWNAME => "hf_bloe_idx" } } }); -%hf_used = ( hf_bla => 1 ); +$x->{hf_used} = { hf_bla => 1 }; test_warnings("", sub { - CheckUsed({ header_fields => { foo => { INDEX => "hf_bla" }}})}); + $x->CheckUsed({ header_fields => { foo => { INDEX => "hf_bla" }}})}); -%hf_used = ( ); +$x->{hf_used} = { }; test_warnings("hf field `hf_bla' not used\n", sub { - CheckUsed({ header_fields => { foo => { INDEX => "hf_bla" }}})}); + $x->CheckUsed({ header_fields => { foo => { INDEX => "hf_bla" }}})}); test_warnings("hf field `hf_id' not used\n", - sub { CheckUsed({ + sub { $x->CheckUsed({ hf_renames => { hf_id => { OLDNAME => "hf_id", @@ -139,7 +139,7 @@ test_warnings("hf field `hf_id' not used\n", }); } ); test_warnings("dissector param never used\n", - sub { CheckUsed({ + sub { $x->CheckUsed({ dissectorparams => { dissect_foo => { PARAM => 42, @@ -149,7 +149,7 @@ test_warnings("dissector param never used\n", }); } ); test_warnings("description never used\n", - sub { CheckUsed({ + sub { $x->CheckUsed({ fielddescription => { hf_bla => { USED => 0 @@ -158,7 +158,7 @@ test_warnings("description never used\n", }); } ); test_warnings("import never used\n", - sub { CheckUsed({ + sub { $x->CheckUsed({ imports => { bla => { USED => 0 @@ -167,7 +167,7 @@ test_warnings("import never used\n", }); } ); test_warnings("nofile:1: type never used\n", - sub { CheckUsed({ + sub { $x->CheckUsed({ types => { bla => { USED => 0, @@ -177,7 +177,7 @@ test_warnings("nofile:1: type never used\n", }); } ); test_warnings("True/False description never used\n", - sub { CheckUsed({ + sub { $x->CheckUsed({ tfs => { hf_bloe => { USED => 0 @@ -185,34 +185,34 @@ test_warnings("True/False description never used\n", } }); } ); -$res{hdr} = ""; -ProcessImport("security", "bla"); -is($res{hdr}, "#include \"packet-dcerpc-bla.h\"\n\n"); +$x = new Parse::Pidl::Wireshark::NDR(); +$x->ProcessImport("security", "bla"); +is($x->{res}->{hdr}, "#include \"packet-dcerpc-bla.h\"\n\n"); -$res{hdr} = ""; -ProcessImport("\"bla.idl\"", "\"foo.idl\""); -is($res{hdr}, "#include \"packet-dcerpc-bla.h\"\n" . +$x = new Parse::Pidl::Wireshark::NDR(); +$x->ProcessImport("\"bla.idl\"", "\"foo.idl\""); +is($x->{res}->{hdr}, "#include \"packet-dcerpc-bla.h\"\n" . "#include \"packet-dcerpc-foo.h\"\n\n"); -$res{hdr} = ""; -ProcessInclude("foo.h", "bla.h", "bar.h"); -is($res{hdr}, "#include \"foo.h\"\n" . +$x = new Parse::Pidl::Wireshark::NDR(); +$x->ProcessInclude("foo.h", "bla.h", "bar.h"); +is($x->{res}->{hdr}, "#include \"foo.h\"\n" . "#include \"bla.h\"\n" . "#include \"bar.h\"\n\n"); -$conformance = {types => { bla => "brainslug" } }; -is("brainslug", find_type("bla")); +$x->{conformance} = {types => { bla => "brainslug" } }; +is("brainslug", $x->find_type("bla")); -is(DumpEttList("ett_t1", "ett_bla"), +is(DumpEttList(["ett_t1", "ett_bla"]), "\tstatic gint *ett[] = {\n" . "\t\t&ett_t1,\n" . "\t\t&ett_bla,\n" . "\t};\n"); is(DumpEttList(), "\tstatic gint *ett[] = {\n\t};\n"); -is(DumpEttList("bla"), "\tstatic gint *ett[] = {\n\t\t&bla,\n\t};\n"); +is(DumpEttList(["bla"]), "\tstatic gint *ett[] = {\n\t\t&bla,\n\t};\n"); -is(DumpEttDeclaration("void", "zoid"), +is(DumpEttDeclaration(["void", "zoid"]), "\n/* Ett declarations */\n" . "static gint void = -1;\n" . "static gint zoid = -1;\n" . @@ -220,19 +220,19 @@ is(DumpEttDeclaration("void", "zoid"), is(DumpEttDeclaration(), "\n/* Ett declarations */\n\n"); -$conformance = { +$x->{conformance} = { header_fields => { hf_bla => { INDEX => "hf_bla", NAME => "Bla", FILTER => "bla.field", FT_TYPE => "FT_UINT32", BASE_TYPE => "BASE_DEC", VALSSTRING => "NULL", MASK => 0xFF, BLURB => "NULL" } } }; -is(DumpHfList(), "\tstatic hf_register_info hf[] = { +is($x->DumpHfList(), "\tstatic hf_register_info hf[] = { { &hf_bla, { \"Bla\", \"bla.field\", FT_UINT32, BASE_DEC, NULL, 255, \"NULL\", HFILL }}, }; "); -is(DumpHfDeclaration(), " +is($x->DumpHfDeclaration(), " /* Header field declarations */ static gint hf_bla = -1; @@ -250,9 +250,9 @@ is(DumpFunctionTable({ }; '); -$conformance = {}; -register_type("bla_type", "dissect_bla", "FT_UINT32", "BASE_HEX", 0xFF, "NULL", 4); -is_deeply($conformance, { +$x->{conformance} = {}; +$x->register_type("bla_type", "dissect_bla", "FT_UINT32", "BASE_HEX", 0xFF, "NULL", 4); +is_deeply($x->{conformance}, { types => { bla_type => { NAME => "bla_type", @@ -267,8 +267,8 @@ is_deeply($conformance, { } ); -@ett = (); -register_ett("name"); -is_deeply(\@ett, ["name"]); -register_ett("leela"); -is_deeply(\@ett, ["name", "leela"]); +$x->{ett} = []; +$x->register_ett("name"); +is_deeply($x->{ett}, ["name"]); +$x->register_ett("leela"); +is_deeply($x->{ett}, ["name", "leela"]); |