summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/build/pidl/header.pm5
-rw-r--r--source4/build/pidl/idl.pm506
-rw-r--r--source4/build/pidl/idl.yp11
-rw-r--r--source4/build/pidl/parser.pm119
-rw-r--r--source4/build/pidl/util.pm20
5 files changed, 403 insertions, 258 deletions
diff --git a/source4/build/pidl/header.pm b/source4/build/pidl/header.pm
index 21565a0f37..ccb302be89 100644
--- a/source4/build/pidl/header.pm
+++ b/source4/build/pidl/header.pm
@@ -97,6 +97,9 @@ sub HeaderEnum($$)
{
my($enum) = shift;
my($name) = shift;
+
+ util::register_enum($name);
+
$res .= "\nenum $name {\n";
$tab_depth++;
my $els = \@{$enum->{ELEMENTS}};
@@ -160,6 +163,8 @@ sub HeaderType($$$)
}
if ($data =~ "string") {
$res .= "const char *";
+ } elsif (util::is_enum($e->{TYPE})) {
+ $res .= "enum $data";
} elsif (util::is_scalar_type($data)) {
$res .= "$data";
} elsif (util::has_property($e, "switch_is")) {
diff --git a/source4/build/pidl/idl.pm b/source4/build/pidl/idl.pm
index 487b53160e..8c2b989567 100644
--- a/source4/build/pidl/idl.pm
+++ b/source4/build/pidl/idl.pm
@@ -881,19 +881,9 @@ sub new {
DEFAULT => -54
},
{#State 47
- ACTIONS => {
- 'IDENTIFIER' => 9,
- "enum" => 69,
- 'void' => 70
- },
DEFAULT => -49,
GOTOS => {
- 'identifier' => 72,
- 'struct' => 73,
- 'enum' => 74,
- 'type' => 75,
- 'union' => 76,
- 'property_list' => 71
+ 'property_list' => 69
}
},
{#State 48
@@ -901,7 +891,7 @@ sub new {
},
{#State 49
ACTIONS => {
- "}" => 77,
+ "}" => 70,
"typedef" => 47,
"const" => 53
},
@@ -910,25 +900,25 @@ sub new {
'const' => 52,
'function' => 48,
'typedef' => 54,
- 'definition' => 78,
+ 'definition' => 71,
'property_list' => 50
}
},
{#State 50
ACTIONS => {
'IDENTIFIER' => 9,
- "enum" => 69,
+ "enum" => 72,
"[" => 7,
- 'void' => 70
+ 'void' => 73
},
DEFAULT => -49,
GOTOS => {
- 'identifier' => 72,
- 'struct' => 73,
- 'enum' => 74,
- 'type' => 79,
- 'union' => 76,
- 'property_list' => 71
+ 'identifier' => 75,
+ 'struct' => 76,
+ 'enum' => 77,
+ 'type' => 78,
+ 'union' => 79,
+ 'property_list' => 74
}
},
{#State 51
@@ -1046,52 +1036,58 @@ sub new {
},
{#State 69
ACTIONS => {
- "{" => 84
+ 'IDENTIFIER' => 9,
+ "enum" => 72,
+ "[" => 7,
+ 'void' => 73
+ },
+ DEFAULT => -49,
+ GOTOS => {
+ 'identifier' => 75,
+ 'struct' => 76,
+ 'enum' => 77,
+ 'type' => 84,
+ 'union' => 79,
+ 'property_list' => 74
}
},
{#State 70
- DEFAULT => -23
- },
- {#State 71
ACTIONS => {
- "union" => 85,
- "[" => 7,
- "struct" => 86
+ ";" => 56
+ },
+ DEFAULT => -76,
+ GOTOS => {
+ 'optional_semicolon' => 85
}
},
+ {#State 71
+ DEFAULT => -11
+ },
{#State 72
- DEFAULT => -22
+ ACTIONS => {
+ "{" => 86
+ }
},
{#State 73
- DEFAULT => -19
+ DEFAULT => -23
},
{#State 74
- DEFAULT => -21
- },
- {#State 75
ACTIONS => {
- 'IDENTIFIER' => 9
- },
- GOTOS => {
- 'identifier' => 87
+ "union" => 87,
+ "[" => 7,
+ "struct" => 88
}
},
+ {#State 75
+ DEFAULT => -22
+ },
{#State 76
- DEFAULT => -20
+ DEFAULT => -19
},
{#State 77
- ACTIONS => {
- ";" => 56
- },
- DEFAULT => -76,
- GOTOS => {
- 'optional_semicolon' => 88
- }
+ DEFAULT => -21
},
{#State 78
- DEFAULT => -11
- },
- {#State 79
ACTIONS => {
'IDENTIFIER' => 9
},
@@ -1099,6 +1095,9 @@ sub new {
'identifier' => 89
}
},
+ {#State 79
+ DEFAULT => -20
+ },
{#State 80
ACTIONS => {
'IDENTIFIER' => 9
@@ -1154,45 +1153,44 @@ sub new {
'IDENTIFIER' => 9
},
GOTOS => {
- 'identifier' => 94,
- 'enum_element' => 95,
- 'enum_elements' => 96
+ 'identifier' => 94
}
},
{#State 85
- ACTIONS => {
- "{" => 97
- }
+ DEFAULT => -7
},
{#State 86
ACTIONS => {
- "{" => 98
+ 'IDENTIFIER' => 9
+ },
+ GOTOS => {
+ 'identifier' => 95,
+ 'enum_element' => 96,
+ 'enum_elements' => 97
}
},
{#State 87
ACTIONS => {
- "[" => 100
- },
- DEFAULT => -46,
- GOTOS => {
- 'array_len' => 99
+ "{" => 98
}
},
{#State 88
- DEFAULT => -7
+ ACTIONS => {
+ "{" => 99
+ }
},
{#State 89
ACTIONS => {
- "(" => 101
+ "(" => 100
}
},
{#State 90
ACTIONS => {
- "[" => 100,
- "=" => 103
+ "[" => 103,
+ "=" => 102
},
GOTOS => {
- 'array_len' => 102
+ 'array_len' => 101
}
},
{#State 91
@@ -1233,88 +1231,97 @@ sub new {
},
{#State 94
ACTIONS => {
- "=" => 104
+ "[" => 103
},
- DEFAULT => -27
+ DEFAULT => -46,
+ GOTOS => {
+ 'array_len' => 104
+ }
},
{#State 95
- DEFAULT => -25
+ ACTIONS => {
+ "=" => 105
+ },
+ DEFAULT => -27
},
{#State 96
- ACTIONS => {
- "}" => 105,
- "," => 106
- }
+ DEFAULT => -25
},
{#State 97
ACTIONS => {
- "[" => 109
- },
- GOTOS => {
- 'union_elements' => 107,
- 'union_element' => 108
+ "}" => 106,
+ "," => 107
}
},
{#State 98
- DEFAULT => -40,
+ ACTIONS => {
+ "[" => 110
+ },
GOTOS => {
- 'element_list1' => 110
+ 'union_elements' => 108,
+ 'union_element' => 109
}
},
{#State 99
- ACTIONS => {
- ";" => 111
+ DEFAULT => -40,
+ GOTOS => {
+ 'element_list1' => 111
}
},
{#State 100
ACTIONS => {
- 'IDENTIFIER' => 9,
- 'CONSTANT' => 28,
- 'TEXT' => 22,
- "]" => 113
+ "," => -42,
+ "void" => 114,
+ ")" => -42
},
- DEFAULT => -59,
+ DEFAULT => -49,
GOTOS => {
- 'identifier' => 23,
- 'text' => 24,
- 'anytext' => 112,
- 'constant' => 27
+ 'base_element' => 112,
+ 'element_list2' => 115,
+ 'property_list' => 113
}
},
{#State 101
ACTIONS => {
- "," => -42,
- "void" => 116,
- ")" => -42
- },
- DEFAULT => -49,
- GOTOS => {
- 'base_element' => 114,
- 'element_list2' => 117,
- 'property_list' => 115
+ "=" => 116
}
},
{#State 102
ACTIONS => {
- "=" => 118
+ 'IDENTIFIER' => 9,
+ 'CONSTANT' => 28,
+ 'TEXT' => 22
+ },
+ DEFAULT => -59,
+ GOTOS => {
+ 'identifier' => 23,
+ 'text' => 24,
+ 'anytext' => 117,
+ 'constant' => 27
}
},
{#State 103
ACTIONS => {
'IDENTIFIER' => 9,
'CONSTANT' => 28,
- 'TEXT' => 22
+ 'TEXT' => 22,
+ "]" => 119
},
DEFAULT => -59,
GOTOS => {
'identifier' => 23,
'text' => 24,
- 'anytext' => 119,
+ 'anytext' => 118,
'constant' => 27
}
},
{#State 104
ACTIONS => {
+ ";" => 120
+ }
+ },
+ {#State 105
+ ACTIONS => {
'CONSTANT' => 28,
'TEXT' => 22,
'IDENTIFIER' => 9
@@ -1323,101 +1330,80 @@ sub new {
GOTOS => {
'identifier' => 23,
'text' => 24,
- 'anytext' => 120,
+ 'anytext' => 121,
'constant' => 27
}
},
- {#State 105
+ {#State 106
DEFAULT => -24
},
- {#State 106
+ {#State 107
ACTIONS => {
'IDENTIFIER' => 9
},
GOTOS => {
- 'identifier' => 94,
- 'enum_element' => 121
+ 'identifier' => 95,
+ 'enum_element' => 122
}
},
- {#State 107
+ {#State 108
ACTIONS => {
- "}" => 122,
- "[" => 109
+ "}" => 123,
+ "[" => 110
},
GOTOS => {
- 'union_element' => 123
+ 'union_element' => 124
}
},
- {#State 108
+ {#State 109
DEFAULT => -31
},
- {#State 109
+ {#State 110
ACTIONS => {
- "case" => 124,
- "default" => 125
+ "case" => 125,
+ "default" => 126
}
},
- {#State 110
+ {#State 111
ACTIONS => {
- "}" => 126
+ "}" => 127
},
DEFAULT => -49,
GOTOS => {
- 'base_element' => 127,
- 'property_list' => 115
+ 'base_element' => 128,
+ 'property_list' => 113
}
},
- {#State 111
- DEFAULT => -18
- },
{#State 112
- ACTIONS => {
- "-" => 35,
- "+" => 36,
- "&" => 38,
- "{" => 37,
- "/" => 39,
- "(" => 41,
- "|" => 40,
- "*" => 42,
- "." => 43,
- "]" => 128,
- ">" => 44
- }
- },
- {#State 113
- DEFAULT => -47
- },
- {#State 114
DEFAULT => -44
},
- {#State 115
+ {#State 113
ACTIONS => {
'IDENTIFIER' => 9,
- "enum" => 69,
+ "enum" => 72,
"[" => 7,
- 'void' => 70
+ 'void' => 73
},
DEFAULT => -49,
GOTOS => {
- 'identifier' => 72,
- 'struct' => 73,
- 'enum' => 74,
+ 'identifier' => 75,
+ 'struct' => 76,
+ 'enum' => 77,
'type' => 129,
- 'union' => 76,
- 'property_list' => 71
+ 'union' => 79,
+ 'property_list' => 74
}
},
- {#State 116
+ {#State 114
DEFAULT => -43
},
- {#State 117
+ {#State 115
ACTIONS => {
"," => 130,
")" => 131
}
},
- {#State 118
+ {#State 116
ACTIONS => {
'IDENTIFIER' => 9,
'CONSTANT' => 28,
@@ -1431,7 +1417,7 @@ sub new {
'constant' => 27
}
},
- {#State 119
+ {#State 117
ACTIONS => {
"-" => 35,
";" => 133,
@@ -1446,7 +1432,28 @@ sub new {
">" => 44
}
},
+ {#State 118
+ ACTIONS => {
+ "-" => 35,
+ "+" => 36,
+ "&" => 38,
+ "{" => 37,
+ "/" => 39,
+ "(" => 41,
+ "|" => 40,
+ "*" => 42,
+ "." => 43,
+ "]" => 134,
+ ">" => 44
+ }
+ },
+ {#State 119
+ DEFAULT => -47
+ },
{#State 120
+ DEFAULT => -18
+ },
+ {#State 121
ACTIONS => {
"-" => 35,
"+" => 36,
@@ -1461,58 +1468,55 @@ sub new {
},
DEFAULT => -28
},
- {#State 121
+ {#State 122
DEFAULT => -26
},
- {#State 122
+ {#State 123
DEFAULT => -30
},
- {#State 123
+ {#State 124
DEFAULT => -32
},
- {#State 124
+ {#State 125
ACTIONS => {
- "(" => 134
+ "(" => 135
}
},
- {#State 125
+ {#State 126
ACTIONS => {
- "]" => 135
+ "]" => 136
}
},
- {#State 126
+ {#State 127
DEFAULT => -29
},
- {#State 127
+ {#State 128
ACTIONS => {
- ";" => 136
+ ";" => 137
}
},
- {#State 128
- DEFAULT => -48
- },
{#State 129
DEFAULT => -38,
GOTOS => {
- 'pointers' => 137
+ 'pointers' => 138
}
},
{#State 130
DEFAULT => -49,
GOTOS => {
- 'base_element' => 138,
- 'property_list' => 115
+ 'base_element' => 139,
+ 'property_list' => 113
}
},
{#State 131
ACTIONS => {
- ";" => 139
+ ";" => 140
}
},
{#State 132
ACTIONS => {
"-" => 35,
- ";" => 140,
+ ";" => 141,
"+" => 36,
"&" => 38,
"{" => 37,
@@ -1528,6 +1532,9 @@ sub new {
DEFAULT => -15
},
{#State 134
+ DEFAULT => -48
+ },
+ {#State 135
ACTIONS => {
'IDENTIFIER' => 9,
'CONSTANT' => 28,
@@ -1537,42 +1544,42 @@ sub new {
GOTOS => {
'identifier' => 23,
'text' => 24,
- 'anytext' => 141,
+ 'anytext' => 142,
'constant' => 27
}
},
- {#State 135
+ {#State 136
ACTIONS => {
- ";" => 142
+ ";" => 143
},
DEFAULT => -49,
GOTOS => {
- 'base_element' => 143,
- 'property_list' => 115
+ 'base_element' => 144,
+ 'property_list' => 113
}
},
- {#State 136
+ {#State 137
DEFAULT => -41
},
- {#State 137
+ {#State 138
ACTIONS => {
'IDENTIFIER' => 9,
- "*" => 145
+ "*" => 146
},
GOTOS => {
- 'identifier' => 144
+ 'identifier' => 145
}
},
- {#State 138
+ {#State 139
DEFAULT => -45
},
- {#State 139
+ {#State 140
DEFAULT => -17
},
- {#State 140
+ {#State 141
DEFAULT => -16
},
- {#State 141
+ {#State 142
ACTIONS => {
"-" => 35,
"+" => 36,
@@ -1583,60 +1590,60 @@ sub new {
"|" => 40,
"*" => 42,
"." => 43,
- ")" => 146,
+ ")" => 147,
">" => 44
}
},
- {#State 142
+ {#State 143
DEFAULT => -36
},
- {#State 143
+ {#State 144
ACTIONS => {
- ";" => 147
+ ";" => 148
}
},
- {#State 144
+ {#State 145
ACTIONS => {
- "[" => 100
+ "[" => 103
},
DEFAULT => -46,
GOTOS => {
- 'array_len' => 148
+ 'array_len' => 149
}
},
- {#State 145
+ {#State 146
DEFAULT => -39
},
- {#State 146
+ {#State 147
ACTIONS => {
- "]" => 149
+ "]" => 150
}
},
- {#State 147
+ {#State 148
DEFAULT => -35
},
- {#State 148
+ {#State 149
DEFAULT => -37
},
- {#State 149
+ {#State 150
ACTIONS => {
- ";" => 150
+ ";" => 151
},
DEFAULT => -49,
GOTOS => {
- 'base_element' => 151,
- 'property_list' => 115
+ 'base_element' => 152,
+ 'property_list' => 113
}
},
- {#State 150
+ {#State 151
DEFAULT => -34
},
- {#State 151
+ {#State 152
ACTIONS => {
- ";" => 152
+ ";" => 153
}
},
- {#State 152
+ {#State 153
DEFAULT => -33
}
],
@@ -1758,14 +1765,15 @@ sub
}}
],
[#Rule 18
- 'typedef', 5,
+ 'typedef', 6,
sub
#line 90 "build/pidl/idl.yp"
{{
- "TYPE" => "TYPEDEF",
- "NAME" => $_[3],
- "DATA" => $_[2],
- "ARRAY_LEN" => $_[4]
+ "TYPE" => "TYPEDEF",
+ "PROPERTIES" => $_[2],
+ "NAME" => $_[4],
+ "DATA" => $_[3],
+ "ARRAY_LEN" => $_[5]
}}
],
[#Rule 19
@@ -1783,13 +1791,13 @@ sub
[#Rule 23
'type', 1,
sub
-#line 99 "build/pidl/idl.yp"
+#line 100 "build/pidl/idl.yp"
{ "void" }
],
[#Rule 24
'enum', 4,
sub
-#line 104 "build/pidl/idl.yp"
+#line 105 "build/pidl/idl.yp"
{{
"TYPE" => "ENUM",
"ELEMENTS" => $_[3]
@@ -1798,13 +1806,13 @@ sub
[#Rule 25
'enum_elements', 1,
sub
-#line 111 "build/pidl/idl.yp"
+#line 112 "build/pidl/idl.yp"
{ [ $_[1] ] }
],
[#Rule 26
'enum_elements', 3,
sub
-#line 112 "build/pidl/idl.yp"
+#line 113 "build/pidl/idl.yp"
{ push(@{$_[1]}, $_[3]); $_[1] }
],
[#Rule 27
@@ -1813,13 +1821,13 @@ sub
[#Rule 28
'enum_element', 3,
sub
-#line 116 "build/pidl/idl.yp"
+#line 117 "build/pidl/idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
[#Rule 29
'struct', 5,
sub
-#line 120 "build/pidl/idl.yp"
+#line 121 "build/pidl/idl.yp"
{{
"TYPE" => "STRUCT",
"PROPERTIES" => $_[1],
@@ -1829,7 +1837,7 @@ sub
[#Rule 30
'union', 5,
sub
-#line 128 "build/pidl/idl.yp"
+#line 129 "build/pidl/idl.yp"
{{
"TYPE" => "UNION",
"PROPERTIES" => $_[1],
@@ -1839,19 +1847,19 @@ sub
[#Rule 31
'union_elements', 1,
sub
-#line 136 "build/pidl/idl.yp"
+#line 137 "build/pidl/idl.yp"
{ [ $_[1] ] }
],
[#Rule 32
'union_elements', 2,
sub
-#line 137 "build/pidl/idl.yp"
+#line 138 "build/pidl/idl.yp"
{ push(@{$_[1]}, $_[2]); $_[1] }
],
[#Rule 33
'union_element', 8,
sub
-#line 142 "build/pidl/idl.yp"
+#line 143 "build/pidl/idl.yp"
{{
"TYPE" => "UNION_ELEMENT",
"CASE" => $_[4],
@@ -1861,7 +1869,7 @@ sub
[#Rule 34
'union_element', 7,
sub
-#line 148 "build/pidl/idl.yp"
+#line 149 "build/pidl/idl.yp"
{{
"TYPE" => "EMPTY",
"CASE" => $_[4],
@@ -1870,7 +1878,7 @@ sub
[#Rule 35
'union_element', 5,
sub
-#line 153 "build/pidl/idl.yp"
+#line 154 "build/pidl/idl.yp"
{{
"TYPE" => "UNION_ELEMENT",
"CASE" => "default",
@@ -1880,7 +1888,7 @@ sub
[#Rule 36
'union_element', 4,
sub
-#line 159 "build/pidl/idl.yp"
+#line 160 "build/pidl/idl.yp"
{{
"TYPE" => "EMPTY",
"CASE" => "default",
@@ -1889,7 +1897,7 @@ sub
[#Rule 37
'base_element', 5,
sub
-#line 166 "build/pidl/idl.yp"
+#line 167 "build/pidl/idl.yp"
{{
"NAME" => $_[4],
"TYPE" => $_[2],
@@ -1901,13 +1909,13 @@ sub
[#Rule 38
'pointers', 0,
sub
-#line 178 "build/pidl/idl.yp"
+#line 179 "build/pidl/idl.yp"
{ 0 }
],
[#Rule 39
'pointers', 2,
sub
-#line 179 "build/pidl/idl.yp"
+#line 180 "build/pidl/idl.yp"
{ $_[1]+1 }
],
[#Rule 40
@@ -1916,7 +1924,7 @@ sub
[#Rule 41
'element_list1', 3,
sub
-#line 186 "build/pidl/idl.yp"
+#line 187 "build/pidl/idl.yp"
{ push(@{$_[1]}, $_[2]); $_[1] }
],
[#Rule 42
@@ -1928,13 +1936,13 @@ sub
[#Rule 44
'element_list2', 1,
sub
-#line 192 "build/pidl/idl.yp"
+#line 193 "build/pidl/idl.yp"
{ [ $_[1] ] }
],
[#Rule 45
'element_list2', 3,
sub
-#line 193 "build/pidl/idl.yp"
+#line 194 "build/pidl/idl.yp"
{ push(@{$_[1]}, $_[3]); $_[1] }
],
[#Rule 46
@@ -1943,13 +1951,13 @@ sub
[#Rule 47
'array_len', 2,
sub
-#line 198 "build/pidl/idl.yp"
+#line 199 "build/pidl/idl.yp"
{ "*" }
],
[#Rule 48
'array_len', 3,
sub
-#line 199 "build/pidl/idl.yp"
+#line 200 "build/pidl/idl.yp"
{ "$_[2]" }
],
[#Rule 49
@@ -1958,31 +1966,31 @@ sub
[#Rule 50
'property_list', 4,
sub
-#line 205 "build/pidl/idl.yp"
+#line 206 "build/pidl/idl.yp"
{ util::FlattenHash([$_[1],$_[3]]); }
],
[#Rule 51
'properties', 1,
sub
-#line 208 "build/pidl/idl.yp"
+#line 209 "build/pidl/idl.yp"
{ $_[1] }
],
[#Rule 52
'properties', 3,
sub
-#line 209 "build/pidl/idl.yp"
+#line 210 "build/pidl/idl.yp"
{ util::FlattenHash([$_[1], $_[3]]); }
],
[#Rule 53
'property', 1,
sub
-#line 212 "build/pidl/idl.yp"
+#line 213 "build/pidl/idl.yp"
{{ "$_[1]" => "1" }}
],
[#Rule 54
'property', 4,
sub
-#line 213 "build/pidl/idl.yp"
+#line 214 "build/pidl/idl.yp"
{{ "$_[1]" => "$_[3]" }}
],
[#Rule 55
@@ -1991,7 +1999,7 @@ sub
[#Rule 56
'listtext', 3,
sub
-#line 218 "build/pidl/idl.yp"
+#line 219 "build/pidl/idl.yp"
{ "$_[1] $_[3]" }
],
[#Rule 57
@@ -2000,13 +2008,13 @@ sub
[#Rule 58
'commalisttext', 3,
sub
-#line 223 "build/pidl/idl.yp"
+#line 224 "build/pidl/idl.yp"
{ "$_[1],$_[3]" }
],
[#Rule 59
'anytext', 0,
sub
-#line 227 "build/pidl/idl.yp"
+#line 228 "build/pidl/idl.yp"
{ "" }
],
[#Rule 60
@@ -2021,61 +2029,61 @@ sub
[#Rule 63
'anytext', 3,
sub
-#line 229 "build/pidl/idl.yp"
+#line 230 "build/pidl/idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
[#Rule 64
'anytext', 3,
sub
-#line 230 "build/pidl/idl.yp"
+#line 231 "build/pidl/idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
[#Rule 65
'anytext', 3,
sub
-#line 231 "build/pidl/idl.yp"
+#line 232 "build/pidl/idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
[#Rule 66
'anytext', 3,
sub
-#line 232 "build/pidl/idl.yp"
+#line 233 "build/pidl/idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
[#Rule 67
'anytext', 3,
sub
-#line 233 "build/pidl/idl.yp"
+#line 234 "build/pidl/idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
[#Rule 68
'anytext', 3,
sub
-#line 234 "build/pidl/idl.yp"
+#line 235 "build/pidl/idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
[#Rule 69
'anytext', 3,
sub
-#line 235 "build/pidl/idl.yp"
+#line 236 "build/pidl/idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
[#Rule 70
'anytext', 3,
sub
-#line 236 "build/pidl/idl.yp"
+#line 237 "build/pidl/idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
[#Rule 71
'anytext', 5,
sub
-#line 237 "build/pidl/idl.yp"
+#line 238 "build/pidl/idl.yp"
{ "$_[1]$_[2]$_[3]$_[4]$_[5]" }
],
[#Rule 72
'anytext', 5,
sub
-#line 238 "build/pidl/idl.yp"
+#line 239 "build/pidl/idl.yp"
{ "$_[1]$_[2]$_[3]$_[4]$_[5]" }
],
[#Rule 73
@@ -2087,7 +2095,7 @@ sub
[#Rule 75
'text', 1,
sub
-#line 247 "build/pidl/idl.yp"
+#line 248 "build/pidl/idl.yp"
{ "\"$_[1]\"" }
],
[#Rule 76
@@ -2101,7 +2109,7 @@ sub
bless($self,$class);
}
-#line 258 "build/pidl/idl.yp"
+#line 259 "build/pidl/idl.yp"
use util;
diff --git a/source4/build/pidl/idl.yp b/source4/build/pidl/idl.yp
index fb2433ee72..664192f4b4 100644
--- a/source4/build/pidl/idl.yp
+++ b/source4/build/pidl/idl.yp
@@ -86,12 +86,13 @@ function: property_list type identifier '(' element_list2 ')' ';'
}}
;
-typedef: 'typedef' type identifier array_len ';'
+typedef: 'typedef' property_list type identifier array_len ';'
{{
- "TYPE" => "TYPEDEF",
- "NAME" => $_[3],
- "DATA" => $_[2],
- "ARRAY_LEN" => $_[4]
+ "TYPE" => "TYPEDEF",
+ "PROPERTIES" => $_[2],
+ "NAME" => $_[4],
+ "DATA" => $_[3],
+ "ARRAY_LEN" => $_[5]
}}
;
diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm
index 83a6e06820..fb4cc8af5e 100644
--- a/source4/build/pidl/parser.pm
+++ b/source4/build/pidl/parser.pm
@@ -117,6 +117,18 @@ sub check_null_pointer($)
}
}
+#####################################################################
+# check that a variable we get from find_size_var isn't a null pointer
+# void return varient
+sub check_null_pointer_void($)
+{
+ my $size = shift;
+ if ($size =~ /^\*/) {
+ my $size2 = substr($size, 1);
+ pidl "\tif ($size2 == NULL) return;\n";
+ }
+}
+
#####################################################################
# work out is a parse function should be declared static or not
@@ -457,7 +469,11 @@ sub ParseElementPullSwitch($$$$)
!util::has_property($utype->{DATA}, "nodiscriminant")) {
my $e2 = find_sibling($e, $switch);
pidl "\tif (($ndr_flags) & NDR_SCALARS) {\n";
- pidl "\t\t $e2->{TYPE} _level;\n";
+ if (util::is_enum($e2->{TYPE})) {
+ pidl "\t\t enum $e2->{TYPE} _level;\n";
+ } else {
+ pidl "\t\t $e2->{TYPE} _level;\n";
+ }
pidl "\t\tNDR_CHECK(ndr_pull_$e2->{TYPE}(ndr, &_level));\n";
if ($switch_var =~ /r->in/) {
pidl "\t\tif (!(ndr->flags & LIBNDR_FLAG_REF_ALLOC) && _level != $switch_var) {\n";
@@ -526,7 +542,7 @@ sub ParseElementPrintSwitch($$$)
my $switch_var = find_size_var($e, $switch, $var_prefix);
my $cprefix = util::c_push_prefix($e);
- check_null_pointer($switch_var);
+ check_null_pointer_void($switch_var);
pidl "\tndr_print_$e->{TYPE}(ndr, \"$e->{NAME}\", $switch_var, $cprefix$var_prefix$e->{NAME});\n";
}
@@ -777,6 +793,72 @@ sub ParseStructPush($)
end_flags($struct);
}
+
+#####################################################################
+# generate a push function for an enum
+sub ParseEnumPush($)
+{
+ my($enum) = shift;
+
+ start_flags($enum);
+
+ if (util::has_property($enum->{PARENT}, "v1_enum")) {
+ pidl "\tNDR_CHECK(ndr_push_uint32(ndr, r));\n";
+ } else {
+ pidl "\tNDR_CHECK(ndr_push_uint16(ndr, r));\n";
+ }
+
+ end_flags($enum);
+}
+
+#####################################################################
+# generate a pull function for an enum
+sub ParseEnumPull($)
+{
+ my($enum) = shift;
+
+ start_flags($enum);
+
+ if (util::has_property($enum->{PARENT}, "v1_enum")) {
+ pidl "\tuint32_t v;\n";
+ pidl "\tNDR_CHECK(ndr_pull_uint32(ndr, &v));\n";
+ } else {
+ pidl "\tuint16_t v;\n";
+ pidl "\tNDR_CHECK(ndr_pull_uint16(ndr, &v));\n";
+ }
+ pidl "\t*r = v;\n";
+
+ end_flags($enum);
+}
+
+#####################################################################
+# generate a print function for an enum
+sub ParseEnumPrint($)
+{
+ my($enum) = shift;
+
+ start_flags($enum);
+
+ pidl "\tconst char *val = NULL;\n\n";
+
+ pidl "\tswitch (r) {\n";
+ my $els = \@{$enum->{ELEMENTS}};
+ foreach my $i (0 .. $#{$els}) {
+ my $e = ${$els}[$i];
+ chomp $e;
+ if ($e =~ /^(.*)=/) {
+ $e = $1;
+ }
+ pidl "\t\tcase $e: val = \"$e\"; break;\n";
+ }
+
+ pidl "\t}\n\n\tndr_print_enum(ndr, name, \"$enum->{TYPE}\", val, r);\n";
+
+ end_flags($enum);
+}
+
+
+
#####################################################################
# generate a struct print function
sub ParseStructPrint($)
@@ -1128,6 +1210,8 @@ sub ParseTypePush($)
ParseStructPush($data);
($data->{TYPE} eq "UNION") &&
ParseUnionPush($data);
+ ($data->{TYPE} eq "ENUM") &&
+ ParseEnumPush($data);
}
}
@@ -1142,6 +1226,8 @@ sub ParseTypePrint($)
ParseStructPrint($data);
($data->{TYPE} eq "UNION") &&
ParseUnionPrint($data);
+ ($data->{TYPE} eq "ENUM") &&
+ ParseEnumPrint($data);
}
}
@@ -1156,6 +1242,8 @@ sub ParseTypePull($)
ParseStructPull($data);
($data->{TYPE} eq "UNION") &&
ParseUnionPull($data);
+ ($data->{TYPE} eq "ENUM") &&
+ ParseEnumPull($data);
}
}
@@ -1172,7 +1260,7 @@ sub ParseTypedefPush($)
}
if ($e->{DATA}->{TYPE} eq "STRUCT") {
- pidl $static . "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, struct $e->{NAME} *r)";
+ pidl $static . "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, const struct $e->{NAME} *r)";
pidl "\n{\n";
ParseTypePush($e->{DATA});
pidl "\treturn NT_STATUS_OK;\n";
@@ -1180,7 +1268,15 @@ sub ParseTypedefPush($)
}
if ($e->{DATA}->{TYPE} eq "UNION") {
- pidl $static . "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, int level, union $e->{NAME} *r)";
+ pidl $static . "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, int level, const union $e->{NAME} *r)";
+ pidl "\n{\n";
+ ParseTypePush($e->{DATA});
+ pidl "\treturn NT_STATUS_OK;\n";
+ pidl "}\n\n";
+ }
+
+ if ($e->{DATA}->{TYPE} eq "ENUM") {
+ pidl $static . "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, enum $e->{NAME} r)";
pidl "\n{\n";
ParseTypePush($e->{DATA});
pidl "\treturn NT_STATUS_OK;\n";
@@ -1216,6 +1312,14 @@ sub ParseTypedefPull($)
pidl "\treturn NT_STATUS_OK;\n";
pidl "}\n\n";
}
+
+ if ($e->{DATA}->{TYPE} eq "ENUM") {
+ pidl $static . "NTSTATUS ndr_pull_$e->{NAME}(struct ndr_pull *ndr, enum $e->{NAME} *r)";
+ pidl "\n{\n";
+ ParseTypePull($e->{DATA});
+ pidl "\treturn NT_STATUS_OK;\n";
+ pidl "}\n\n";
+ }
}
@@ -1240,6 +1344,13 @@ sub ParseTypedefPrint($)
ParseTypePrint($e->{DATA});
pidl "}\n\n";
}
+
+ if ($e->{DATA}->{TYPE} eq "ENUM") {
+ pidl "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, enum $e->{NAME} r)";
+ pidl "\n{\n";
+ ParseTypePrint($e->{DATA});
+ pidl "}\n\n";
+ }
}
#####################################################################
diff --git a/source4/build/pidl/util.pm b/source4/build/pidl/util.pm
index 7293a903d5..0f09a8571f 100644
--- a/source4/build/pidl/util.pm
+++ b/source4/build/pidl/util.pm
@@ -4,6 +4,8 @@
# released under the GNU GPL
package util;
+my %is_enum;
+
#####################################################################
# load a data structure from a file (as saved with SaveStructure)
sub LoadStructure($)
@@ -200,6 +202,20 @@ sub property_matches($$$)
return undef;
}
+my %enum_list;
+
+sub register_enum($)
+{
+ my $name = shift;
+ $enum_list{$name} = 1;
+}
+
+sub is_enum($)
+{
+ my $name = shift;
+ return defined $enum_list{$name}
+}
+
sub is_scalar_type($)
{
my($type) = shift;
@@ -213,6 +229,10 @@ sub is_scalar_type($)
return 1;
}
+ if (is_enum($type)) {
+ return 1;
+ }
+
return 0;
}