r21430: Support tagged types without typedef. This means:
authorJelmer Vernooij <jelmer@samba.org>
Sun, 18 Feb 2007 16:21:28 +0000 (16:21 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:48:32 +0000 (14:48 -0500)
struct foo {
 ...
};

in IDL will now work. This is the first step towards nested types and
using typedefs for partial types (such as "typedef int *bar;"), a requirement
for complex uses of represent_as().
(This used to be commit a716aa70f0c90898e6fcf57d63a2cf4c40e7d4df)

13 files changed:
source4/pidl/TODO
source4/pidl/idl.yp
source4/pidl/lib/Parse/Pidl/Expr.pm
source4/pidl/lib/Parse/Pidl/IDL.pm
source4/pidl/lib/Parse/Pidl/NDR.pm
source4/pidl/lib/Parse/Pidl/Samba4/Header.pm
source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
source4/pidl/tests/Util.pm
source4/pidl/tests/header.pl
source4/pidl/tests/ndr_deprecations.pl
source4/pidl/tests/ndr_tagtype.pl
source4/pidl/tests/parse_idl.pl
source4/pidl/tests/samba-ndr.pl

index 4e344e3c37a46f29d37b73c314c4b0cfedb56ba8..2d4ca8a265e86e8f00c238db6574861cb188c147 100644 (file)
@@ -7,10 +7,11 @@
  - strip out pidl-specific properties
 
 - support nested elements
- - generate names for anonymous tagged types
+ - allow non-typedef structs
+ - generate names for anonymous tagged types. Simple MD5Sum of contents?
  - support typedefs properly
-
-- improve represent_as(): allow it to be used for arrays and other complex types
+ - improve represent_as(): allow it to be used for arrays and other complex 
+   types
 
 - --explain-ndr option that dumps out parse tree ?
 
index 5ef4dca379ef9b6a633042fc8af072a3dc7d8a75..3ca02c38726bed186b7f176f12e519912a51b03b 100644 (file)
@@ -160,10 +160,10 @@ decl_union: 'union'
         }}
 ;
 
