aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJörg Mayer <jmayer@loplof.de>2007-05-03 21:56:22 +0000
committerJörg Mayer <jmayer@loplof.de>2007-05-03 21:56:22 +0000
commit904640fdb4ae5f4cee7198ebb3c430c11214cd16 (patch)
tree896a6d73e2e200695d2b9654b88be9620c3b7a6b
parent98cb9db12d31088e36132e8518344bab773d115b (diff)
Note: make test for the following update generates 1 error:
--------- tests/header..............NOK 14# Failed test 'struct declaration' # in tests/header.pl at line 49. # '/* header auto-generated by pidl */ # # #include <core.h> # #include <stdint.h> # # #ifndef _HEADER_p # #define _HEADER_p # # struct x#endif /* _HEADER_p */ # ' # doesn't match '(?ms-xi:struct x;)' # Looks like you failed 1 test of 15. tests/header..............dubious Test returned status 1 (wstat 256, 0x100) DIED. FAILED test 14 --------- Update from samba tree revision 22314 to 22657 ============================ Samba log start ============ ------------------------------------------------------------------------ r22357 | jelmer | 2007-04-19 03:26:15 +0200 (Thu, 19 Apr 2007) | 2 lines Changed paths: M /branches/SAMBA_4_0 M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/EJS.pm M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/TDR.pm M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Wireshark/NDR.pm M /branches/SAMBA_4_0/source/pidl/tests/wireshark-ndr.pl Don't use 'our' ------------------------------------------------------------------------ r22453 | jelmer | 2007-04-22 12:42:33 +0200 (Sun, 22 Apr 2007) | 1 line Changed paths: M /branches/SAMBA_4_0 M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/TDR.pm M /branches/SAMBA_4_0/source/pidl/tests/tdr.pl Fix TDR testsuite without using our. ------------------------------------------------------------------------ r22456 | jelmer | 2007-04-22 15:57:07 +0200 (Sun, 22 Apr 2007) | 1 line Changed paths: M /branches/SAMBA_4_0 M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/EJS.pm M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Wireshark/NDR.pm M /branches/SAMBA_4_0/source/pidl/pidl M /branches/SAMBA_4_0/source/pidl/tests/samba-ejs.pl M /branches/SAMBA_4_0/source/pidl/tests/wireshark-ndr.pl Merge wireshark and ejs test improvements. ------------------------------------------------------------------------ r22457 | jelmer | 2007-04-22 16:19:22 +0200 (Sun, 22 Apr 2007) | 1 line Changed paths: M /branches/SAMBA_4_0 M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm M /branches/SAMBA_4_0/source/pidl/pidl M /branches/SAMBA_4_0/source/pidl/tests/samba3-cli.pl Fix tests for Samba3 client generator. ------------------------------------------------------------------------ r22462 | jelmer | 2007-04-22 17:59:34 +0200 (Sun, 22 Apr 2007) | 1 line Changed paths: M /branches/SAMBA_4_0 M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm M /branches/SAMBA_4_0/source/pidl/pidl M /branches/SAMBA_4_0/source/pidl/tests/Util.pm M /branches/SAMBA_4_0/source/pidl/tests/samba-ndr.pl Fix test suite for ndr parser without using 'our' ------------------------------------------------------------------------ r22520 | jelmer | 2007-04-25 18:10:54 +0200 (Wed, 25 Apr 2007) | 1 line Changed paths: M /branches/SAMBA_4_0 M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Wireshark/NDR.pm M /branches/SAMBA_4_0/source/pidl/tests/wireshark-conf.pl Fix the TYPE command. ------------------------------------------------------------------------ r22617 | metze | 2007-05-01 03:57:17 +0200 (Tue, 01 May 2007) | 4 lines Changed paths: M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/NDR.pm assume we have defered elements if the type is just provides via 'declare' this should fix the problem with the winbind IRPC calls metze ------------------------------------------------------------------------ r22618 | metze | 2007-05-01 04:00:57 +0200 (Tue, 01 May 2007) | 8 lines Changed paths: M /branches/SAMBA_4_0/source/pidl/idl.yp M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/IDL.pm handle the properties related to the type and not to 'declare' to avoid a pidl warning with: declare [switch_type(uint16)] union netr_Validation; void foo([in] uint16 level, [in,switch_is(level)] netrValidation info); metze ------------------------------------------------------------------------ r22640 | metze | 2007-05-02 20:00:02 +0200 (Wed, 02 May 2007) | 4 lines Changed paths: M /branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba4/Header.pm - generate nicer output - fix compiler warning about unused ';' metze ------------------------------------------------------------------------ ------------------------------------------------------------------------ ============================ Samba log end ============== svn path=/trunk/; revision=21671
-rw-r--r--tools/pidl/idl.yp22
-rw-r--r--tools/pidl/lib/Parse/Pidl/IDL.pm1122
-rw-r--r--tools/pidl/lib/Parse/Pidl/NDR.pm2
-rw-r--r--tools/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm157
-rw-r--r--tools/pidl/lib/Parse/Pidl/Samba4/EJS.pm616
-rw-r--r--tools/pidl/lib/Parse/Pidl/Samba4/Header.pm22
-rw-r--r--tools/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm1629
-rw-r--r--tools/pidl/lib/Parse/Pidl/Samba4/TDR.pm213
-rw-r--r--tools/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm6
-rw-r--r--tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm931
-rwxr-xr-xtools/pidl/pidl16
-rw-r--r--tools/pidl/tests/Util.pm3
-rwxr-xr-xtools/pidl/tests/samba-ejs.pl39
-rwxr-xr-xtools/pidl/tests/samba-ndr.pl33
-rwxr-xr-xtools/pidl/tests/samba3-cli.pl9
-rwxr-xr-xtools/pidl/tests/tdr.pl27
-rwxr-xr-xtools/pidl/tests/wireshark-conf.pl47
-rwxr-xr-xtools/pidl/tests/wireshark-ndr.pl122
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, &parameter);";
- 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, &parameter);");
+ $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"]);