-typedef: 'typedef' property_list type identifier array_len ';' 
+typedef: property_list 'typedef' type identifier array_len ';' 
         {{
                     "TYPE" => "TYPEDEF", 
-                     "PROPERTIES" => $_[2],
+                     "PROPERTIES" => $_[1],
                     "NAME" => $_[4],
                     "DATA" => $_[3],
                     "ARRAY_LEN" => $_[5],
@@ -187,11 +187,12 @@ type: usertype | existingtype | void { "void" } ;
 
 enum_body: '{' enum_elements '}' { $_[2] };
 opt_enum_body: | enum_body;
-enum: 'enum' optional_identifier opt_enum_body
+enum: property_list 'enum' optional_identifier opt_enum_body
         {{
              "TYPE" => "ENUM", 
-                        "NAME" => $_[2],
-                    "ELEMENTS" => $_[3]
+                        "PROPERTIES" => $_[1],
+                        "NAME" => $_[3],
+                    "ELEMENTS" => $_[4]
         }}
 ;
 
@@ -206,11 +207,12 @@ enum_element: identifier
 
 bitmap_body: '{' opt_bitmap_elements '}' { $_[2] };
 opt_bitmap_body: | bitmap_body;
-bitmap: 'bitmap' optional_identifier opt_bitmap_body
+bitmap: property_list 'bitmap' optional_identifier opt_bitmap_body
         {{
              "TYPE" => "BITMAP", 
-                        "NAME" => $_[2],
-                    "ELEMENTS" => $_[3]
+                    "PROPERTIES" => $_[1],
+                        "NAME" => $_[3],
+                    "ELEMENTS" => $_[4]
         }}
 ;
 
@@ -227,11 +229,12 @@ bitmap_element: identifier '=' anytext { "$_[1] ( $_[3] )" }
 struct_body: '{' element_list1 '}' { $_[2] };
 opt_struct_body: | struct_body;
 
-struct: 'struct' optional_identifier opt_struct_body
+struct: property_list 'struct' optional_identifier opt_struct_body
         {{
              "TYPE" => "STRUCT", 
-                        "NAME" => $_[2],
-                    "ELEMENTS" => $_[3]
+                        "PROPERTIES" => $_[1],
+                        "NAME" => $_[3],
+                    "ELEMENTS" => $_[4]
         }}
 ;
 
@@ -261,11 +264,12 @@ union_elements:
 union_body: '{' union_elements '}' { $_[2] };
 opt_union_body: | union_body;
 
-union: 'union' optional_identifier opt_union_body
+union: property_list 'union' optional_identifier opt_union_body
         {{
              "TYPE" => "UNION", 
-                    "NAME" => $_[2],
-                    "ELEMENTS" => $_[3]
+                        "PROPERTIES" => $_[1],
+                    "NAME" => $_[3],
+                    "ELEMENTS" => $_[4]
         }}
 ;
 
index f64db508d6b8518e5abe01118dc6f17504295ac0..4e02be05756b34398c6675955ee42b17ea3f5cc4 100644 (file)
@@ -1127,7 +1127,7 @@ sub new {
        [#Rule 2
                 'exp', 1,
 sub
-#line 22 "expr.yp"
+#line 22 "pidl/expr.yp"
 { "\"$_[1]\"" }
        ],
        [#Rule 3
@@ -1139,199 +1139,199 @@ sub
        [#Rule 5
                 'exp', 2,
 sub
-#line 25 "expr.yp"
+#line 25 "pidl/expr.yp"
 { "~$_[2]" }
        ],
        [#Rule 6
                 'exp', 3,
 sub
-#line 26 "expr.yp"
+#line 26 "pidl/expr.yp"
 { "$_[1] + $_[3]" }
        ],
        [#Rule 7
                 'exp', 3,
 sub
-#line 27 "expr.yp"
+#line 27 "pidl/expr.yp"
 { "$_[1] - $_[3]" }
        ],
        [#Rule 8
                 'exp', 3,
 sub
-#line 28 "expr.yp"
+#line 28 "pidl/expr.yp"
 { "$_[1] * $_[3]" }
        ],
        [#Rule 9
                 'exp', 3,
 sub
-#line 29 "expr.yp"
+#line 29 "pidl/expr.yp"
 { "$_[1] % $_[3]" }
        ],
        [#Rule 10
                 'exp', 3,
 sub
-#line 30 "expr.yp"
+#line 30 "pidl/expr.yp"
 { "$_[1] < $_[3]" }
        ],
        [#Rule 11
                 'exp', 3,
 sub
-#line 31 "expr.yp"
+#line 31 "pidl/expr.yp"
 { "$_[1] > $_[3]" }
        ],
        [#Rule 12
                 'exp', 3,
 sub
-#line 32 "expr.yp"
+#line 32 "pidl/expr.yp"
 { "$_[1] | $_[3]" }
        ],
        [#Rule 13
                 'exp', 3,
 sub
-#line 33 "expr.yp"
+#line 33 "pidl/expr.yp"
 { "$_[1] == $_[3]" }
        ],
        [#Rule 14
                 'exp', 3,
 sub
-#line 34 "expr.yp"
+#line 34 "pidl/expr.yp"
 { "$_[1] <= $_[3]" }
        ],
        [#Rule 15
                 'exp', 3,
 sub
-#line 35 "expr.yp"
+#line 35 "pidl/expr.yp"
 { "$_[1] => $_[3]" }
        ],
        [#Rule 16
                 'exp', 3,
 sub
-#line 36 "expr.yp"
+#line 36 "pidl/expr.yp"
 { "$_[1] << $_[3]" }
        ],
        [#Rule 17
                 'exp', 3,
 sub
-#line 37 "expr.yp"
+#line 37 "pidl/expr.yp"
 { "$_[1] >> $_[3]" }
        ],
        [#Rule 18
                 'exp', 3,
 sub
-#line 38 "expr.yp"
+#line 38 "pidl/expr.yp"
 { "$_[1] != $_[3]" }
        ],
        [#Rule 19
                 'exp', 3,
 sub
-#line 39 "expr.yp"
+#line 39 "pidl/expr.yp"
 { "$_[1] || $_[3]" }
        ],
        [#Rule 20
                 'exp', 3,
 sub
-#line 40 "expr.yp"
+#line 40 "pidl/expr.yp"
 { "$_[1] && $_[3]" }
        ],
        [#Rule 21
                 'exp', 3,
 sub
-#line 41 "expr.yp"
+#line 41 "pidl/expr.yp"
 { "$_[1] & $_[3]" }
        ],
        [#Rule 22
                 'exp', 5,
 sub
-#line 42 "expr.yp"
+#line 42 "pidl/expr.yp"
 { "$_[1]?$_[3]:$_[5]" }
        ],
        [#Rule 23
                 'exp', 2,
 sub
-#line 43 "expr.yp"
+#line 43 "pidl/expr.yp"
 { "~$_[1]" }
        ],
        [#Rule 24
                 'exp', 2,
 sub
-#line 44 "expr.yp"
+#line 44 "pidl/expr.yp"
 { "not $_[1]" }
        ],
        [#Rule 25
                 'exp', 3,
 sub
-#line 45 "expr.yp"
+#line 45 "pidl/expr.yp"
 { "$_[1] / $_[3]" }
        ],
        [#Rule 26
                 'exp', 2,
 sub
-#line 46 "expr.yp"
+#line 46 "pidl/expr.yp"
 { "-$_[2]" }
        ],
        [#Rule 27
                 'exp', 2,
 sub
-#line 47 "expr.yp"
+#line 47 "pidl/expr.yp"
 { "&$_[2]" }
        ],
        [#Rule 28
                 'exp', 3,
 sub
-#line 48 "expr.yp"
+#line 48 "pidl/expr.yp"
 { "$_[1]^$_[3]" }
        ],
        [#Rule 29
                 'exp', 3,
 sub
-#line 49 "expr.yp"
+#line 49 "pidl/expr.yp"
 { "($_[2])" }
        ],
        [#Rule 30
                 'possible_pointer', 1,
 sub
-#line 53 "expr.yp"
+#line 53 "pidl/expr.yp"
 { $_[0]->_Lookup($_[1]) }
        ],
        [#Rule 31
                 'possible_pointer', 2,
 sub
-#line 54 "expr.yp"
+#line 54 "pidl/expr.yp"
 { $_[0]->_Dereference($_[2]); "*$_[2]" }
        ],
        [#Rule 32
                 'var', 1,
 sub
-#line 57 "expr.yp"
+#line 57 "pidl/expr.yp"
 { $_[0]->_Use($_[1]) }
        ],
        [#Rule 33
                 'var', 3,
 sub
-#line 58 "expr.yp"
+#line 58 "pidl/expr.yp"
 { $_[0]->_Use("$_[1].$_[3]") }
        ],
        [#Rule 34
                 'var', 3,
 sub
-#line 59 "expr.yp"
+#line 59 "pidl/expr.yp"
 { "($_[2])" }
        ],
        [#Rule 35
                 'var', 3,
 sub
-#line 60 "expr.yp"
+#line 60 "pidl/expr.yp"
 { $_[0]->_Use("*$_[1]"); $_[1]."->".$_[3] }
        ],
        [#Rule 36
                 'func', 4,
 sub
-#line 64 "expr.yp"
+#line 64 "pidl/expr.yp"
 { "$_[1]($_[3])" }
        ],
        [#Rule 37
                 'opt_args', 0,
 sub
-#line 65 "expr.yp"
+#line 65 "pidl/expr.yp"
 { "" }
        ],
        [#Rule 38
@@ -1349,7 +1349,7 @@ sub
        [#Rule 42
                 'args', 3,
 sub
-#line 68 "expr.yp"
+#line 68 "pidl/expr.yp"
 { "$_[1], $_[3]" }
        ]
 ],
@@ -1357,7 +1357,7 @@ sub
     bless($self,$class);
 }
 
-#line 71 "expr.yp"
+#line 71 "pidl/expr.yp"
 
 
 package Parse::Pidl::Expr;
index 71c44708703f43f33a65feccd08e05c5498e6592..e547b2caa8a5407f2aa0fc700b4785891f63cd2a 100644 (file)
@@ -258,29 +258,24 @@ sub new {
        },
        {#State 39
                ACTIONS => {
-                       "typedef" => 49,
-                       "union" => 50,
-                       "enum" => 63,
-                       "bitmap" => 64,
                        "declare" => 56,
-                       "const" => 58,
-                       "struct" => 61
+                       "const" => 60
                },
                DEFAULT => -91,
                GOTOS => {
-                       'typedecl' => 62,
-                       'function' => 51,
-                       'bitmap' => 65,
+                       'typedecl' => 49,
+                       'function' => 50,
                        'definitions' => 52,
+                       'bitmap' => 51,
                        'definition' => 55,
                        'property_list' => 54,
                        'usertype' => 53,
-                       'declare' => 67,
-                       'const' => 66,
+                       'const' => 59,
+                       'declare' => 58,
                        'struct' => 57,
-                       'enum' => 59,
-                       'typedef' => 60,
-                       'union' => 68
+                       'typedef' => 62,
+                       'enum' => 61,
+                       'union' => 63
                }
        },
        {#State 40
@@ -288,28 +283,28 @@ sub new {
        },
        {#State 41
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "*" => 74,
-                       "?" => 75,
-                       "{" => 76,
-                       "&" => 77,
-                       "/" => 78,
-                       "=" => 79,
-                       "(" => 80,
-                       "|" => 81,
-                       "." => 82,
-                       ">" => 83
+                       "-" => 65,
+                       ":" => 64,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "*" => 76,
+                       "?" => 66,
+                       "{" => 70,
+                       "&" => 71,
+                       "/" => 72,
+                       "=" => 73,
+                       "(" => 74,
+                       "|" => 75,
+                       "." => 77,
+                       ">" => 78
                },
                DEFAULT => -97
        },
        {#State 42
                ACTIONS => {
-                       "," => 84,
-                       ")" => 85
+                       "," => 79,
+                       ")" => 80
                }
        },
        {#State 43
@@ -326,11 +321,11 @@ sub new {
        },
        {#State 47
                ACTIONS => {
-                       ";" => 86
+                       ";" => 82
                },
                DEFAULT => -125,
                GOTOS => {
-                       'optional_semicolon' => 87
+                       'optional_semicolon' => 81
                }
        },
        {#State 48
@@ -338,81 +333,69 @@ sub new {
                        'IDENTIFIER' => 22
                },
                GOTOS => {
-                       'identifier' => 88
+                       'identifier' => 83
                }
        },
        {#State 49
-               DEFAULT => -91,
-               GOTOS => {
-                       'property_list' => 89
-               }
+               DEFAULT => -24
        },
        {#State 50
-               ACTIONS => {
-                       'IDENTIFIER' => 90
-               },
-               DEFAULT => -122,
-               GOTOS => {
-                       'optional_identifier' => 91
-               }
+               DEFAULT => -20
        },
        {#State 51
-               DEFAULT => -20
+               DEFAULT => -39
        },
        {#State 52
                ACTIONS => {
-                       "}" => 92,
-                       "typedef" => 49,
-                       "union" => 50,
-                       "enum" => 63,
-                       "bitmap" => 64,
+                       "}" => 84,
                        "declare" => 56,
-                       "const" => 58,
-                       "struct" => 61
+                       "const" => 60
                },
                DEFAULT => -91,
                GOTOS => {
-                       'typedecl' => 62,
-                       'function' => 51,
-                       'bitmap' => 65,
-                       'definition' => 93,
+                       'typedecl' => 49,
+                       'function' => 50,
+                       'bitmap' => 51,
+                       'definition' => 85,
                        'property_list' => 54,
                        'usertype' => 53,
-                       'const' => 66,
+                       'const' => 59,
                        'struct' => 57,
-                       'declare' => 67,
-                       'enum' => 59,
-                       'typedef' => 60,
-                       'union' => 68
+                       'declare' => 58,
+                       'typedef' => 62,
+                       'enum' => 61,
+                       'union' => 63
                }
        },
        {#State 53
                ACTIONS => {
-                       ";" => 94
+                       ";" => 86
                }
        },
        {#State 54
                ACTIONS => {
+                       "typedef" => 87,
                        'IDENTIFIER' => 22,
-                       "signed" => 100,
-                       "union" => 50,
-                       "enum" => 63,
-                       "bitmap" => 64,
-                       'void' => 95,
-                       "unsigned" => 101,
+                       "signed" => 95,
+                       "union" => 88,
+                       "enum" => 97,
+                       "bitmap" => 98,
+                       'void' => 89,
+                       "unsigned" => 99,
                        "[" => 17,
-                       "struct" => 61
+                       "struct" => 94
                },
                GOTOS => {
-                       'existingtype' => 99,
-                       'bitmap' => 65,
-                       'usertype' => 96,
-                       'identifier' => 97,
+                       'existingtype' => 96,
+                       'bitmap' => 51,
+                       'usertype' => 91,
+                       'property_list' => 90,
+                       'identifier' => 92,
                        'struct' => 57,
-                       'enum' => 59,
-                       'type' => 102,
-                       'union' => 68,
-                       'sign' => 98
+                       'enum' => 61,
+                       'type' => 100,
+                       'union' => 63,
+                       'sign' => 93
                }
        },
        {#State 55
@@ -421,69 +404,36 @@ sub new {
        {#State 56
                DEFAULT => -91,
                GOTOS => {
-                       'property_list' => 103
+                       'property_list' => 101
                }
        },
        {#State 57
                DEFAULT => -36
        },
        {#State 58
-               ACTIONS => {
-                       'IDENTIFIER' => 22
-               },
-               GOTOS => {
-                       'identifier' => 104
-               }
+               DEFAULT => -23
        },
        {#State 59
-               DEFAULT => -38
+               DEFAULT => -21
        },
        {#State 60
-               DEFAULT => -22
-       },
-       {#State 61
                ACTIONS => {
-                       'IDENTIFIER' => 90
+                       'IDENTIFIER' => 22
                },
-               DEFAULT => -122,
                GOTOS => {
-                       'optional_identifier' => 105
+                       'identifier' => 102
                }
        },
+       {#State 61
+               DEFAULT => -38
+       },
        {#State 62
-               DEFAULT => -24
+               DEFAULT => -22
        },
        {#State 63
-               ACTIONS => {
-                       'IDENTIFIER' => 90
-               },
-               DEFAULT => -122,
-               GOTOS => {
-                       'optional_identifier' => 106
-               }
-       },
-       {#State 64
-               ACTIONS => {
-                       'IDENTIFIER' => 90
-               },
-               DEFAULT => -122,
-               GOTOS => {
-                       'optional_identifier' => 107
-               }
-       },
-       {#State 65
-               DEFAULT => -39
-       },
-       {#State 66
-               DEFAULT => -21
-       },
-       {#State 67
-               DEFAULT => -23
-       },
-       {#State 68
                DEFAULT => -37
        },
-       {#State 69
+       {#State 64
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -492,12 +442,12 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 108,
+                       'anytext' => 103,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 70
+       {#State 65
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -506,12 +456,12 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 109,
+                       'anytext' => 104,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 71
+       {#State 66
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -520,12 +470,12 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 110,
+                       'anytext' => 105,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 72
+       {#State 67
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -534,12 +484,12 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 111,
+                       'anytext' => 106,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 73
+       {#State 68
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -548,12 +498,12 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 112,
+                       'anytext' => 107,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 74
+       {#State 69
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -562,12 +512,12 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 113,
+                       'anytext' => 108,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 75
+       {#State 70
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -576,12 +526,13 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 114,
+                       'anytext' => 109,
                        'text' => 46,
-                       'constant' => 43
+                       'constant' => 43,
+                       'commalisttext' => 110
                }
        },
-       {#State 76
+       {#State 71
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -590,13 +541,12 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 115,
+                       'anytext' => 111,
                        'text' => 46,
-                       'constant' => 43,
-                       'commalisttext' => 116
+                       'constant' => 43
                }
        },
-       {#State 77
+       {#State 72
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -605,12 +555,12 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 117,
+                       'anytext' => 112,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 78
+       {#State 73
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -619,12 +569,12 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 118,
+                       'anytext' => 113,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 79
+       {#State 74
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -633,12 +583,13 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 119,
+                       'anytext' => 109,
                        'text' => 46,
-                       'constant' => 43
+                       'constant' => 43,
+                       'commalisttext' => 114
                }
        },
-       {#State 80
+       {#State 75
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -649,11 +600,10 @@ sub new {
                        'identifier' => 45,
                        'anytext' => 115,
                        'text' => 46,
-                       'constant' => 43,
-                       'commalisttext' => 120
+                       'constant' => 43
                }
        },
-       {#State 81
+       {#State 76
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -662,12 +612,12 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 121,
+                       'anytext' => 116,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 82
+       {#State 77
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -676,12 +626,12 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 122,
+                       'anytext' => 117,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 83
+       {#State 78
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -690,12 +640,12 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 123,
+                       'anytext' => 118,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 84
+       {#State 79
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -704,785 +654,807 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 124,
+                       'anytext' => 119,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 85
+       {#State 80
                DEFAULT => -96
        },
-       {#State 86
+       {#State 81
+               DEFAULT => -12
+       },
+       {#State 82
                DEFAULT => -126
        },
-       {#State 87
-               DEFAULT => -12
+       {#State 83
+               ACTIONS => {
+                       ";" => 120
+               }
        },
-       {#State 88
+       {#State 84
                ACTIONS => {
-                       ";" => 125
+                       ";" => 82
+               },
+               DEFAULT => -125,
+               GOTOS => {
+                       'optional_semicolon' => 121
                }
        },
-       {#State 89
+       {#State 85
+               DEFAULT => -19
+       },
+       {#State 86
+               DEFAULT => -40
+       },
+       {#State 87
                ACTIONS => {
                        'IDENTIFIER' => 22,
-                       "signed" => 100,
-                       "union" => 50,
-                       "enum" => 63,
-                       "bitmap" => 64,
-                       'void' => 95,
-                       "unsigned" => 101,
-                       "[" => 17,
-                       "struct" => 61
+                       "signed" => 95,
+                       'void' => 89,
+                       "unsigned" => 99
                },
+               DEFAULT => -91,
                GOTOS => {
-                       'existingtype' => 99,
-                       'bitmap' => 65,
-                       'usertype' => 96,
-                       'identifier' => 97,
+                       'existingtype' => 96,
+                       'bitmap' => 51,
+                       'usertype' => 91,
+                       'property_list' => 90,
+                       'identifier' => 92,
                        'struct' => 57,
-                       'enum' => 59,
-                       'type' => 126,
-                       'union' => 68,
-                       'sign' => 98
+                       'enum' => 61,
+                       'type' => 122,
+                       'union' => 63,
+                       'sign' => 93
                }
        },
-       {#State 90
-               DEFAULT => -121
-       },
-       {#State 91
+       {#State 88
                ACTIONS => {
-                       "{" => 128
+                       'IDENTIFIER' => 123
                },
-               DEFAULT => -76,
+               DEFAULT => -122,
                GOTOS => {
-                       'union_body' => 129,
-                       'opt_union_body' => 127
+                       'optional_identifier' => 124
+               }
+       },
+       {#State 89
+               DEFAULT => -47
+       },
+       {#State 90
+               ACTIONS => {
+                       "union" => 88,
+                       "enum" => 97,
+                       "bitmap" => 98,
+                       "[" => 17,
+                       "struct" => 94
                }
        },
+       {#State 91
+               DEFAULT => -45
+       },
        {#State 92
+               DEFAULT => -44
+       },
+       {#State 93
                ACTIONS => {
-                       ";" => 86
+                       'IDENTIFIER' => 22
                },
-               DEFAULT => -125,
                GOTOS => {
-                       'optional_semicolon' => 130
+                       'identifier' => 125
                }
        },
-       {#State 93
-               DEFAULT => -19
-       },
        {#State 94
-               DEFAULT => -40
+               ACTIONS => {
+                       'IDENTIFIER' => 123
+               },
+               DEFAULT => -122,
+               GOTOS => {
+                       'optional_identifier' => 126
+               }
        },
        {#State 95
-               DEFAULT => -47
+               DEFAULT => -41
        },
        {#State 96
-               DEFAULT => -45
+               DEFAULT => -46
        },
        {#State 97
-               DEFAULT => -44
+               ACTIONS => {
+                       'IDENTIFIER' => 123
+               },
+               DEFAULT => -122,
+               GOTOS => {
+                       'optional_identifier' => 127
+               }
        },
        {#State 98
                ACTIONS => {
-                       'IDENTIFIER' => 22
+                       'IDENTIFIER' => 123
                },
+               DEFAULT => -122,
                GOTOS => {
-                       'identifier' => 131
+                       'optional_identifier' => 128
                }
        },
        {#State 99
-               DEFAULT => -46
-       },
-       {#State 100
-               DEFAULT => -41
-       },
-       {#State 101
                DEFAULT => -42
        },
-       {#State 102
+       {#State 100
                ACTIONS => {
                        'IDENTIFIER' => 22
                },
                GOTOS => {
-                       'identifier' => 132
+                       'identifier' => 129
                }
        },
-       {#State 103
+       {#State 101
                ACTIONS => {
-                       "union" => 133,
-                       "enum" => 138,
-                       "bitmap" => 139,
+                       "union" => 130,
+                       "enum" => 135,
+                       "bitmap" => 136,
                        "[" => 17
                },
                GOTOS => {
-                       'decl_enum' => 134,
-                       'decl_bitmap' => 135,
-                       'decl_type' => 137,
-                       'decl_union' => 136
+                       'decl_enum' => 131,
+                       'decl_bitmap' => 132,
+                       'decl_type' => 134,
+                       'decl_union' => 133
                }
        },
-       {#State 104
+       {#State 102
                DEFAULT => -80,
                GOTOS => {
-                       'pointers' => 140
+                       'pointers' => 137
                }
        },
+       {#State 103
+               ACTIONS => {
+                       "-" => 65,
+                       ":" => 64,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "*" => 76,
+                       "?" => 66,
+                       "{" => 70,
+                       "&" => 71,
+                       "/" => 72,
+                       "=" => 73,
+                       "(" => 74,
+                       "|" => 75,
+                       "." => 77,
+                       ">" => 78
+               },
+               DEFAULT => -114
+       },
+       {#State 104
+               ACTIONS => {
+                       ":" => 64,
+                       "<" => 67,
+                       "~" => 68,
+                       "?" => 66,
+                       "{" => 70,
+                       "=" => 73
+               },
+               DEFAULT => -105
+       },
        {#State 105
                ACTIONS => {
-                       "{" => 142
+                       "-" => 65,
+                       ":" => 64,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "*" => 76,
+                       "?" => 66,
+                       "{" => 70,
+                       "&" => 71,
+                       "/" => 72,
+                       "=" => 73,
+                       "(" => 74,
+                       "|" => 75,
+                       "." => 77,
+                       ">" => 78
                },
-               DEFAULT => -66,
-               GOTOS => {
-                       'struct_body' => 141,
-                       'opt_struct_body' => 143
-               }
+               DEFAULT => -113
        },
        {#State 106
                ACTIONS => {
-                       "{" => 144
+                       "-" => 65,
+                       ":" => 64,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "*" => 76,
+                       "?" => 66,
+                       "{" => 70,
+                       "&" => 71,
+                       "/" => 72,
+                       "=" => 73,
+                       "(" => 74,
+                       "|" => 75,
+                       "." => 77,
+                       ">" => 78
                },
-               DEFAULT => -49,
-               GOTOS => {
-                       'opt_enum_body' => 146,
-                       'enum_body' => 145
-               }
+               DEFAULT => -109
        },
        {#State 107
                ACTIONS => {
-                       "{" => 148
+                       "-" => 65,
+                       ":" => 64,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "*" => 76,
+                       "?" => 66,
+                       "{" => 70,
+                       "&" => 71,
+                       "/" => 72,
+                       "=" => 73,
+                       "(" => 74,
+                       "|" => 75,
+                       "." => 77,
+                       ">" => 78
                },
-               DEFAULT => -57,
-               GOTOS => {
-                       'bitmap_body' => 149,
-                       'opt_bitmap_body' => 147
-               }
+               DEFAULT => -117
        },
        {#State 108
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "*" => 74,
-                       "?" => 75,
-                       "{" => 76,
-                       "&" => 77,
-                       "/" => 78,
-                       "=" => 79,
-                       "(" => 80,
-                       "|" => 81,
-                       "." => 82,
-                       ">" => 83
+                       ":" => 64,
+                       "<" => 67,
+                       "~" => 68,
+                       "?" => 66,
+                       "{" => 70,
+                       "=" => 73
                },
-               DEFAULT => -114
+               DEFAULT => -116
        },
        {#State 109
                ACTIONS => {
-                       ":" => 69,
-                       "<" => 71,
-                       "~" => 72,
-                       "?" => 75,
-                       "{" => 76,
-                       "=" => 79
+                       "-" => 65,
+                       ":" => 64,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "*" => 76,
+                       "?" => 66,
+                       "{" => 70,
+                       "&" => 71,
+                       "/" => 72,
+                       "=" => 73,
+                       "(" => 74,
+                       "|" => 75,
+                       "." => 77,
+                       ">" => 78
                },
-               DEFAULT => -105
+               DEFAULT => -99
        },
        {#State 110
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "*" => 74,
-                       "?" => 75,
-                       "{" => 76,
-                       "&" => 77,
-                       "/" => 78,
-                       "=" => 79,
-                       "(" => 80,
-                       "|" => 81,
-                       "." => 82,
-                       ">" => 83
-               },
-               DEFAULT => -109
+                       "}" => 138,
+                       "," => 139
+               }
        },
        {#State 111
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "*" => 74,
-                       "?" => 75,
-                       "{" => 76,
-                       "&" => 77,
-                       "/" => 78,
-                       "=" => 79,
-                       "(" => 80,
-                       "|" => 81,
-                       "." => 82,
-                       ">" => 83
+                       ":" => 64,
+                       "<" => 67,
+                       "~" => 68,
+                       "?" => 66,
+                       "{" => 70,
+                       "=" => 73
                },
-               DEFAULT => -117
+               DEFAULT => -111
        },
        {#State 112
                ACTIONS => {
-                       ":" => 69,
-                       "<" => 71,
-                       "~" => 72,
-                       "?" => 75,
-                       "{" => 76,
-                       "=" => 79
+                       ":" => 64,
+                       "<" => 67,
+                       "~" => 68,
+                       "?" => 66,
+                       "{" => 70,
+                       "=" => 73
                },
-               DEFAULT => -116
+               DEFAULT => -112
        },
        {#State 113
                ACTIONS => {
-                       ":" => 69,
-                       "<" => 71,
-                       "~" => 72,
-                       "?" => 75,
-                       "{" => 76,
-                       "=" => 79
+                       "-" => 65,
+                       ":" => 64,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "*" => 76,
+                       "?" => 66,
+                       "{" => 70,
+                       "&" => 71,
+                       "/" => 72,
+                       "=" => 73,
+                       "(" => 74,
+                       "|" => 75,
+                       "." => 77,
+                       ">" => 78
                },
-               DEFAULT => -107
+               DEFAULT => -115
        },
        {#State 114
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "*" => 74,
-                       "?" => 75,
-                       "{" => 76,
-                       "&" => 77,
-                       "/" => 78,
-                       "=" => 79,
-                       "(" => 80,
-                       "|" => 81,
-                       "." => 82,
-                       ">" => 83
-               },
-               DEFAULT => -113
+                       "," => 139,
+                       ")" => 140
+               }
        },
        {#State 115
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "*" => 74,
-                       "?" => 75,
-                       "{" => 76,
-                       "&" => 77,
-                       "/" => 78,
-                       "=" => 79,
-                       "(" => 80,
-                       "|" => 81,
-                       "." => 82,
-                       ">" => 83
+                       ":" => 64,
+                       "<" => 67,
+                       "~" => 68,
+                       "?" => 66,
+                       "{" => 70,
+                       "=" => 73
                },
-               DEFAULT => -99
+               DEFAULT => -110
        },
        {#State 116
                ACTIONS => {
-                       "}" => 150,
-                       "," => 151
-               }
+                       ":" => 64,
+                       "<" => 67,
+                       "~" => 68,
+                       "?" => 66,
+                       "{" => 70,
+                       "=" => 73
+               },
+               DEFAULT => -107
        },
        {#State 117
                ACTIONS => {
-                       ":" => 69,
-                       "<" => 71,
-                       "~" => 72,
-                       "?" => 75,
-                       "{" => 76,
-                       "=" => 79
+                       ":" => 64,
+                       "<" => 67,
+                       "~" => 68,
+                       "?" => 66,
+                       "{" => 70,
+                       "=" => 73
                },
-               DEFAULT => -111
+               DEFAULT => -106
        },
        {#State 118
                ACTIONS => {
-                       ":" => 69,
-                       "<" => 71,
-                       "~" => 72,
-                       "?" => 75,
-                       "{" => 76,
-                       "=" => 79
+                       ":" => 64,
+                       "<" => 67,
+                       "~" => 68,
+                       "?" => 66,
+                       "{" => 70,
+                       "=" => 73
                },
-               DEFAULT => -112
+               DEFAULT => -108
        },
        {#State 119
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "*" => 74,
-                       "?" => 75,
-                       "{" => 76,
-                       "&" => 77,
-                       "/" => 78,
-                       "=" => 79,
-                       "(" => 80,
-                       "|" => 81,
-                       "." => 82,
-                       ">" => 83
+                       "-" => 65,
+                       ":" => 64,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "*" => 76,
+                       "?" => 66,
+                       "{" => 70,
+                       "&" => 71,
+                       "/" => 72,
+                       "=" => 73,
+                       "(" => 74,
+                       "|" => 75,
+                       "." => 77,
+                       ">" => 78
                },
-               DEFAULT => -115
+               DEFAULT => -98
        },
        {#State 120
-               ACTIONS => {
-                       "," => 151,
-                       ")" => 152
-               }
+               DEFAULT => -14
        },
        {#State 121
-               ACTIONS => {
-                       ":" => 69,
-                       "<" => 71,
-                       "~" => 72,
-                       "?" => 75,
-                       "{" => 76,
-                       "=" => 79
-               },
-               DEFAULT => -110
+               DEFAULT => -15
        },
        {#State 122
                ACTIONS => {
-                       ":" => 69,
-                       "<" => 71,
-                       "~" => 72,
-                       "?" => 75,
-                       "{" => 76,
-                       "=" => 79
+                       'IDENTIFIER' => 22
                },
-               DEFAULT => -106
+               GOTOS => {
+                       'identifier' => 141
+               }
        },
        {#State 123
-               ACTIONS => {
-                       ":" => 69,
-                       "<" => 71,
-                       "~" => 72,
-                       "?" => 75,
-                       "{" => 76,
-                       "=" => 79
-               },
-               DEFAULT => -108
+               DEFAULT => -121
        },
        {#State 124
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "*" => 74,
-                       "?" => 75,
-                       "{" => 76,
-                       "&" => 77,
-                       "/" => 78,
-                       "=" => 79,
-                       "(" => 80,
-                       "|" => 81,
-                       "." => 82,
-                       ">" => 83
+                       "{" => 143
                },
-               DEFAULT => -98
+               DEFAULT => -76,
+               GOTOS => {
+                       'union_body' => 144,
+                       'opt_union_body' => 142
+               }
        },
        {#State 125
-               DEFAULT => -14
+               DEFAULT => -43
        },
        {#State 126
                ACTIONS => {
-                       'IDENTIFIER' => 22
+                       "{" => 146
                },
+               DEFAULT => -66,
                GOTOS => {
-                       'identifier' => 153
+                       'struct_body' => 145,
+                       'opt_struct_body' => 147
                }
        },
        {#State 127
-               DEFAULT => -78
+               ACTIONS => {
+                       "{" => 148
+               },
+               DEFAULT => -49,
+               GOTOS => {
+                       'opt_enum_body' => 150,
+                       'enum_body' => 149
+               }
        },
        {#State 128
-               DEFAULT => -73,
+               ACTIONS => {
+                       "{" => 152
+               },
+               DEFAULT => -57,
                GOTOS => {
-                       'union_elements' => 154
+                       'bitmap_body' => 153,
+                       'opt_bitmap_body' => 151
                }
        },
        {#State 129
-               DEFAULT => -77
+               ACTIONS => {
+                       "(" => 154
+               }
        },
        {#State 130
-               DEFAULT => -15
+               DEFAULT => -34
        },
        {#State 131
-               DEFAULT => -43
+               DEFAULT => -29
        },
        {#State 132
-               ACTIONS => {
-                       "(" => 155
-               }
+               DEFAULT => -30
        },
        {#State 133
-               DEFAULT => -34
+               DEFAULT => -31
        },
        {#State 134
-               DEFAULT => -29
+               ACTIONS => {
+                       'IDENTIFIER' => 22
+               },
+               GOTOS => {
+                       'identifier' => 155
+               }
        },
        {#State 135
-               DEFAULT => -30
+               DEFAULT => -32
        },
        {#State 136
-               DEFAULT => -31
+               DEFAULT => -33
        },
        {#State 137
                ACTIONS => {
-                       'IDENTIFIER' => 22
+                       'IDENTIFIER' => 22,
+                       "*" => 157
                },
                GOTOS => {
                        'identifier' => 156
                }
        },
        {#State 138
-               DEFAULT => -32
+               ACTIONS => {
+                       'CONSTANT' => 44,
+                       'TEXT' => 13,
+                       'IDENTIFIER' => 22
+               },
+               DEFAULT => -101,
+               GOTOS => {
+                       'identifier' => 45,
+                       'anytext' => 158,
+                       'text' => 46,
+                       'constant' => 43
+               }
        },
        {#State 139
-               DEFAULT => -33
+               ACTIONS => {
+                       'CONSTANT' => 44,
+                       'TEXT' => 13,
+                       'IDENTIFIER' => 22
+               },
+               DEFAULT => -101,
+               GOTOS => {
+                       'identifier' => 45,
+                       'anytext' => 159,
+                       'text' => 46,
+                       'constant' => 43
+               }
        },
        {#State 140
                ACTIONS => {
-                       'IDENTIFIER' => 22,
-                       "*" => 158
+                       'CONSTANT' => 44,
+                       'TEXT' => 13,
+                       'IDENTIFIER' => 22
                },
+               DEFAULT => -101,
                GOTOS => {
-                       'identifier' => 157
+                       'identifier' => 45,
+                       'anytext' => 160,
+                       'text' => 46,
+                       'constant' => 43
                }
        },
        {#State 141
-               DEFAULT => -67
-       },
-       {#State 142
-               DEFAULT => -82,
+               ACTIONS => {
+                       "[" => 161
+               },
+               DEFAULT => -88,
                GOTOS => {
-                       'element_list1' => 159
+                       'array_len' => 162
                }
        },
-       {#State 143
-               DEFAULT => -68
+       {#State 142
+               DEFAULT => -78
        },
-       {#State 144
-               ACTIONS => {
-                       'IDENTIFIER' => 22
-               },
+       {#State 143
+               DEFAULT => -73,
                GOTOS => {
-                       'identifier' => 160,
-                       'enum_element' => 161,
-                       'enum_elements' => 162
+                       'union_elements' => 163
                }
        },
+       {#State 144
+               DEFAULT => -77
+       },
        {#State 145
-               DEFAULT => -50
+               DEFAULT => -67
        },
        {#State 146
-               DEFAULT => -51
+               DEFAULT => -82,
+               GOTOS => {
+                       'element_list1' => 164
+               }
        },
        {#State 147
-               DEFAULT => -59
+               DEFAULT => -68
        },
        {#State 148
                ACTIONS => {
                        'IDENTIFIER' => 22
                },
-               DEFAULT => -62,
                GOTOS => {
                        'identifier' => 165,
-                       'bitmap_element' => 164,
-                       'bitmap_elements' => 163,
-                       'opt_bitmap_elements' => 166
+                       'enum_element' => 166,
+                       'enum_elements' => 167
                }
        },
        {#State 149
-               DEFAULT => -58
+               DEFAULT => -50
        },
        {#State 150
-               ACTIONS => {
-                       'CONSTANT' => 44,
-                       'TEXT' => 13,
-                       'IDENTIFIER' => 22
-               },
-               DEFAULT => -101,
-               GOTOS => {
-                       'identifier' => 45,
-                       'anytext' => 167,
-                       'text' => 46,
-                       'constant' => 43
-               }
+               DEFAULT => -51
        },
        {#State 151
-               ACTIONS => {
-                       'CONSTANT' => 44,
-                       'TEXT' => 13,
-                       'IDENTIFIER' => 22
-               },
-               DEFAULT => -101,
-               GOTOS => {
-                       'identifier' => 45,
-                       'anytext' => 168,
-                       'text' => 46,
-                       'constant' => 43
-               }
+               DEFAULT => -59
        },
        {#State 152
                ACTIONS => {
-                       'CONSTANT' => 44,
-                       'TEXT' => 13,
                        'IDENTIFIER' => 22
                },
-               DEFAULT => -101,
+               DEFAULT => -62,
                GOTOS => {
-                       'identifier' => 45,
-                       'anytext' => 169,
-                       'text' => 46,
-                       'constant' => 43
+                       'identifier' => 170,
+                       'bitmap_element' => 169,
+                       'bitmap_elements' => 168,
+                       'opt_bitmap_elements' => 171
                }
        },
        {#State 153
-               ACTIONS => {
-                       "[" => 170
-               },
-               DEFAULT => -88,
-               GOTOS => {
-                       'array_len' => 171
-               }
+               DEFAULT => -58
        },
        {#State 154
                ACTIONS => {
-                       "}" => 172
+                       "," => -84,
+                       "void" => 175,
+                       ")" => -84
                },
                DEFAULT => -91,
                GOTOS => {
-                       'optional_base_element' => 174,
+                       'base_element' => 172,
+                       'element_list2' => 174,
                        'property_list' => 173
                }
        },
        {#State 155
                ACTIONS => {
-                       "," => -84,
-                       "void" => 178,
-                       ")" => -84
-               },
-               DEFAULT => -91,
-               GOTOS => {
-                       'base_element' => 175,
-                       'element_list2' => 177,
-                       'property_list' => 176
+                       ";" => 176
                }
        },
        {#State 156
                ACTIONS => {
-                       ";" => 179
-               }
-       },
-       {#State 157
-               ACTIONS => {
-                       "[" => 170,
-                       "=" => 181
+                       "[" => 161,
+                       "=" => 178
                },
                GOTOS => {
-                       'array_len' => 180
+                       'array_len' => 177
                }
        },
-       {#State 158
+       {#State 157
                DEFAULT => -81
        },
+       {#State 158
+               ACTIONS => {
+                       "-" => 65,
+                       ":" => 64,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "*" => 76,
+                       "?" => 66,
+                       "{" => 70,
+                       "&" => 71,
+                       "/" => 72,
+                       "=" => 73,
+                       "(" => 74,
+                       "|" => 75,
+                       "." => 77,
+                       ">" => 78
+               },
+               DEFAULT => -119
+       },
        {#State 159
                ACTIONS => {
-                       "}" => 182
+                       "-" => 65,
+                       ":" => 64,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "*" => 76,
+                       "?" => 66,
+                       "{" => 70,
+                       "&" => 71,
+                       "/" => 72,
+                       "=" => 73,
+                       "(" => 74,
+                       "|" => 75,
+                       "." => 77,
+                       ">" => 78
                },
-               DEFAULT => -91,
-               GOTOS => {
-                       'base_element' => 183,
-                       'property_list' => 176
-               }
+               DEFAULT => -100
        },
        {#State 160
                ACTIONS => {
-                       "=" => 184
+                       ":" => 64,
+                       "<" => 67,
+                       "~" => 68,
+                       "?" => 66,
+                       "{" => 70,
+                       "=" => 73
                },
-               DEFAULT => -54
+               DEFAULT => -118
        },
        {#State 161
-               DEFAULT => -52
+               ACTIONS => {
+                       'CONSTANT' => 44,
+                       'TEXT' => 13,
+                       "]" => 179,
+                       'IDENTIFIER' => 22
+               },
+               DEFAULT => -101,
+               GOTOS => {
+                       'identifier' => 45,
+                       'anytext' => 180,
+                       'text' => 46,
+                       'constant' => 43
+               }
        },
        {#State 162
                ACTIONS => {
-                       "}" => 185,
-                       "," => 186
+                       ";" => 181
                }
        },
        {#State 163
                ACTIONS => {
-                       "," => 187
+                       "}" => 182
                },
-               DEFAULT => -63
+               DEFAULT => -91,
+               GOTOS => {
+                       'optional_base_element' => 184,
+                       'property_list' => 183
+               }
        },
        {#State 164
-               DEFAULT => -60
+               ACTIONS => {
+                       "}" => 185
+               },
+               DEFAULT => -91,
+               GOTOS => {
+                       'base_element' => 186,
+                       'property_list' => 173
+               }
        },
        {#State 165
                ACTIONS => {
-                       "=" => 188
-               }
+                       "=" => 187
+               },
+               DEFAULT => -54
        },
        {#State 166
-               ACTIONS => {
-                       "}" => 189
-               }
+               DEFAULT => -52
        },
        {#State 167
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "*" => 74,
-                       "?" => 75,
-                       "{" => 76,
-                       "&" => 77,
-                       "/" => 78,
-                       "=" => 79,
-                       "(" => 80,
-                       "|" => 81,
-                       "." => 82,
-                       ">" => 83
-               },
-               DEFAULT => -119
+                       "}" => 188,
+                       "," => 189
+               }
        },
        {#State 168
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "*" => 74,
-                       "?" => 75,
-                       "{" => 76,
-                       "&" => 77,
-                       "/" => 78,
-                       "=" => 79,
-                       "(" => 80,
-                       "|" => 81,
-                       "." => 82,
-                       ">" => 83
+                       "," => 190
                },
-               DEFAULT => -100
+               DEFAULT => -63
        },
        {#State 169
-               ACTIONS => {
-                       ":" => 69,
-                       "<" => 71,
-                       "~" => 72,
-                       "?" => 75,
-                       "{" => 76,
-                       "=" => 79
-               },
-               DEFAULT => -118
+               DEFAULT => -60
        },
        {#State 170
                ACTIONS => {
-                       'CONSTANT' => 44,
-                       'TEXT' => 13,
-                       "]" => 190,
-                       'IDENTIFIER' => 22
-               },
-               DEFAULT => -101,
-               GOTOS => {
-                       'identifier' => 45,
-                       'anytext' => 191,
-                       'text' => 46,
-                       'constant' => 43
+                       "=" => 191
                }
        },
        {#State 171
                ACTIONS => {
-                       ";" => 192
+                       "}" => 192
                }
        },
        {#State 172
-               DEFAULT => -75
+               DEFAULT => -86
        },
        {#State 173
                ACTIONS => {
+                       'IDENTIFIER' => 22,
+                       "signed" => 95,
+                       'void' => 89,
+                       "unsigned" => 99,
                        "[" => 17
                },
                DEFAULT => -91,
                GOTOS => {
-                       'base_or_empty' => 193,
-                       'base_element' => 194,
-                       'empty_element' => 195,
-                       'property_list' => 196
-               }
-       },
-       {#State 174
-               DEFAULT => -74
-       },
-       {#State 175
-               DEFAULT => -86
-       },
-       {#State 176
-               ACTIONS => {
-                       'IDENTIFIER' => 22,
-                       "signed" => 100,
-                       "union" => 50,
-                       "enum" => 63,
-                       "bitmap" => 64,
-                       'void' => 95,
-                       "unsigned" => 101,
-                       "[" => 17,
-                       "struct" => 61
-               },
-               GOTOS => {
-                       'existingtype' => 99,
-                       'bitmap' => 65,
-                       'usertype' => 96,
-                       'identifier' => 97,
+                       'existingtype' => 96,
+                       'bitmap' => 51,
+                       'usertype' => 91,
+                       'property_list' => 90,
+                       'identifier' => 92,
                        'struct' => 57,
-                       'enum' => 59,
-                       'type' => 197,
-                       'union' => 68,
-                       'sign' => 98
+                       'enum' => 61,
+                       'type' => 193,
+                       'union' => 63,
+                       'sign' => 93
                }
        },
-       {#State 177
+       {#State 174
                ACTIONS => {
-                       "," => 198,
-                       ")" => 199
+                       "," => 194,
+                       ")" => 195
                }
        },
-       {#State 178
+       {#State 175
                DEFAULT => -85
        },
-       {#State 179
+       {#State 176
                DEFAULT => -28
        },
-       {#State 180
+       {#State 177
                ACTIONS => {
-                       "=" => 200
+                       "=" => 196
                }
        },
-       {#State 181
+       {#State 178
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -1491,20 +1463,70 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 201,
+                       'anytext' => 197,
                        'text' => 46,
                        'constant' => 43
                }
        },
+       {#State 179
+               ACTIONS => {
+                       "[" => 161
+               },
+               DEFAULT => -88,
+               GOTOS => {
+                       'array_len' => 198
+               }
+       },
+       {#State 180
+               ACTIONS => {
+                       "-" => 65,
+                       ":" => 64,
+                       "?" => 66,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "&" => 71,
+                       "{" => 70,
+                       "/" => 72,
+                       "=" => 73,
+                       "|" => 75,
+                       "(" => 74,
+                       "*" => 76,
+                       "." => 77,
+                       "]" => 199,
+                       ">" => 78
+               }
+       },
+       {#State 181
+               DEFAULT => -35
+       },
        {#State 182
-               DEFAULT => -65
+               DEFAULT => -75
        },
        {#State 183
                ACTIONS => {
-                       ";" => 202
+                       "[" => 17
+               },
+               DEFAULT => -91,
+               GOTOS => {
+                       'base_or_empty' => 200,
+                       'base_element' => 201,
+                       'empty_element' => 202,
+                       'property_list' => 203
                }
        },
        {#State 184
+               DEFAULT => -74
+       },
+       {#State 185
+               DEFAULT => -65
+       },
+       {#State 186
+               ACTIONS => {
+                       ";" => 204
+               }
+       },
+       {#State 187
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -1513,33 +1535,33 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 203,
+                       'anytext' => 205,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 185
+       {#State 188
                DEFAULT => -48
        },
-       {#State 186
+       {#State 189
                ACTIONS => {
                        'IDENTIFIER' => 22
                },
                GOTOS => {
-                       'identifier' => 160,
-                       'enum_element' => 204
+                       'identifier' => 165,
+                       'enum_element' => 206
                }
        },
-       {#State 187
+       {#State 190
                ACTIONS => {
                        'IDENTIFIER' => 22
                },
                GOTOS => {
-                       'identifier' => 165,
-                       'bitmap_element' => 205
+                       'identifier' => 170,
+                       'bitmap_element' => 207
                }
        },
-       {#State 188
+       {#State 191
                ACTIONS => {
                        'CONSTANT' => 44,
                        'TEXT' => 13,
@@ -1548,245 +1570,211 @@ sub new {
                DEFAULT => -101,
                GOTOS => {
                        'identifier' => 45,
-                       'anytext' => 206,
+                       'anytext' => 208,
                        'text' => 46,
                        'constant' => 43
                }
        },
-       {#State 189
+       {#State 192
                DEFAULT => -56
        },
-       {#State 190
-               ACTIONS => {
-                       "[" => 170
-               },
-               DEFAULT => -88,
+       {#State 193
+               DEFAULT => -80,
                GOTOS => {
-                       'array_len' => 207
-               }
-       },
-       {#State 191
-               ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "?" => 75,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "&" => 77,
-                       "{" => 76,
-                       "/" => 78,
-                       "=" => 79,
-                       "|" => 81,
-                       "(" => 80,
-                       "*" => 74,
-                       "." => 82,
-                       "]" => 208,
-                       ">" => 83
+                       'pointers' => 209
                }
        },
-       {#State 192
-               DEFAULT => -35
-       },
-       {#State 193
-               DEFAULT => -72
-       },
        {#State 194
-               ACTIONS => {
-                       ";" => 209
+               DEFAULT => -91,
+               GOTOS => {
+                       'base_element' => 210,
+                       'property_list' => 173
                }
        },
        {#State 195
-               DEFAULT => -71
+               ACTIONS => {
+                       ";" => 211
+               }
        },
        {#State 196
                ACTIONS => {
-                       'IDENTIFIER' => 22,
-                       "signed" => 100,
-                       "union" => 50,
-                       ";" => 210,
-                       "enum" => 63,
-                       "bitmap" => 64,
-                       'void' => 95,
-                       "unsigned" => 101,
-                       "[" => 17,
-                       "struct" => 61
+                       'CONSTANT' => 44,
+                       'TEXT' => 13,
+                       'IDENTIFIER' => 22
                },
+               DEFAULT => -101,
                GOTOS => {
-                       'existingtype' => 99,
-                       'bitmap' => 65,
-                       'usertype' => 96,
-                       'identifier' => 97,
-                       'struct' => 57,
-                       'enum' => 59,
-                       'type' => 197,
-                       'union' => 68,
-                       'sign' => 98
+                       'identifier' => 45,
+                       'anytext' => 212,
+                       'text' => 46,
+                       'constant' => 43
                }
        },
        {#State 197
-               DEFAULT => -80,
-               GOTOS => {
-                       'pointers' => 211
+               ACTIONS => {
+                       "-" => 65,
+                       ":" => 64,
+                       "?" => 66,
+                       "<" => 67,
+                       ";" => 213,
+                       "+" => 69,
+                       "~" => 68,
+                       "&" => 71,
+                       "{" => 70,
+                       "/" => 72,
+                       "=" => 73,
+                       "|" => 75,
+                       "(" => 74,
+                       "*" => 76,
+                       "." => 77,
+                       ">" => 78
                }
        },
        {#State 198
-               DEFAULT => -91,
-               GOTOS => {
-                       'base_element' => 212,
-                       'property_list' => 176
-               }
+               DEFAULT => -89
        },
        {#State 199
                ACTIONS => {
-                       ";" => 213
-               }
-       },
-       {#State 200
-               ACTIONS => {
-                       'CONSTANT' => 44,
-                       'TEXT' => 13,
-                       'IDENTIFIER' => 22
+                       "[" => 161
                },
-               DEFAULT => -101,
+               DEFAULT => -88,
                GOTOS => {
-                       'identifier' => 45,
-                       'anytext' => 214,
-                       'text' => 46,
-                       'constant' => 43
+                       'array_len' => 214
                }
        },
+       {#State 200
+               DEFAULT => -72
+       },
        {#State 201
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "?" => 75,
-                       "<" => 71,
-                       ";" => 215,
-                       "+" => 73,
-                       "~" => 72,
-                       "&" => 77,
-                       "{" => 76,
-                       "/" => 78,
-                       "=" => 79,
-                       "|" => 81,
-                       "(" => 80,
-                       "*" => 74,
-                       "." => 82,
-                       ">" => 83
+                       ";" => 215
                }
        },
        {#State 202
-               DEFAULT => -83
+               DEFAULT => -71
        },
        {#State 203
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "*" => 74,
-                       "?" => 75,
-                       "{" => 76,
-                       "&" => 77,
-                       "/" => 78,
-                       "=" => 79,
-                       "(" => 80,
-                       "|" => 81,
-                       "." => 82,
-                       ">" => 83
+                       'IDENTIFIER' => 22,
+                       "signed" => 95,
+                       ";" => 216,
+                       'void' => 89,
+                       "unsigned" => 99,
+                       "[" => 17
                },
-               DEFAULT => -55
+               DEFAULT => -91,
+               GOTOS => {
+                       'existingtype' => 96,
+                       'bitmap' => 51,
+                       'usertype' => 91,
+                       'property_list' => 90,
+                       'identifier' => 92,
+                       'struct' => 57,
+                       'enum' => 61,
+                       'type' => 193,
+                       'union' => 63,
+                       'sign' => 93
+               }
        },
        {#State 204
-               DEFAULT => -53
+               DEFAULT => -83
        },
        {#State 205
-               DEFAULT => -61
-       },
-       {#State 206
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "<" => 71,
-                       "+" => 73,
-                       "~" => 72,
-                       "*" => 74,
-                       "?" => 75,
-                       "{" => 76,
-                       "&" => 77,
-                       "/" => 78,
-                       "=" => 79,
-                       "(" => 80,
-                       "|" => 81,
-                       "." => 82,
-                       ">" => 83
+                       "-" => 65,
+                       ":" => 64,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "*" => 76,
+                       "?" => 66,
+                       "{" => 70,
+                       "&" => 71,
+                       "/" => 72,
+                       "=" => 73,
+                       "(" => 74,
+                       "|" => 75,
+                       "." => 77,
+                       ">" => 78
                },
-               DEFAULT => -64
+               DEFAULT => -55
+       },
+       {#State 206
+               DEFAULT => -53
        },
        {#State 207
-               DEFAULT => -89
+               DEFAULT => -61
        },
        {#State 208
                ACTIONS => {
-                       "[" => 170
+                       "-" => 65,
+                       ":" => 64,
+                       "<" => 67,
+                       "+" => 69,
+                       "~" => 68,
+                       "*" => 76,
+                       "?" => 66,
+                       "{" => 70,
+                       "&" => 71,
+                       "/" => 72,
+                       "=" => 73,
+                       "(" => 74,
+                       "|" => 75,
+                       "." => 77,
+                       ">" => 78
                },
-               DEFAULT => -88,
-               GOTOS => {
-                       'array_len' => 216
-               }
+               DEFAULT => -64
        },
        {#State 209
-               DEFAULT => -70
-       },
-       {#State 210
-               DEFAULT => -69
-       },
-       {#State 211
                ACTIONS => {
                        'IDENTIFIER' => 22,
-                       "*" => 158
+                       "*" => 157
                },
                GOTOS => {
                        'identifier' => 217
                }
        },
-       {#State 212
+       {#State 210
                DEFAULT => -87
        },
-       {#State 213
+       {#State 211
                DEFAULT => -27
        },
-       {#State 214
+       {#State 212
                ACTIONS => {
-                       "-" => 70,
-                       ":" => 69,
-                       "?" => 75,
-                       "<" => 71,
+                       "-" => 65,
+                       ":" => 64,
+                       "?" => 66,
+                       "<" => 67,
                        ";" => 218,
-                       "+" => 73,
-                       "~" => 72,
-                       "&" => 77,
-                       "{" => 76,
-                       "/" => 78,
-                       "=" => 79,
-                       "|" => 81,
-                       "(" => 80,
-                       "*" => 74,
-                       "." => 82,
-                       ">" => 83
+                       "+" => 69,
+                       "~" => 68,
+                       "&" => 71,
+                       "{" => 70,
+                       "/" => 72,
+                       "=" => 73,
+                       "|" => 75,
+                       "(" => 74,
+                       "*" => 76,
+                       "." => 77,
+                       ">" => 78
                }
        },
-       {#State 215
+       {#State 213
                DEFAULT => -25
        },
-       {#State 216
+       {#State 214
                DEFAULT => -90
        },
+       {#State 215
+               DEFAULT => -70
+       },
+       {#State 216
+               DEFAULT => -69
+       },
        {#State 217
                ACTIONS => {
-                       "[" => 170
+                       "[" => 161
                },
                DEFAULT => -88,
                GOTOS => {
@@ -1811,37 +1799,37 @@ sub new {
        [#Rule 2
                 'idl', 2,
 sub
-#line 19 "pidl/idl.yp"
+#line 19 "idl.yp"
 { push(@{$_[1]}, $_[2]); $_[1] }
        ],
        [#Rule 3
                 'idl', 2,
 sub
-#line 20 "pidl/idl.yp"
+#line 20 "idl.yp"
 { push(@{$_[1]}, $_[2]); $_[1] }
        ],
        [#Rule 4
                 'idl', 2,
 sub
-#line 21 "pidl/idl.yp"
+#line 21 "idl.yp"
 { push(@{$_[1]}, $_[2]); $_[1] }
        ],
        [#Rule 5
                 'idl', 2,
 sub
-#line 22 "pidl/idl.yp"
+#line 22 "idl.yp"
 { push(@{$_[1]}, $_[2]); $_[1] }
        ],
        [#Rule 6
                 'idl', 2,
 sub
-#line 23 "pidl/idl.yp"
+#line 23 "idl.yp"
 { push(@{$_[1]}, $_[2]); $_[1] }
        ],
        [#Rule 7
                 'import', 3,
 sub
-#line 26 "pidl/idl.yp"
+#line 26 "idl.yp"
 {{
                        "TYPE" => "IMPORT", 
                        "PATHS" => $_[2],
@@ -1852,7 +1840,7 @@ sub
        [#Rule 8
                 'include', 3,
 sub
-#line 33 "pidl/idl.yp"
+#line 33 "idl.yp"
 {{ 
                        "TYPE" => "INCLUDE", 
                        "PATHS" => $_[2],
@@ -1863,7 +1851,7 @@ sub
        [#Rule 9
                 'importlib', 3,
 sub
-#line 40 "pidl/idl.yp"
+#line 40 "idl.yp"
 {{ 
                        "TYPE" => "IMPORTLIB", 
                        "PATHS" => $_[2],
@@ -1874,19 +1862,19 @@ sub
        [#Rule 10
                 'commalist', 1,
 sub
-#line 49 "pidl/idl.yp"
+#line 49 "idl.yp"
 { [ $_[1] ] }
        ],
        [#Rule 11
                 'commalist', 3,
 sub
-#line 50 "pidl/idl.yp"
+#line 50 "idl.yp"
 { push(@{$_[1]}, $_[3]); $_[1] }
        ],
        [#Rule 12
                 'coclass', 7,
 sub
-#line 54 "pidl/idl.yp"
+#line 54 "idl.yp"
 {{
                "TYPE" => "COCLASS", 
               "PROPERTIES" => $_[1],
@@ -1902,13 +1890,13 @@ sub
        [#Rule 14
                 'interface_names', 4,
 sub
-#line 66 "pidl/idl.yp"
+#line 66 "idl.yp"
 { push(@{$_[1]}, $_[2]); $_[1] }
        ],
        [#Rule 15
                 'interface', 8,
 sub
-#line 70 "pidl/idl.yp"
+#line 70 "idl.yp"
 {{
                "TYPE" => "INTERFACE", 
               "PROPERTIES" => $_[1],
@@ -1925,19 +1913,19 @@ sub
        [#Rule 17
                 'base_interface', 2,
 sub
-#line 83 "pidl/idl.yp"
+#line 83 "idl.yp"
 { $_[2] }
        ],
        [#Rule 18
                 'definitions', 1,
 sub
-#line 87 "pidl/idl.yp"
+#line 87 "idl.yp"
 { [ $_[1] ] }
        ],
        [#Rule 19
                 'definitions', 2,
 sub
-#line 88 "pidl/idl.yp"
+#line 88 "idl.yp"
 { push(@{$_[1]}, $_[2]); $_[1] }
        ],
        [#Rule 20
@@ -1958,7 +1946,7 @@ sub
        [#Rule 25
                 'const', 7,
 sub
-#line 96 "pidl/idl.yp"
+#line 96 "idl.yp"
 {{
                      "TYPE"  => "CONST", 
                     "DTYPE"  => $_[2],
@@ -1972,7 +1960,7 @@ sub
        [#Rule 26
                 'const', 8,
 sub
-#line 106 "pidl/idl.yp"
+#line 106 "idl.yp"
 {{
                      "TYPE"  => "CONST", 
                     "DTYPE"  => $_[2],
@@ -1987,7 +1975,7 @@ sub
        [#Rule 27
                 'function', 7,
 sub
-#line 120 "pidl/idl.yp"
+#line 120 "idl.yp"
 {{
                "TYPE" => "FUNCTION",
                "NAME" => $_[3],
@@ -2001,7 +1989,7 @@ sub
        [#Rule 28
                 'declare', 5,
 sub
-#line 132 "pidl/idl.yp"
+#line 132 "idl.yp"
 {{
                     "TYPE" => "DECLARE", 
                      "PROPERTIES" => $_[2],
@@ -2023,7 +2011,7 @@ sub
        [#Rule 32
                 'decl_enum', 1,
 sub
-#line 146 "pidl/idl.yp"
+#line 146 "idl.yp"
 {{
                      "TYPE" => "ENUM"
         }}
@@ -2031,7 +2019,7 @@ sub
        [#Rule 33
                 'decl_bitmap', 1,
 sub
-#line 152 "pidl/idl.yp"
+#line 152 "idl.yp"
 {{
                      "TYPE" => "BITMAP"
         }}
@@ -2039,7 +2027,7 @@ sub
        [#Rule 34
                 'decl_union', 1,
 sub
-#line 158 "pidl/idl.yp"
+#line 158 "idl.yp"
 {{
                      "TYPE" => "UNION"
         }}
@@ -2047,10 +2035,10 @@ sub
        [#Rule 35
                 'typedef', 6,
 sub
-#line 164 "pidl/idl.yp"
+#line 164 "idl.yp"
 {{
                     "TYPE" => "TYPEDEF", 
-                     "PROPERTIES" => $_[2],
+                     "PROPERTIES" => $_[1],
                     "NAME" => $_[4],
                     "DATA" => $_[3],
                     "ARRAY_LEN" => $_[5],
@@ -2073,7 +2061,7 @@ sub
        [#Rule 40
                 'typedecl', 2,
 sub
-#line 177 "pidl/idl.yp"
+#line 177 "idl.yp"
 { $_[1] }
        ],
        [#Rule 41
@@ -2085,7 +2073,7 @@ sub
        [#Rule 43
                 'existingtype', 2,
 sub
-#line 182 "pidl/idl.yp"
+#line 182 "idl.yp"
 { ($_[1]?$_[1]:"signed") ." $_[2]" }
        ],
        [#Rule 44
@@ -2100,13 +2088,13 @@ sub
        [#Rule 47
                 'type', 1,
 sub
-#line 186 "pidl/idl.yp"
+#line 186 "idl.yp"
 { "void" }
        ],
        [#Rule 48
                 'enum_body', 3,
 sub
-#line 188 "pidl/idl.yp"
+#line 188 "idl.yp"
 { $_[2] }
        ],
        [#Rule 49
@@ -2116,25 +2104,26 @@ sub
                 'opt_enum_body', 1, undef
        ],
        [#Rule 51
-                'enum', 3,
+                'enum', 4,
 sub
-#line 191 "pidl/idl.yp"
+#line 191 "idl.yp"
 {{
              "TYPE" => "ENUM", 
-                        "NAME" => $_[2],
-                    "ELEMENTS" => $_[3]
+                        "PROPERTIES" => $_[1],
+                        "NAME" => $_[3],
+                    "ELEMENTS" => $_[4]
         }}
        ],
        [#Rule 52
                 'enum_elements', 1,
 sub
-#line 199 "pidl/idl.yp"
+#line 200 "idl.yp"
 { [ $_[1] ] }
        ],
        [#Rule 53
                 'enum_elements', 3,
 sub
-#line 200 "pidl/idl.yp"
+#line 201 "idl.yp"
 { push(@{$_[1]}, $_[3]); $_[1] }
        ],
        [#Rule 54
@@ -2143,13 +2132,13 @@ sub
        [#Rule 55
                 'enum_element', 3,
 sub
-#line 204 "pidl/idl.yp"
+#line 205 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 56
                 'bitmap_body', 3,
 sub
-#line 207 "pidl/idl.yp"
+#line 208 "idl.yp"
 { $_[2] }
        ],
        [#Rule 57
@@ -2159,25 +2148,26 @@ sub
                 'opt_bitmap_body', 1, undef
        ],
        [#Rule 59
-                'bitmap', 3,
+                'bitmap', 4,
 sub
-#line 210 "pidl/idl.yp"
+#line 211 "idl.yp"
 {{
              "TYPE" => "BITMAP", 
-                        "NAME" => $_[2],
-                    "ELEMENTS" => $_[3]
+                    "PROPERTIES" => $_[1],
+                        "NAME" => $_[3],
+                    "ELEMENTS" => $_[4]
         }}
        ],
        [#Rule 60
                 'bitmap_elements', 1,
 sub
-#line 218 "pidl/idl.yp"
+#line 220 "idl.yp"
 { [ $_[1] ] }
        ],
        [#Rule 61
                 'bitmap_elements', 3,
 sub
-#line 219 "pidl/idl.yp"
+#line 221 "idl.yp"
 { push(@{$_[1]}, $_[3]); $_[1] }
        ],
        [#Rule 62
@@ -2189,13 +2179,13 @@ sub
        [#Rule 64
                 'bitmap_element', 3,
 sub
-#line 224 "pidl/idl.yp"
+#line 226 "idl.yp"
 { "$_[1] ( $_[3] )" }
        ],
        [#Rule 65
                 'struct_body', 3,
 sub
-#line 227 "pidl/idl.yp"
+#line 229 "idl.yp"
 { $_[2] }
        ],
        [#Rule 66
@@ -2205,19 +2195,20 @@ sub
                 'opt_struct_body', 1, undef
        ],
        [#Rule 68
-                'struct', 3,
+                'struct', 4,
 sub
-#line 231 "pidl/idl.yp"
+#line 233 "idl.yp"
 {{
              "TYPE" => "STRUCT", 
-                        "NAME" => $_[2],
-                    "ELEMENTS" => $_[3]
+                        "PROPERTIES" => $_[1],
+                        "NAME" => $_[3],
+                    "ELEMENTS" => $_[4]
         }}
        ],
        [#Rule 69
                 'empty_element', 2,
 sub
-#line 239 "pidl/idl.yp"
+#line 242 "idl.yp"
 {{
                 "NAME" => "",
                 "TYPE" => "EMPTY",
@@ -2237,7 +2228,7 @@ sub
        [#Rule 72
                 'optional_base_element', 2,
 sub
-#line 253 "pidl/idl.yp"
+#line 256 "idl.yp"
 { $_[2]->{PROPERTIES} = FlattenHash([$_[1],$_[2]->{PROPERTIES}]); $_[2] }
        ],
        [#Rule 73
@@ -2246,13 +2237,13 @@ sub
        [#Rule 74
                 'union_elements', 2,
 sub
-#line 258 "pidl/idl.yp"
+#line 261 "idl.yp"
 { push(@{$_[1]}, $_[2]); $_[1] }
        ],
        [#Rule 75
                 'union_body', 3,
 sub
-#line 261 "pidl/idl.yp"
+#line 264 "idl.yp"
 { $_[2] }
        ],
        [#Rule 76
@@ -2262,19 +2253,20 @@ sub
                 'opt_union_body', 1, undef
        ],
        [#Rule 78
-                'union', 3,
+                'union', 4,
 sub
-#line 265 "pidl/idl.yp"
+#line 268 "idl.yp"
 {{
              "TYPE" => "UNION", 
-                    "NAME" => $_[2],
-                    "ELEMENTS" => $_[3]
+                        "PROPERTIES" => $_[1],
+                    "NAME" => $_[3],
+                    "ELEMENTS" => $_[4]
         }}
        ],
        [#Rule 79
                 'base_element', 5,
 sub
-#line 273 "pidl/idl.yp"
+#line 277 "idl.yp"
 {{
                           "NAME" => $_[4],
                           "TYPE" => $_[2],
@@ -2288,13 +2280,13 @@ sub
        [#Rule 80
                 'pointers', 0,
 sub
-#line 287 "pidl/idl.yp"
+#line 291 "idl.yp"
 { 0 }
        ],
        [#Rule 81
                 'pointers', 2,
 sub
-#line 288 "pidl/idl.yp"
+#line 292 "idl.yp"
 { $_[1]+1 }
        ],
        [#Rule 82
@@ -2303,7 +2295,7 @@ sub
        [#Rule 83
                 'element_list1', 3,
 sub
-#line 293 "pidl/idl.yp"
+#line 297 "idl.yp"
 { push(@{$_[1]}, $_[2]); $_[1] }
        ],
        [#Rule 84
@@ -2315,13 +2307,13 @@ sub
        [#Rule 86
                 'element_list2', 1,
 sub
-#line 299 "pidl/idl.yp"
+#line 303 "idl.yp"
 { [ $_[1] ] }
        ],
        [#Rule 87
                 'element_list2', 3,
 sub
-#line 300 "pidl/idl.yp"
+#line 304 "idl.yp"
 { push(@{$_[1]}, $_[3]); $_[1] }
        ],
        [#Rule 88
@@ -2330,13 +2322,13 @@ sub
        [#Rule 89
                 'array_len', 3,
 sub
-#line 305 "pidl/idl.yp"
+#line 309 "idl.yp"
 { push(@{$_[3]}, "*"); $_[3] }
        ],
        [#Rule 90
                 'array_len', 4,
 sub
-#line 306 "pidl/idl.yp"
+#line 310 "idl.yp"
 { push(@{$_[4]}, "$_[2]"); $_[4] }
        ],
        [#Rule 91
@@ -2345,31 +2337,31 @@ sub
        [#Rule 92
                 'property_list', 4,
 sub
-#line 312 "pidl/idl.yp"
+#line 316 "idl.yp"
 { FlattenHash([$_[1],$_[3]]); }
        ],
        [#Rule 93
                 'properties', 1,
 sub
-#line 315 "pidl/idl.yp"
+#line 319 "idl.yp"
 { $_[1] }
        ],
        [#Rule 94
                 'properties', 3,
 sub
-#line 316 "pidl/idl.yp"
+#line 320 "idl.yp"
 { FlattenHash([$_[1], $_[3]]); }
        ],
        [#Rule 95
                 'property', 1,
 sub
-#line 319 "pidl/idl.yp"
+#line 323 "idl.yp"
 {{ "$_[1]" => "1"     }}
        ],
        [#Rule 96
                 'property', 4,
 sub
-#line 320 "pidl/idl.yp"
+#line 324 "idl.yp"
 {{ "$_[1]" => "$_[3]" }}
        ],
        [#Rule 97
@@ -2378,7 +2370,7 @@ sub
        [#Rule 98
                 'listtext', 3,
 sub
-#line 325 "pidl/idl.yp"
+#line 329 "idl.yp"
 { "$_[1] $_[3]" }
        ],
        [#Rule 99
@@ -2387,13 +2379,13 @@ sub
        [#Rule 100
                 'commalisttext', 3,
 sub
-#line 330 "pidl/idl.yp"
+#line 334 "idl.yp"
 { "$_[1],$_[3]" }
        ],
        [#Rule 101
                 'anytext', 0,
 sub
-#line 334 "pidl/idl.yp"
+#line 338 "idl.yp"
 { "" }
        ],
        [#Rule 102
@@ -2408,91 +2400,91 @@ sub
        [#Rule 105
                 'anytext', 3,
 sub
-#line 336 "pidl/idl.yp"
+#line 340 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 106
                 'anytext', 3,
 sub
-#line 337 "pidl/idl.yp"
+#line 341 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 107
                 'anytext', 3,
 sub
-#line 338 "pidl/idl.yp"
+#line 342 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 108
                 'anytext', 3,
 sub
-#line 339 "pidl/idl.yp"
+#line 343 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 109
                 'anytext', 3,
 sub
-#line 340 "pidl/idl.yp"
+#line 344 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 110
                 'anytext', 3,
 sub
-#line 341 "pidl/idl.yp"
+#line 345 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 111
                 'anytext', 3,
 sub
-#line 342 "pidl/idl.yp"
+#line 346 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 112
                 'anytext', 3,
 sub
-#line 343 "pidl/idl.yp"
+#line 347 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 113
                 'anytext', 3,
 sub
-#line 344 "pidl/idl.yp"
+#line 348 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 114
                 'anytext', 3,
 sub
-#line 345 "pidl/idl.yp"
+#line 349 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 115
                 'anytext', 3,
 sub
-#line 346 "pidl/idl.yp"
+#line 350 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 116
                 'anytext', 3,
 sub
-#line 347 "pidl/idl.yp"
+#line 351 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 117
                 'anytext', 3,
 sub
-#line 348 "pidl/idl.yp"
+#line 352 "idl.yp"
 { "$_[1]$_[2]$_[3]" }
        ],
        [#Rule 118
                 'anytext', 5,
 sub
-#line 349 "pidl/idl.yp"
+#line 353 "idl.yp"
 { "$_[1]$_[2]$_[3]$_[4]$_[5]" }
        ],
        [#Rule 119
                 'anytext', 5,
 sub
-#line 350 "pidl/idl.yp"
+#line 354 "idl.yp"
 { "$_[1]$_[2]$_[3]$_[4]$_[5]" }
        ],
        [#Rule 120
@@ -2510,7 +2502,7 @@ sub
        [#Rule 124
                 'text', 1,
 sub
-#line 364 "pidl/idl.yp"
+#line 368 "idl.yp"
 { "\"$_[1]\"" }
        ],
        [#Rule 125
@@ -2524,7 +2516,7 @@ sub
     bless($self,$class);
 }
 
-#line 375 "pidl/idl.yp"
+#line 379 "idl.yp"
 
 
 use Parse::Pidl qw(error);
index b76a0f5a38b6ab8f782bd23da8ac987448c396ae..d55df7a452f09e492d334b0f775197294d8c3b12 100644 (file)
@@ -383,6 +383,7 @@ sub ParseStruct($$)
        my @elements = ();
        my $surrounding = undef;
 
+
        foreach my $x (@{$struct->{ELEMENTS}}) 
        {
                my $e = ParseElement($x);
@@ -403,13 +404,20 @@ sub ParseStruct($$)
            &&  property_matches($e, "flag", ".*LIBNDR_FLAG_STR_CONFORMANT.*")) {
                $surrounding = $struct->{ELEMENTS}[-1];
        }
+
+       my $align = undef;
+       if ($struct->{NAME}) {
+               $align = align_type($struct->{NAME});
+       }
                
        return {
                TYPE => "STRUCT",
+               NAME => $struct->{NAME},
                SURROUNDING_ELEMENT => $surrounding,
                ELEMENTS => \@elements,
                PROPERTIES => $struct->{PROPERTIES},
-               ORIGINAL => $struct
+               ORIGINAL => $struct,
+               ALIGN => $align
        };
 }
 
@@ -444,6 +452,7 @@ sub ParseUnion($$)
 
        return {
                TYPE => "UNION",
+               NAME => $e->{NAME},
                SWITCH_TYPE => $switch_type,
                ELEMENTS => \@elements,
                PROPERTIES => $e->{PROPERTIES},
@@ -458,6 +467,7 @@ sub ParseEnum($$)
 
        return {
                TYPE => "ENUM",
+               NAME => $e->{NAME},
                BASE_TYPE => Parse::Pidl::Typelist::enum_type_fn($e),
                ELEMENTS => $e->{ELEMENTS},
                PROPERTIES => $e->{PROPERTIES},
@@ -471,6 +481,7 @@ sub ParseBitmap($$)
 
        return {
                TYPE => "BITMAP",
+               NAME => $e->{NAME},
                BASE_TYPE => Parse::Pidl::Typelist::bitmap_type_fn($e),
                ELEMENTS => $e->{ELEMENTS},
                PROPERTIES => $e->{PROPERTIES},
@@ -501,8 +512,8 @@ sub ParseTypedef($$)
 {
        my ($ndr,$d) = @_;
 
-       if (defined($d->{PROPERTIES}) && !defined($d->{DATA}->{PROPERTIES})) {
-               $d->{DATA}->{PROPERTIES} = $d->{PROPERTIES};
+       if (defined($d->{DATA}->{PROPERTIES}) && !defined($d->{PROPERTIES})) {
+               $d->{PROPERTIES} = $d->{DATA}->{PROPERTIES};
        }
 
        my $data = ParseType($ndr, $d->{DATA});
@@ -865,7 +876,7 @@ sub mapToScalar($)
 }
 
 #####################################################################
-# parse a struct
+# validate an element
 sub ValidElement($)
 {
        my $e = shift;
@@ -881,8 +892,8 @@ sub ValidElement($)
                        fatal($e, el_name($e) . ": switch_is() used on non-union type $e->{TYPE} which is a $type->{DATA}->{TYPE}");
                }
 
-               if (!has_property($type, "nodiscriminant") and defined($e2)) {
-                       my $discriminator_type = has_property($type, "switch_type");
+               if (not has_property($type->{DATA}, "nodiscriminant") and defined($e2)) {
+                       my $discriminator_type = has_property($type->{DATA}, "switch_type");
                        $discriminator_type = "uint32" unless defined ($discriminator_type);
 
                        my $t1 = mapToScalar($discriminator_type);
@@ -940,12 +951,30 @@ sub ValidElement($)
 }
 
 #####################################################################
-# parse a struct
+# validate an enum
+sub ValidEnum($)
+{
+       my ($enum) = @_;
+
+       ValidProperties($enum, "ENUM");
+}
+
+#####################################################################
+# validate a bitmap
+sub ValidBitmap($)
+{
+       my ($bitmap) = @_;
+
+       ValidProperties($bitmap, "BITMAP");
+}
+
+#####################################################################
+# validate a struct
 sub ValidStruct($)
 {
        my($struct) = shift;
 
-       ValidProperties($struct,"STRUCT");
+       ValidProperties($struct, "STRUCT");
 
        foreach my $e (@{$struct->{ELEMENTS}}) {
                $e->{PARENT} = $struct;
@@ -994,23 +1023,15 @@ sub ValidTypedef($)
        my($typedef) = shift;
        my $data = $typedef->{DATA};
 
-       ValidProperties($typedef,"TYPEDEF");
+       ValidProperties($typedef, "TYPEDEF");
 
        $data->{PARENT} = $typedef;
 
-       if (ref($data) eq "HASH") {
-               if ($data->{TYPE} eq "STRUCT") {
-                       ValidStruct($data);
-               }
-
-               if ($data->{TYPE} eq "UNION") {
-                       ValidUnion($data);
-               }
-       }
+       ValidType($data) if (ref($data) eq "HASH");
 }
 
 #####################################################################
-# parse a function
+# validate a function
 sub ValidFunction($)
 {
        my($fn) = shift;
@@ -1026,6 +1047,21 @@ sub ValidFunction($)
        }
 }
 
+#####################################################################
+# validate a type
+sub ValidType($)
+{
+       my ($t) = @_;
+
+       { 
+               TYPEDEF => \&ValidTypedef,
+               STRUCT => \&ValidStruct,
+               UNION => \&ValidUnion,
+               ENUM => \&ValidEnum,
+               BITMAP => \&ValidBitmap
+       }->{$t->{TYPE}}->($t);
+}
+
 #####################################################################
 # parse the interface definitions
 sub ValidInterface($)
@@ -1059,10 +1095,12 @@ sub ValidInterface($)
        }
                
        foreach my $d (@{$data}) {
-               ($d->{TYPE} eq "TYPEDEF") &&
-                   ValidTypedef($d);
-               ($d->{TYPE} eq "FUNCTION") && 
-                   ValidFunction($d);
+               ($d->{TYPE} eq "FUNCTION") && ValidFunction($d);
+               ($d->{TYPE} eq "TYPEDEF" or 
+                $d->{TYPE} eq "STRUCT" or
+                $d->{TYPE} eq "UNION" or 
+                $d->{TYPE} eq "ENUM" or
+            $d->{TYPE} eq "BITMAP") && ValidType($d);
        }
 
 }
index 110a483fc4ba847305906d12e7be456e36c1fcc0..fbc00d7c13f747f910ac1a463b36adcf8609eaca 100644 (file)
@@ -219,8 +219,6 @@ sub HeaderTypedef($)
 {
     my($typedef) = shift;
     HeaderType($typedef, $typedef->{DATA}, $typedef->{NAME});
-    pidl ";\n\n" unless ($typedef->{DATA}->{TYPE} eq "BITMAP" or 
-                            $typedef->{DATA}->{TYPE} eq "ENUM");
 }
 
 #####################################################################
@@ -354,8 +352,12 @@ sub HeaderInterface($)
        }
 
        foreach my $d (@{$interface->{DATA}}) {
-               next if ($d->{TYPE} ne "TYPEDEF");
-               HeaderTypedef($d);
+               HeaderTypedef($d) if ($d->{TYPE} eq "TYPEDEF");
+               HeaderStruct($d, $d->{NAME}) if ($d->{TYPE} eq "STRUCT");
+               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";
        }
 
        foreach my $d (@{$interface->{DATA}}) {
index 6e4d5825d0412d7883106fb43a180cdf3c10e3e4..15618bb534d8b870a6a0729e0969bcccbf6668e6 100644 (file)
@@ -12,7 +12,7 @@ require Exporter;
 @EXPORT = qw(is_charset_array);
 @EXPORT_OK = qw(check_null_pointer GenerateFunctionInEnv 
    GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv NeededFunction
-   NeededElement NeededTypedef);
+   NeededElement NeededType);
 
 use strict;
 use Parse::Pidl::Typelist qw(hasType getType mapType);
@@ -1335,10 +1335,10 @@ sub ParseEnumPrint($$)
        end_flags($enum);
 }
 
-sub DeclEnum($)
+sub DeclEnum($$$)
 {
-       my ($e,$t) = @_;
-       return "enum $e->{NAME} " . 
+       my ($e,$t,$name) = @_;
+       return "enum $name " . 
                ($t eq "pull"?"*":"") . "r";
 }
 
@@ -1418,10 +1418,10 @@ sub ParseBitmapPrint($$)
        end_flags($bitmap);
 }
 
-sub DeclBitmap($$)
+sub DeclBitmap($$$)
 {
-       my ($e,$t) = @_;
-       return mapType(Parse::Pidl::Typelist::bitmap_type_fn($e->{DATA})) . 
+       my ($e,$t,$name) = @_;
+       return mapType(Parse::Pidl::Typelist::bitmap_type_fn($e)) . 
                ($t eq "pull"?" *":" ") . "r";
 }
 
@@ -1581,27 +1581,27 @@ sub ParseStructPull($$)
 
 #####################################################################
 # calculate size of ndr struct
-sub ParseStructNdrSize($)
+sub ParseStructNdrSize($$)
 {
-       my $t = shift;
+       my ($t, $name) = @_;
        my $sizevar;
 
        if (my $flags = has_property($t, "flag")) {
                pidl "flags |= $flags;";
        }
-       pidl "return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_$t->{NAME});";
+       pidl "return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_$name);";
 }
 
-sub DeclStruct($)
+sub DeclStruct($$$)
 {
-       my ($e,$t) = @_;
-       return ($t ne "pull"?"const ":"") . "struct $e->{NAME} *r";
+       my ($e,$t,$name) = @_;
+       return ($t ne "pull"?"const ":"") . "struct $name *r";
 }
 
-sub ArgsStructNdrSize($)
+sub ArgsStructNdrSize($$)
 {
-       my $d = shift;
-       return "const struct $d->{NAME} *r, int flags";
+       my ($d, $name) = @_;
+       return "const struct $name *r, int flags";
 }
 
 $typefamily{STRUCT} = {
@@ -1615,16 +1615,16 @@ $typefamily{STRUCT} = {
 
 #####################################################################
 # calculate size of ndr struct
-sub ParseUnionNdrSize($)
+sub ParseUnionNdrSize($$)
 {
-       my $t = shift;
+       my ($t, $name) = @_;
        my $sizevar;
 
        if (my $flags = has_property($t, "flag")) {
                pidl "flags |= $flags;";
        }
 
-       pidl "return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_$t->{NAME});";
+       pidl "return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_$name);";
 }
 
 #####################################################################
@@ -1864,16 +1864,16 @@ sub ParseUnionPull($$)
        pidl "ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);" if defined($e->{PROPERTIES}{relative_base});
 }
 
-sub DeclUnion($$)
+sub DeclUnion($$$)
 {
-       my ($e,$t) = @_;
-       return ($t ne "pull"?"const ":"") . "union $e->{NAME} *r";
+       my ($e,$t,$name) = @_;
+       return ($t ne "pull"?"const ":"") . "union $name *r";
 }
 
-sub ArgsUnionNdrSize($)
+sub ArgsUnionNdrSize($$)
 {
-       my $d = shift;
-       return "const union $d->{NAME} *r, uint32_t level, int flags";
+       my ($d,$name) = @_;
+       return "const union $name *r, uint32_t level, int flags";
 }
 
 $typefamily{UNION} = {
@@ -1887,81 +1887,62 @@ $typefamily{UNION} = {
        
 #####################################################################
 # parse a typedef - push side
-sub ParseTypedefPush($)
+sub ParseTypedefPush($$)
 {
-       my($e) = shift;
-
-       my $args = $typefamily{$e->{DATA}->{TYPE}}->{DECL}->($e,"push");
-       fn_declare("push", $e, "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, $args)") or return;
+       my($e,$name) = @_;
 
-       pidl "{";
-       indent;
-       $typefamily{$e->{DATA}->{TYPE}}->{PUSH_FN_BODY}->($e->{DATA}, $e->{NAME});
-       pidl "return NT_STATUS_OK;";
-       deindent;
-       pidl "}";
-       pidl "";;
+       $typefamily{$e->{DATA}->{TYPE}}->{PUSH_FN_BODY}->($e->{DATA}, $name);
 }
 
 #####################################################################
 # parse a typedef - pull side
-sub ParseTypedefPull($)
+sub ParseTypedefPull($$)
 {
-       my($e) = shift;
-
-       my $args = $typefamily{$e->{DATA}->{TYPE}}->{DECL}->($e,"pull");
-
-       fn_declare("pull", $e, "NTSTATUS ndr_pull_$e->{NAME}(struct ndr_pull *ndr, int ndr_flags, $args)") or return;
+       my($e,$name) = @_;
 
-       pidl "{";
-       indent;
-       $typefamily{$e->{DATA}->{TYPE}}->{PULL_FN_BODY}->($e->{DATA}, $e->{NAME});
-       pidl "return NT_STATUS_OK;";
-       deindent;
-       pidl "}";
-       pidl "";
+       $typefamily{$e->{DATA}->{TYPE}}->{PULL_FN_BODY}->($e->{DATA}, $name);
 }
 
 #####################################################################
 # parse a typedef - print side
-sub ParseTypedefPrint($)
+sub ParseTypedefPrint($$)
 {
-       my($e) = shift;
-
-       my $args = $typefamily{$e->{DATA}->{TYPE}}->{DECL}->($e,"print");
-
-       pidl_hdr "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, $args);";
-
-       return if (has_property($e, "noprint"));
+       my($e,$name) = @_;
 
-       pidl "_PUBLIC_ void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, $args)";
-       pidl "{";
-       indent;
-       $typefamily{$e->{DATA}->{TYPE}}->{PRINT_FN_BODY}->($e->{DATA}, $e->{NAME});
-       deindent;
-       pidl "}";
-       pidl "";
+       $typefamily{$e->{DATA}->{TYPE}}->{PRINT_FN_BODY}->($e->{DATA}, $name);
 }
 
 #####################################################################
 ## calculate the size of a structure
-sub ParseTypedefNdrSize($)
+sub ParseTypedefNdrSize($$)
 {
-       my($t) = shift;
+       my($t,$name) = @_;
 
-       my $tf = $typefamily{$t->{DATA}->{TYPE}};
-       my $args = $tf->{SIZE_FN_ARGS}->($t);
+       $typefamily{$t->{DATA}->{TYPE}}->{SIZE_FN_BODY}->($t->{DATA}, $name);
+}
 
-       fn_declare("size", $t, "size_t ndr_size_$t->{NAME}($args)") or return;
+sub DeclTypedef($$$)
+{
+       my ($e, $t, $name) = @_;
+       
+       return $typefamily{$e->{DATA}->{TYPE}}->{DECL}->($e->{DATA}, $t, $name);
+}
 
-       pidl "{";
-       indent;
-       $typefamily{$t->{DATA}->{TYPE}}->{SIZE_FN_BODY}->($t);
-       deindent;
-       pidl "}";
-       pidl "";
+sub ArgsTypedefNdrSize($$)
+{
+       my ($d, $name) = @_;
+       return $typefamily{$d->{DATA}->{TYPE}}->{SIZE_FN_ARGS}->($d->{DATA}, $name);
 }
 
+$typefamily{TYPEDEF} = {
+       PUSH_FN_BODY => \&ParseTypedefPush,
+       DECL => \&DeclTypedef,
+       PULL_FN_BODY => \&ParseTypedefPull,
+       PRINT_FN_BODY => \&ParseTypedefPrint,
+       SIZE_FN_ARGS => \&ArgsTypedefNdrSize,
+       SIZE_FN_BODY => \&ParseTypedefNdrSize,
+};
+
 #####################################################################
 # parse a function - print side
 sub ParseFunctionPrint($)
@@ -2379,6 +2360,74 @@ sub HeaderInterface($)
 
 }
 
+sub ParseTypePush($)
+{
+       my ($e) = @_;
+
+       my $args = $typefamily{$e->{TYPE}}->{DECL}->($e, "push", $e->{NAME});
+       fn_declare("push", $e, "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, $args)") or return;
+
+       pidl "{";
+       indent;
+       $typefamily{$e->{TYPE}}->{PUSH_FN_BODY}->($e, $e->{NAME});
+       pidl "return NT_STATUS_OK;";
+       deindent;
+       pidl "}";
+       pidl "";;
+}
+
+sub ParseTypePull($)
+{
+       my ($e) = @_;
+
+       my $args = $typefamily{$e->{TYPE}}->{DECL}->($e, "pull", $e->{NAME});
+
+       fn_declare("pull", $e, "NTSTATUS ndr_pull_$e->{NAME}(struct ndr_pull *ndr, int ndr_flags, $args)") or return;
+
+       pidl "{";
+       indent;
+       $typefamily{$e->{TYPE}}->{PULL_FN_BODY}->($e, $e->{NAME});
+       pidl "return NT_STATUS_OK;";
+       deindent;
+       pidl "}";
+       pidl "";
+}
+
+sub ParseTypePrint($)
+{
+       my ($e) = @_;
+       my $args = $typefamily{$e->{TYPE}}->{DECL}->($e, "print", $e->{NAME});
+
+       pidl_hdr "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, $args);";
+
+       return if (has_property($e, "noprint"));
+
+       pidl "_PUBLIC_ void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, $args)";
+       pidl "{";
+       indent;
+       $typefamily{$e->{TYPE}}->{PRINT_FN_BODY}->($e, $e->{NAME});
+       deindent;
+       pidl "}";
+       pidl "";
+}
+
+sub ParseTypeNdrSize($)
+{
+       my ($t) = @_;
+
+       my $tf = $typefamily{$t->{TYPE}};
+       my $args = $tf->{SIZE_FN_ARGS}->($t, $t->{NAME});
+
+       fn_declare("size", $t, "size_t ndr_size_$t->{NAME}($args)") or return;
+
+       pidl "{";
+       indent;
+       $typefamily{$t->{TYPE}}->{SIZE_FN_BODY}->($t, $t->{NAME});
+       deindent;
+       pidl "}";
+       pidl "";
+}
+
 #####################################################################
 # parse the interface definitions
 sub ParseInterface($$)
@@ -2398,15 +2447,15 @@ sub ParseInterface($$)
 
        # Typedefs
        foreach my $d (@{$interface->{TYPES}}) {
-               ($needed->{"push_$d->{NAME}"}) && ParseTypedefPush($d);
-               ($needed->{"pull_$d->{NAME}"}) && ParseTypedefPull($d);
-               ($needed->{"print_$d->{NAME}"}) && ParseTypedefPrint($d);
+               ($needed->{"push_$d->{NAME}"}) && ParseTypePush($d);
+               ($needed->{"pull_$d->{NAME}"}) && ParseTypePull($d);
+               ($needed->{"print_$d->{NAME}"}) && ParseTypePrint($d);
 
                # Make sure we don't generate a function twice...
                $needed->{"push_$d->{NAME}"} = $needed->{"pull_$d->{NAME}"} = 
                        $needed->{"print_$d->{NAME}"} = 0;
 
-               ($needed->{"ndr_size_$d->{NAME}"}) && ParseTypedefNdrSize($d);
+               ($needed->{"ndr_size_$d->{NAME}"}) && ParseTypeNdrSize($d);
        }
 
        # Functions
@@ -2524,7 +2573,7 @@ sub NeededFunction($$)
        }
 }
 
-sub NeededTypedef($$)
+sub NeededType($$)
 {
        my ($t,$needed) = @_;
        if (has_property($t, "public")) {
@@ -2556,7 +2605,7 @@ sub NeededInterface($$)
 {
        my ($interface,$needed) = @_;
        NeededFunction($_, $needed) foreach (@{$interface->{FUNCTIONS}});
-       NeededTypedef($_, $needed) foreach (reverse @{$interface->{TYPES}});
+       NeededType($_, $needed) foreach (reverse @{$interface->{TYPES}});
 }
 
 1;
index a406b868e131076c83488a9dd8f58db57bf85f59..a65cd89c55fd7935e754d888d39295ba5fcfe20d 100644 (file)
@@ -91,7 +91,6 @@ SKIP: {
 
        my $cmd = "$cc $cflags -x c - -o $outfile $flags $ldflags";
        $cmd =~ s/\n//g;
-       print "$cmd\n";
        open CC, "|$cmd";
        print CC "#define uint_t unsigned int\n";
        print CC "#define _GNU_SOURCE\n";
index b7c0b285f3d5b2f182dc0018d345027a95ab4675..3dae33ae6c52c9ca6a581b5c64e05a59d441a268 100755 (executable)
@@ -4,7 +4,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 9;
+use Test::More tests => 10;
 use FindBin qw($RealBin);
 use lib "$RealBin";
 use Util;
@@ -34,3 +34,5 @@ like(parse_idl("interface x { void foo ([out] uint32 x); };"),
 like(parse_idl("interface x { void foo ([in,out] uint32 x); };"),
      qr/struct foo.*{.*struct\s+{\s+uint32_t x;\s+} in;\s+struct\s+{\s+uint32_t x;\s+} out;.*};/sm, "fn in,out arg works");
 like(parse_idl("interface x { void foo (uint32 x); };"), qr/struct foo.*{.*struct\s+{\s+uint32_t x;\s+} in;\s+struct\s+{\s+uint32_t x;\s+} out;.*};/sm, "fn with no props implies in,out");
+like(parse_idl("interface p { struct x { int y; }; };"),
+     qr/struct x.*{.*int32_t y;.*}.*;/sm, "interface member generated properly");
index 89738e42f63f2e69662ced07d0effd0d35e00556..86828e5982526572ed725bb390d7ed0ef5972b04 100755 (executable)
@@ -24,5 +24,3 @@ my $e = {
 
 test_warnings("foo.idl:42: subcontext() is deprecated. Use represent_as() or transmit_as() instead\n", 
        sub { ValidElement($e); });
-
-
index a7f7d0490a668009ff790fabba132a2d922785c2..067fa096b496eb9fc30ee86029d3433a79dee231 100755 (executable)
@@ -8,15 +8,7 @@ use FindBin qw($RealBin);
 use lib "$RealBin";
 use Util qw(test_samba4_ndr);
 
-SKIP: {
-       skip "Tagged types without typedef are not supported yet", 8;
-
-test_samba4_ndr('struct-notypedef', 
-'
-       struct bla { 
-               uint8 x;
-       };
-',
+test_samba4_ndr('struct-notypedef', '[public] struct bla { uint8 x; }; ',
 '
        struct ndr_push *ndr = ndr_push_init_ctx(NULL);
        struct bla r;
@@ -33,5 +25,3 @@ test_samba4_ndr('struct-notypedef',
        if (!data_blob_equal(&result_blob, &expected_blob)) 
                return 2;
 ');
-
-}
index 859c2b4e46987142e3580daa2ff70114c10b82bd..265ac7a2bdc6f58c3c7357fb56b39ba9a6a3b9d3 100755 (executable)
@@ -4,7 +4,7 @@
 # Published under the GNU General Public License
 use strict;
 
-use Test::More tests => 59 * 2;
+use Test::More tests => 62 * 2;
 use FindBin qw($RealBin);
 use lib "$RealBin";
 use Util qw(test_errors);
@@ -83,8 +83,12 @@ testok "nested1", "interface test { struct x { struct { int a; } z; }; };";
 testok "nested2", "interface test { struct x { struct y { int a; } z; }; };";
 testok "bitmap1", "interface test { bitmap x { a=1 }; };";
 testok "unsigned", "interface test { struct x { unsigned short y; }; };";
+testok "struct-property", "interface test { [public] struct x { short y; }; };";
 testok "signed", "interface test { struct x { signed short y; }; };";
 testok "declarg", "interface test { void test(struct { int x; } a); };";
+testok "structarg", "interface test { void test(struct a b); };";
+testfail "structargmissing", "interface test { void test(struct a); };",
+       "<structargmissing>:0: Syntax error near ')'\n";
 testok "structqual", "interface test { struct x { struct y z; }; };";
 testok "unionqual", "interface test { struct x { union y z; }; };";
 testok "enumqual", "interface test { struct x { enum y z; }; };";
index 1f859db788481319f3ab40ceea77a20839755354..50b0bd269f264c79d1be01e12b90c51b56aec852 100755 (executable)
@@ -11,7 +11,7 @@ use Util;
 use Parse::Pidl::Util qw(MyDumper);
 use Parse::Pidl::Samba4::NDR::Parser qw(check_null_pointer 
        GenerateFunctionInEnv GenerateFunctionOutEnv GenerateStructEnv 
-       EnvSubstituteValue NeededFunction NeededElement NeededTypedef); 
+       EnvSubstituteValue NeededFunction NeededElement NeededType); 
 
 my $output;
 sub print_fn($) { my $x = shift; $output.=$x; }
@@ -202,19 +202,19 @@ is_deeply($needed, { pull_foo => 1, print_foo => 1, push_foo => 1,
 
 # public structs are always needed
 $needed = {};
-NeededTypedef({ NAME => "bla", DATA => { TYPE => "STRUCT", ELEMENTS => [] } },
+NeededType({ NAME => "bla", DATA => { TYPE => "STRUCT", ELEMENTS => [] } },
                          $needed);
 is_deeply($needed, { });
 
 $needed = {};
-NeededTypedef({ PROPERTIES => { public => 1 }, NAME => "bla", 
+NeededType({ PROPERTIES => { public => 1 }, NAME => "bla", 
                    DATA => { TYPE => "STRUCT", ELEMENTS => [] } },
                          $needed);
 is_deeply($needed, { pull_bla => 1, print_bla => 1, push_bla => 1 });
 
 # make sure types for elements are set too
 $needed = {};
-NeededTypedef({ PROPERTIES => { public => 1 }, NAME => "bla", 
+NeededType({ PROPERTIES => { public => 1 }, NAME => "bla", 
                    DATA => { TYPE => "STRUCT", 
                                                  ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] } },
                          $needed);
@@ -222,7 +222,7 @@ is_deeply($needed, { pull_bla => 1, print_bla => 1, push_bla => 1,
                         pull_bar => 1, print_bar => 1, push_bar => 1});
 
 $needed = {};
-NeededTypedef({ PROPERTIES => { gensize => 1}, NAME => "bla", 
+NeededType({ PROPERTIES => { gensize => 1}, NAME => "bla", 
                    DATA => { TYPE => "STRUCT", 
                                                  ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] } },
                          $needed);
@@ -230,14 +230,14 @@ is_deeply($needed, { ndr_size_bla => 1 });
                         
 # make sure types for elements are set too
 $needed = { pull_bla => 1 };
-NeededTypedef({ NAME => "bla", 
+NeededType({ NAME => "bla", 
                    DATA => { TYPE => "STRUCT", 
                                                  ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "bar" } ] } },
                          $needed);
 is_deeply($needed, { pull_bla => 1, pull_bar => 1 });
 
 $needed = {};
-NeededTypedef({ PROPERTIES => { public => 1}, 
+NeededType({ PROPERTIES => { public => 1}, 
                                NAME => "bla", 
                    DATA => { TYPE => "STRUCT", 
                                                  ELEMENTS => [ { TYPE => "bar", REPRESENTATION_TYPE => "rep" } ] } },