summaryrefslogtreecommitdiff
path: root/source4/pidl
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2008-01-22 16:39:56 +0100
committerJelmer Vernooij <jelmer@samba.org>2008-01-22 16:39:56 +0100
commit4075a2ba982ea56ff925e0a33839f0760fd71911 (patch)
tree87d87734257f814b7960a843e54455c447f34a9e /source4/pidl
parent24da29746998de1001d18871dcbe8d37643667d5 (diff)
parent35c68316442808a135aafa864d19592108a4d879 (diff)
downloadsamba-4075a2ba982ea56ff925e0a33839f0760fd71911.tar.gz
samba-4075a2ba982ea56ff925e0a33839f0760fd71911.tar.bz2
samba-4075a2ba982ea56ff925e0a33839f0760fd71911.zip
Merge branch 'v4-0-test' of ssh://git.samba.org/data/git/samba into v4-0-python
(This used to be commit 2f57e25f8f692889d9e057e13256f8a24c5ec10c)
Diffstat (limited to 'source4/pidl')
-rw-r--r--source4/pidl/MANIFEST2
-rw-r--r--source4/pidl/META.yml18
-rw-r--r--source4/pidl/README1
-rw-r--r--source4/pidl/TODO1
-rw-r--r--source4/pidl/idl.yp38
-rw-r--r--source4/pidl/lib/Parse/Pidl.pm2
-rw-r--r--source4/pidl/lib/Parse/Pidl/CUtil.pm39
-rw-r--r--source4/pidl/lib/Parse/Pidl/Compat.pm7
-rw-r--r--source4/pidl/lib/Parse/Pidl/IDL.pm2186
-rw-r--r--source4/pidl/lib/Parse/Pidl/NDR.pm35
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm4
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm6
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4.pm1
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/EJS.pm41
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/Header.pm135
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm111
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/Python.pm882
-rw-r--r--source4/pidl/lib/Parse/Pidl/Typelist.pm50
-rwxr-xr-xsource4/pidl/pidl43
-rw-r--r--source4/pidl/smb_interfaces.pm1272
-rw-r--r--source4/pidl/smb_interfaces.yp233
-rwxr-xr-xsource4/pidl/tests/cutil.pl21
-rwxr-xr-xsource4/pidl/tests/header.pl54
-rwxr-xr-xsource4/pidl/tests/ndr.pl17
-rwxr-xr-xsource4/pidl/tests/parse_idl.pl34
-rwxr-xr-xsource4/pidl/tests/samba-ejs.pl13
-rwxr-xr-xsource4/pidl/tests/samba-ndr.pl51
-rwxr-xr-xsource4/pidl/tests/samba3-cli.pl71
-rw-r--r--source4/pidl/tests/samba3-srv.pl18
-rwxr-xr-xsource4/pidl/tests/typelist.pl8
30 files changed, 2268 insertions, 3126 deletions
diff --git a/source4/pidl/MANIFEST b/source4/pidl/MANIFEST
index 7f30c3ab54..051c5d2b19 100644
--- a/source4/pidl/MANIFEST
+++ b/source4/pidl/MANIFEST
@@ -40,4 +40,4 @@ idl.yp
TODO
README
pidl
-META.yml Module meta-data (added by MakeMaker)
+META.yml
diff --git a/source4/pidl/META.yml b/source4/pidl/META.yml
new file mode 100644
index 0000000000..4822b50f09
--- /dev/null
+++ b/source4/pidl/META.yml
@@ -0,0 +1,18 @@
+name: Parse-Pidl
+abstract: Generate parsers / DCE/RPC-clients from IDL
+author:
+ - Andrew Tridgell <tridge@samba.org>
+ - Jelmer Vernooij <jelmer@samba.org>
+ - Stefan Metzmacher <metze@samba.org>
+ - Tim Potter <tpot@samba.org>
+license: gplv3
+installdirs: site
+homepage: http://www.samba.org/
+bugtracker: http://bugzilla.samba.org/
+requires:
+ Parse::Yapp: 0
+recommends:
+ Data::Dumper: 0
+meta-spec:
+ version: 1.3
+ url: http://module-build.sourceforge.net/META-spec-v1.3.html
diff --git a/source4/pidl/README b/source4/pidl/README
index 5bf7752da9..d678387282 100644
--- a/source4/pidl/README
+++ b/source4/pidl/README
@@ -40,6 +40,7 @@ Parse::Pidl::Samba4::NDR::Server - Generates server side implementation in C
Parse::Pidl::Samba4::TDR - Parser generator for the "Trivial Data Representation"
Parse::Pidl::Samba4::Template - Generates stubs in C for server implementation
Parse::Pidl::Samba4::EJS - Generates bindings for Embedded JavaScript (EJS)
+Parse::Pidl::Samba4::Python - Generates bindings for Python
-- Samba COM / DCOM --
Parse::Pidl::Samba4::COM::Proxy - Generates proxy object for DCOM (client-side)
diff --git a/source4/pidl/TODO b/source4/pidl/TODO
index 487d51d11e..f1cca0ab23 100644
--- a/source4/pidl/TODO
+++ b/source4/pidl/TODO
@@ -6,7 +6,6 @@
- compatibility mode for generating MIDL-readable data:
- strip out pidl-specific properties
-- remove declare in favor of typedef
- make bitmap an optional attribute on enum
- support nested elements
- support typedefs properly (e.g. allow "typedef void **bla;")
diff --git a/source4/pidl/idl.yp b/source4/pidl/idl.yp
index c372569a75..d2543c580c 100644
--- a/source4/pidl/idl.yp
+++ b/source4/pidl/idl.yp
@@ -93,7 +93,7 @@ definitions:
;
-definition: function | const | typedef | declare | typedecl
+definition: function | const | typedef | typedecl
;
const: 'const' identifier pointers identifier '=' anytext ';'
@@ -132,40 +132,6 @@ function: property_list type identifier '(' element_list2 ')' ';'
}}
;
-declare: 'declare' decl_type identifier';'
- {{
- "TYPE" => "DECLARE",
- "NAME" => $_[3],
- "DATA" => $_[2],
- "FILE" => $_[0]->YYData->{FILE},
- "LINE" => $_[0]->YYData->{LINE},
- }}
-;
-
-decl_type: decl_enum | decl_bitmap | decl_union
-;
-
-decl_enum: property_list 'enum'
- {{
- "TYPE" => "ENUM",
- "PROPERTIES" => $_[1]
- }}
-;
-
-decl_bitmap: property_list 'bitmap'
- {{
- "TYPE" => "BITMAP",
- "PROPERTIES" => $_[1]
- }}
-;
-
-decl_union: property_list 'union'
- {{
- "TYPE" => "UNION",
- "PROPERTIES" => $_[1]
- }}
-;
-
typedef: property_list 'typedef' type identifier array_len ';'
{{
"TYPE" => "TYPEDEF",
@@ -476,7 +442,7 @@ again:
if (s/^([\w_]+)//) {
$parser->YYData->{LAST_TOKEN} = $1;
if ($1 =~
- /^(coclass|interface|const|typedef|declare|union|cpp_quote
+ /^(coclass|interface|const|typedef|union|cpp_quote
|struct|enum|bitmap|void|unsigned|signed|import|include
|importlib)$/x) {
return $1;
diff --git a/source4/pidl/lib/Parse/Pidl.pm b/source4/pidl/lib/Parse/Pidl.pm
index 0c6e0e5727..c2c9463d03 100644
--- a/source4/pidl/lib/Parse/Pidl.pm
+++ b/source4/pidl/lib/Parse/Pidl.pm
@@ -9,7 +9,7 @@ package Parse::Pidl;
require Exporter;
@ISA = qw(Exporter);
-@EXPORT_OK = qw(warning error fatal);
+@EXPORT_OK = qw(warning error fatal $VERSION);
use strict;
diff --git a/source4/pidl/lib/Parse/Pidl/CUtil.pm b/source4/pidl/lib/Parse/Pidl/CUtil.pm
new file mode 100644
index 0000000000..bd7b16812c
--- /dev/null
+++ b/source4/pidl/lib/Parse/Pidl/CUtil.pm
@@ -0,0 +1,39 @@
+###################################################
+# C utility functions for pidl
+# Copyright jelmer@samba.org 2005-2007
+# released under the GNU GPL
+package Parse::Pidl::CUtil;
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(get_pointer_to get_value_of);
+use vars qw($VERSION);
+$VERSION = '0.01';
+
+use strict;
+
+sub get_pointer_to($)
+{
+ my $var_name = shift;
+
+ if ($var_name =~ /^\*(.*)$/) {
+ return $1;
+ } elsif ($var_name =~ /^\&(.*)$/) {
+ return "&($var_name)";
+ } else {
+ return "&$var_name";
+ }
+}
+
+sub get_value_of($)
+{
+ my $var_name = shift;
+
+ if ($var_name =~ /^\&(.*)$/) {
+ return $1;
+ } else {
+ return "*$var_name";
+ }
+}
+
+1;
diff --git a/source4/pidl/lib/Parse/Pidl/Compat.pm b/source4/pidl/lib/Parse/Pidl/Compat.pm
index f1241ef341..7939bb2df2 100644
--- a/source4/pidl/lib/Parse/Pidl/Compat.pm
+++ b/source4/pidl/lib/Parse/Pidl/Compat.pm
@@ -152,13 +152,6 @@ sub CheckInterface($)
$if->{PROPERTIES}->{pointer_default_top} ne "ref") {
warning($if, "pointer_default_top() is pidl-specific");
}
-
- foreach my $x (@{$if->{DATA}}) {
- if ($x->{TYPE} eq "DECLARE") {
- warning($if, "the declare keyword is pidl-specific");
- next;
- }
- }
}
sub Check($)
diff --git a/source4/pidl/lib/Parse/Pidl/IDL.pm b/source4/pidl/lib/Parse/Pidl/IDL.pm
index e9155e4e00..35e1d7bcd7 100644
--- a/source4/pidl/lib/Parse/Pidl/IDL.pm
+++ b/source4/pidl/lib/Parse/Pidl/IDL.pm
@@ -38,7 +38,7 @@ sub new {
"import" => 7,
"include" => 13
},
- DEFAULT => -91,
+ DEFAULT => -83,
GOTOS => {
'cpp_quote' => 11,
'importlib' => 10,
@@ -124,7 +124,7 @@ sub new {
}
},
{#State 16
- DEFAULT => -124
+ DEFAULT => -116
},
{#State 17
DEFAULT => -11
@@ -184,7 +184,7 @@ sub new {
}
},
{#State 26
- DEFAULT => -120
+ DEFAULT => -112
},
{#State 27
ACTIONS => {
@@ -206,10 +206,10 @@ sub new {
ACTIONS => {
"(" => 40
},
- DEFAULT => -95
+ DEFAULT => -87
},
{#State 31
- DEFAULT => -93
+ DEFAULT => -85
},
{#State 32
DEFAULT => -8
@@ -231,10 +231,9 @@ sub new {
},
{#State 37
ACTIONS => {
- "declare" => 49,
- "const" => 53
+ "const" => 51
},
- DEFAULT => -91,
+ DEFAULT => -83,
GOTOS => {
'typedecl' => 42,
'function' => 43,
@@ -243,12 +242,11 @@ sub new {
'definition' => 48,
'property_list' => 47,
'usertype' => 46,
- 'const' => 52,
- 'declare' => 51,
- 'struct' => 50,
- 'typedef' => 55,
- 'enum' => 54,
- 'union' => 56
+ 'const' => 50,
+ 'struct' => 49,
+ 'typedef' => 53,
+ 'enum' => 52,
+ 'union' => 54
}
},
{#State 38
@@ -257,1539 +255,1482 @@ sub new {
},
GOTOS => {
'identifier' => 30,
- 'property' => 57
+ 'property' => 55
}
},
{#State 39
- DEFAULT => -92
+ DEFAULT => -84
},
{#State 40
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'text' => 63,
- 'listtext' => 59,
- 'anytext' => 58,
- 'constant' => 60
+ 'identifier' => 60,
+ 'text' => 61,
+ 'listtext' => 57,
+ 'anytext' => 56,
+ 'constant' => 58
}
},
{#State 41
ACTIONS => {
- "}" => 64,
- "interface" => 65
+ "}" => 62,
+ "interface" => 63
}
},
{#State 42
- DEFAULT => -24
+ DEFAULT => -23
},
{#State 43
DEFAULT => -20
},
{#State 44
- DEFAULT => -39
+ DEFAULT => -31
},
{#State 45
ACTIONS => {
- "}" => 66,
- "declare" => 49,
- "const" => 53
+ "}" => 64,
+ "const" => 51
},
- DEFAULT => -91,
+ DEFAULT => -83,
GOTOS => {
'typedecl' => 42,
'function' => 43,
'bitmap' => 44,
- 'definition' => 67,
+ 'definition' => 65,
'property_list' => 47,
'usertype' => 46,
- 'const' => 52,
- 'struct' => 50,
- 'declare' => 51,
- 'typedef' => 55,
- 'enum' => 54,
- 'union' => 56
+ 'struct' => 49,
+ 'const' => 50,
+ 'typedef' => 53,
+ 'enum' => 52,
+ 'union' => 54
}
},
{#State 46
ACTIONS => {
- ";" => 68
+ ";" => 66
}
},
{#State 47
ACTIONS => {
- "typedef" => 69,
+ "typedef" => 67,
'IDENTIFIER' => 26,
- "signed" => 77,
- "union" => 70,
- "enum" => 79,
- "bitmap" => 80,
- 'void' => 71,
- "unsigned" => 81,
+ "signed" => 75,
+ "union" => 68,
+ "enum" => 77,
+ "bitmap" => 78,
+ 'void' => 69,
+ "unsigned" => 79,
"[" => 20,
- "struct" => 76
+ "struct" => 74
},
GOTOS => {
- 'existingtype' => 78,
+ 'existingtype' => 76,
'bitmap' => 44,
- 'usertype' => 73,
- 'property_list' => 72,
- 'identifier' => 74,
- 'struct' => 50,
- 'enum' => 54,
- 'type' => 82,
- 'union' => 56,
- 'sign' => 75
+ 'usertype' => 71,
+ 'property_list' => 70,
+ 'identifier' => 72,
+ 'struct' => 49,
+ 'enum' => 52,
+ 'type' => 80,
+ 'union' => 54,
+ 'sign' => 73
}
},
{#State 48
DEFAULT => -18
},
{#State 49
- DEFAULT => -91,
- GOTOS => {
- 'decl_enum' => 84,
- 'decl_bitmap' => 85,
- 'decl_type' => 87,
- 'decl_union' => 86,
- 'property_list' => 83
- }
+ DEFAULT => -28
},
{#State 50
- DEFAULT => -36
- },
- {#State 51
- DEFAULT => -23
- },
- {#State 52
DEFAULT => -21
},
- {#State 53
+ {#State 51
ACTIONS => {
'IDENTIFIER' => 26
},
GOTOS => {
- 'identifier' => 88
+ 'identifier' => 81
}
},
+ {#State 52
+ DEFAULT => -30
+ },
+ {#State 53
+ DEFAULT => -22
+ },
{#State 54
- DEFAULT => -38
+ DEFAULT => -29
},
{#State 55
- DEFAULT => -22
+ DEFAULT => -86
},
{#State 56
- DEFAULT => -37
+ ACTIONS => {
+ "-" => 83,
+ ":" => 82,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "*" => 87,
+ "?" => 88,
+ "{" => 89,
+ "&" => 90,
+ "/" => 91,
+ "=" => 92,
+ "(" => 93,
+ "|" => 94,
+ "." => 95,
+ ">" => 96
+ },
+ DEFAULT => -89
},
{#State 57
- DEFAULT => -94
+ ACTIONS => {
+ "," => 97,
+ ")" => 98
+ }
},
{#State 58
- ACTIONS => {
- "-" => 90,
- ":" => 89,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "*" => 94,
- "?" => 95,
- "{" => 96,
- "&" => 97,
- "/" => 98,
- "=" => 99,
- "(" => 100,
- "|" => 101,
- "." => 102,
- ">" => 103
- },
- DEFAULT => -97
+ DEFAULT => -95
},
{#State 59
- ACTIONS => {
- "," => 104,
- ")" => 105
- }
+ DEFAULT => -115
},
{#State 60
- DEFAULT => -103
+ DEFAULT => -94
},
{#State 61
- DEFAULT => -123
+ DEFAULT => -96
},
{#State 62
- DEFAULT => -102
- },
- {#State 63
- DEFAULT => -104
- },
- {#State 64
ACTIONS => {
- ";" => 106
+ ";" => 99
},
- DEFAULT => -125,
+ DEFAULT => -117,
GOTOS => {
- 'optional_semicolon' => 107
+ 'optional_semicolon' => 100
}
},
- {#State 65
+ {#State 63
ACTIONS => {
'IDENTIFIER' => 26
},
GOTOS => {
- 'identifier' => 108
+ 'identifier' => 101
}
},
- {#State 66
+ {#State 64
ACTIONS => {
- ";" => 106
+ ";" => 99
},
- DEFAULT => -125,
+ DEFAULT => -117,
GOTOS => {
- 'optional_semicolon' => 109
+ 'optional_semicolon' => 102
}
},
- {#State 67
+ {#State 65
DEFAULT => -19
},
- {#State 68
- DEFAULT => -40
+ {#State 66
+ DEFAULT => -32
},
- {#State 69
+ {#State 67
ACTIONS => {
'IDENTIFIER' => 26,
- "signed" => 77,
- 'void' => 71,
- "unsigned" => 81
+ "signed" => 75,
+ 'void' => 69,
+ "unsigned" => 79
},
- DEFAULT => -91,
+ DEFAULT => -83,
GOTOS => {
- 'existingtype' => 78,
+ 'existingtype' => 76,
'bitmap' => 44,
- 'usertype' => 73,
- 'property_list' => 72,
- 'identifier' => 74,
- 'struct' => 50,
- 'enum' => 54,
- 'type' => 110,
- 'union' => 56,
- 'sign' => 75
+ 'usertype' => 71,
+ 'property_list' => 70,
+ 'identifier' => 72,
+ 'struct' => 49,
+ 'enum' => 52,
+ 'type' => 103,
+ 'union' => 54,
+ 'sign' => 73
}
},
- {#State 70
+ {#State 68
ACTIONS => {
- 'IDENTIFIER' => 111
+ 'IDENTIFIER' => 104
},
- DEFAULT => -122,
+ DEFAULT => -114,
GOTOS => {
- 'optional_identifier' => 112
+ 'optional_identifier' => 105
}
},
- {#State 71
- DEFAULT => -47
+ {#State 69
+ DEFAULT => -39
},
- {#State 72
+ {#State 70
ACTIONS => {
- "union" => 70,
- "enum" => 79,
- "bitmap" => 80,
+ "union" => 68,
+ "enum" => 77,
+ "bitmap" => 78,
"[" => 20,
- "struct" => 76
+ "struct" => 74
}
},
- {#State 73
- DEFAULT => -45
+ {#State 71
+ DEFAULT => -37
},
- {#State 74
- DEFAULT => -44
+ {#State 72
+ DEFAULT => -36
},
- {#State 75
+ {#State 73
ACTIONS => {
'IDENTIFIER' => 26
},
GOTOS => {
- 'identifier' => 113
+ 'identifier' => 106
}
},
- {#State 76
+ {#State 74
ACTIONS => {
- 'IDENTIFIER' => 111
+ 'IDENTIFIER' => 104
},
- DEFAULT => -122,
+ DEFAULT => -114,
GOTOS => {
- 'optional_identifier' => 114
+ 'optional_identifier' => 107
}
},
- {#State 77
- DEFAULT => -41
- },
- {#State 78
- DEFAULT => -46
+ {#State 75
+ DEFAULT => -33
},
- {#State 79
- ACTIONS => {
- 'IDENTIFIER' => 111
- },
- DEFAULT => -122,
- GOTOS => {
- 'optional_identifier' => 115
- }
+ {#State 76
+ DEFAULT => -38
},
- {#State 80
+ {#State 77
ACTIONS => {
- 'IDENTIFIER' => 111
+ 'IDENTIFIER' => 104
},
- DEFAULT => -122,
+ DEFAULT => -114,
GOTOS => {
- 'optional_identifier' => 116
+ 'optional_identifier' => 108
}
},
- {#State 81
- DEFAULT => -42
- },
- {#State 82
+ {#State 78
ACTIONS => {
- 'IDENTIFIER' => 26
+ 'IDENTIFIER' => 104
},
+ DEFAULT => -114,
GOTOS => {
- 'identifier' => 117
- }
- },
- {#State 83
- ACTIONS => {
- "union" => 118,
- "enum" => 119,
- "bitmap" => 120,
- "[" => 20
+ 'optional_identifier' => 109
}
},
- {#State 84
- DEFAULT => -29
- },
- {#State 85
- DEFAULT => -30
- },
- {#State 86
- DEFAULT => -31
+ {#State 79
+ DEFAULT => -34
},
- {#State 87
+ {#State 80
ACTIONS => {
'IDENTIFIER' => 26
},
GOTOS => {
- 'identifier' => 121
+ 'identifier' => 110
}
},
- {#State 88
- DEFAULT => -80,
+ {#State 81
+ DEFAULT => -72,
GOTOS => {
- 'pointers' => 122
+ 'pointers' => 111
}
},
- {#State 89
+ {#State 82
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 123,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 112,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 90
+ {#State 83
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 124,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 113,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 91
+ {#State 84
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 125,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 114,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 92
+ {#State 85
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 126,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 115,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 93
+ {#State 86
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 127,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 116,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 94
+ {#State 87
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 128,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 117,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 95
+ {#State 88
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 129,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 118,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 96
+ {#State 89
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 130,
- 'text' => 63,
- 'constant' => 60,
- 'commalisttext' => 131
+ 'identifier' => 60,
+ 'anytext' => 119,
+ 'text' => 61,
+ 'constant' => 58,
+ 'commalisttext' => 120
}
},
- {#State 97
+ {#State 90
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 132,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 121,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 98
+ {#State 91
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 133,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 122,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 99
+ {#State 92
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 134,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 123,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 100
+ {#State 93
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 130,
- 'text' => 63,
- 'constant' => 60,
- 'commalisttext' => 135
+ 'identifier' => 60,
+ 'anytext' => 119,
+ 'text' => 61,
+ 'constant' => 58,
+ 'commalisttext' => 124
}
},
- {#State 101
+ {#State 94
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 136,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 125,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 102
+ {#State 95
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 137,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 126,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 103
+ {#State 96
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 138,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 127,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 104
+ {#State 97
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 139,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 128,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 105
- DEFAULT => -96
+ {#State 98
+ DEFAULT => -88
},
- {#State 106
- DEFAULT => -126
+ {#State 99
+ DEFAULT => -118
},
- {#State 107
+ {#State 100
DEFAULT => -13
},
- {#State 108
+ {#State 101
ACTIONS => {
- ";" => 140
+ ";" => 129
}
},
- {#State 109
+ {#State 102
DEFAULT => -16
},
- {#State 110
+ {#State 103
ACTIONS => {
'IDENTIFIER' => 26
},
GOTOS => {
- 'identifier' => 141
+ 'identifier' => 130
}
},
- {#State 111
- DEFAULT => -121
+ {#State 104
+ DEFAULT => -113
},
- {#State 112
+ {#State 105
ACTIONS => {
- "{" => 143
+ "{" => 132
},
- DEFAULT => -76,
+ DEFAULT => -68,
GOTOS => {
- 'union_body' => 144,
- 'opt_union_body' => 142
+ 'union_body' => 133,
+ 'opt_union_body' => 131
}
},
- {#State 113
- DEFAULT => -43
+ {#State 106
+ DEFAULT => -35
},
- {#State 114
+ {#State 107
ACTIONS => {
- "{" => 146
+ "{" => 135
},
- DEFAULT => -66,
+ DEFAULT => -58,
GOTOS => {
- 'struct_body' => 145,
- 'opt_struct_body' => 147
+ 'struct_body' => 134,
+ 'opt_struct_body' => 136
}
},
- {#State 115
+ {#State 108
ACTIONS => {
- "{" => 148
+ "{" => 137
},
- DEFAULT => -49,
+ DEFAULT => -41,
GOTOS => {
- 'opt_enum_body' => 150,
- 'enum_body' => 149
+ 'opt_enum_body' => 139,
+ 'enum_body' => 138
}
},
- {#State 116
+ {#State 109
ACTIONS => {
- "{" => 152
+ "{" => 141
},
- DEFAULT => -57,
+ DEFAULT => -49,
GOTOS => {
- 'bitmap_body' => 153,
- 'opt_bitmap_body' => 151
+ 'bitmap_body' => 142,
+ 'opt_bitmap_body' => 140
}
},
- {#State 117
- ACTIONS => {
- "(" => 154
- }
- },
- {#State 118
- DEFAULT => -34
- },
- {#State 119
- DEFAULT => -32
- },
- {#State 120
- DEFAULT => -33
- },
- {#State 121
+ {#State 110
ACTIONS => {
- ";" => 155
+ "(" => 143
}
},
- {#State 122
+ {#State 111
ACTIONS => {
'IDENTIFIER' => 26,
- "*" => 157
+ "*" => 145
},
GOTOS => {
- 'identifier' => 156
+ 'identifier' => 144
}
},
- {#State 123
- ACTIONS => {
- "-" => 90,
- ":" => 89,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "*" => 94,
- "?" => 95,
- "{" => 96,
- "&" => 97,
- "/" => 98,
- "=" => 99,
- "(" => 100,
- "|" => 101,
- "." => 102,
- ">" => 103
- },
- DEFAULT => -114
- },
- {#State 124
+ {#State 112
ACTIONS => {
- ":" => 89,
- "<" => 91,
- "~" => 92,
- "?" => 95,
- "{" => 96,
- "=" => 99
+ "-" => 83,
+ ":" => 82,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "*" => 87,
+ "?" => 88,
+ "{" => 89,
+ "&" => 90,
+ "/" => 91,
+ "=" => 92,
+ "(" => 93,
+ "|" => 94,
+ "." => 95,
+ ">" => 96
},
- DEFAULT => -105
+ DEFAULT => -106
},
- {#State 125
+ {#State 113
ACTIONS => {
- "-" => 90,
- ":" => 89,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "*" => 94,
- "?" => 95,
- "{" => 96,
- "&" => 97,
- "/" => 98,
- "=" => 99,
- "(" => 100,
- "|" => 101,
- "." => 102,
- ">" => 103
+ ":" => 82,
+ "<" => 84,
+ "~" => 85,
+ "?" => 88,
+ "{" => 89,
+ "=" => 92
},
- DEFAULT => -109
+ DEFAULT => -97
},
- {#State 126
+ {#State 114
ACTIONS => {
- "-" => 90,
- ":" => 89,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "*" => 94,
- "?" => 95,
- "{" => 96,
- "&" => 97,
- "/" => 98,
- "=" => 99,
- "(" => 100,
- "|" => 101,
- "." => 102,
- ">" => 103
- },
- DEFAULT => -117
+ "-" => 83,
+ ":" => 82,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "*" => 87,
+ "?" => 88,
+ "{" => 89,
+ "&" => 90,
+ "/" => 91,
+ "=" => 92,
+ "(" => 93,
+ "|" => 94,
+ "." => 95,
+ ">" => 96
+ },
+ DEFAULT => -101
},
- {#State 127
+ {#State 115
ACTIONS => {
- ":" => 89,
- "<" => 91,
- "~" => 92,
- "?" => 95,
- "{" => 96,
- "=" => 99
+ "-" => 83,
+ ":" => 82,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "*" => 87,
+ "?" => 88,
+ "{" => 89,
+ "&" => 90,
+ "/" => 91,
+ "=" => 92,
+ "(" => 93,
+ "|" => 94,
+ "." => 95,
+ ">" => 96
},
- DEFAULT => -116
+ DEFAULT => -109
},
- {#State 128
+ {#State 116
ACTIONS => {
- ":" => 89,
- "<" => 91,
- "~" => 92,
- "?" => 95,
- "{" => 96,
- "=" => 99
+ ":" => 82,
+ "<" => 84,
+ "~" => 85,
+ "?" => 88,
+ "{" => 89,
+ "=" => 92
},
- DEFAULT => -107
+ DEFAULT => -108
},
- {#State 129
+ {#State 117
ACTIONS => {
- "-" => 90,
- ":" => 89,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "*" => 94,
- "?" => 95,
- "{" => 96,
- "&" => 97,
- "/" => 98,
- "=" => 99,
- "(" => 100,
- "|" => 101,
- "." => 102,
- ">" => 103
+ ":" => 82,
+ "<" => 84,
+ "~" => 85,
+ "?" => 88,
+ "{" => 89,
+ "=" => 92
},
- DEFAULT => -113
+ DEFAULT => -99
},
- {#State 130
+ {#State 118
ACTIONS => {
- "-" => 90,
- ":" => 89,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "*" => 94,
- "?" => 95,
- "{" => 96,
- "&" => 97,
- "/" => 98,
- "=" => 99,
- "(" => 100,
- "|" => 101,
- "." => 102,
- ">" => 103
+ "-" => 83,
+ ":" => 82,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "*" => 87,
+ "?" => 88,
+ "{" => 89,
+ "&" => 90,
+ "/" => 91,
+ "=" => 92,
+ "(" => 93,
+ "|" => 94,
+ "." => 95,
+ ">" => 96
},
- DEFAULT => -99
+ DEFAULT => -105
},
- {#State 131
+ {#State 119
ACTIONS => {
- "}" => 158,
- "," => 159
+ "-" => 83,
+ ":" => 82,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "*" => 87,
+ "?" => 88,
+ "{" => 89,
+ "&" => 90,
+ "/" => 91,
+ "=" => 92,
+ "(" => 93,
+ "|" => 94,
+ "." => 95,
+ ">" => 96
+ },
+ DEFAULT => -91
+ },
+ {#State 120
+ ACTIONS => {
+ "}" => 146,
+ "," => 147
}
},
- {#State 132
+ {#State 121
ACTIONS => {
- ":" => 89,
- "<" => 91,
- "~" => 92,
- "?" => 95,
- "{" => 96,
- "=" => 99
+ ":" => 82,
+ "<" => 84,
+ "~" => 85,
+ "?" => 88,
+ "{" => 89,
+ "=" => 92
},
- DEFAULT => -111
+ DEFAULT => -103
},
- {#State 133
+ {#State 122
ACTIONS => {
- ":" => 89,
- "<" => 91,
- "~" => 92,
- "?" => 95,
- "{" => 96,
- "=" => 99
+ ":" => 82,
+ "<" => 84,
+ "~" => 85,
+ "?" => 88,
+ "{" => 89,
+ "=" => 92
},
- DEFAULT => -112
+ DEFAULT => -104
},
- {#State 134
+ {#State 123
ACTIONS => {
- "-" => 90,
- ":" => 89,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "*" => 94,
- "?" => 95,
- "{" => 96,
- "&" => 97,
- "/" => 98,
- "=" => 99,
- "(" => 100,
- "|" => 101,
- "." => 102,
- ">" => 103
+ "-" => 83,
+ ":" => 82,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "*" => 87,
+ "?" => 88,
+ "{" => 89,
+ "&" => 90,
+ "/" => 91,
+ "=" => 92,
+ "(" => 93,
+ "|" => 94,
+ "." => 95,
+ ">" => 96
},
- DEFAULT => -115
+ DEFAULT => -107
},
- {#State 135
+ {#State 124
ACTIONS => {
- "," => 159,
- ")" => 160
+ "," => 147,
+ ")" => 148
}
},
- {#State 136
+ {#State 125
ACTIONS => {
- ":" => 89,
- "<" => 91,
- "~" => 92,
- "?" => 95,
- "{" => 96,
- "=" => 99
+ ":" => 82,
+ "<" => 84,
+ "~" => 85,
+ "?" => 88,
+ "{" => 89,
+ "=" => 92
},
- DEFAULT => -110
+ DEFAULT => -102
},
- {#State 137
+ {#State 126
ACTIONS => {
- ":" => 89,
- "<" => 91,
- "~" => 92,
- "?" => 95,
- "{" => 96,
- "=" => 99
+ ":" => 82,
+ "<" => 84,
+ "~" => 85,
+ "?" => 88,
+ "{" => 89,
+ "=" => 92
},
- DEFAULT => -106
+ DEFAULT => -98
},
- {#State 138
+ {#State 127
ACTIONS => {
- ":" => 89,
- "<" => 91,
- "~" => 92,
- "?" => 95,
- "{" => 96,
- "=" => 99
+ ":" => 82,
+ "<" => 84,
+ "~" => 85,
+ "?" => 88,
+ "{" => 89,
+ "=" => 92
},
- DEFAULT => -108
+ DEFAULT => -100
},
- {#State 139
+ {#State 128
ACTIONS => {
- "-" => 90,
- ":" => 89,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "*" => 94,
- "?" => 95,
- "{" => 96,
- "&" => 97,
- "/" => 98,
- "=" => 99,
- "(" => 100,
- "|" => 101,
- "." => 102,
- ">" => 103
+ "-" => 83,
+ ":" => 82,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "*" => 87,
+ "?" => 88,
+ "{" => 89,
+ "&" => 90,
+ "/" => 91,
+ "=" => 92,
+ "(" => 93,
+ "|" => 94,
+ "." => 95,
+ ">" => 96
},
- DEFAULT => -98
+ DEFAULT => -90
},
- {#State 140
+ {#State 129
DEFAULT => -15
},
- {#State 141
+ {#State 130
ACTIONS => {
- "[" => 161
+ "[" => 149
},
- DEFAULT => -88,
+ DEFAULT => -80,
GOTOS => {
- 'array_len' => 162
+ 'array_len' => 150
}
},
- {#State 142
- DEFAULT => -78
+ {#State 131
+ DEFAULT => -70
},
- {#State 143
- DEFAULT => -73,
+ {#State 132
+ DEFAULT => -65,
GOTOS => {
- 'union_elements' => 163
+ 'union_elements' => 151
}
},
- {#State 144
- DEFAULT => -77
+ {#State 133
+ DEFAULT => -69
},
- {#State 145
- DEFAULT => -67
+ {#State 134
+ DEFAULT => -59
},
- {#State 146
- DEFAULT => -82,
+ {#State 135
+ DEFAULT => -74,
GOTOS => {
- 'element_list1' => 164
+ 'element_list1' => 152
}
},
- {#State 147
- DEFAULT => -68
+ {#State 136
+ DEFAULT => -60
},
- {#State 148
+ {#State 137
ACTIONS => {
'IDENTIFIER' => 26
},
GOTOS => {
- 'identifier' => 165,
- 'enum_element' => 166,
- 'enum_elements' => 167
+ 'identifier' => 153,
+ 'enum_element' => 154,
+ 'enum_elements' => 155
}
},
- {#State 149
- DEFAULT => -50
+ {#State 138
+ DEFAULT => -42
},
- {#State 150
- DEFAULT => -51
+ {#State 139
+ DEFAULT => -43
},
- {#State 151
- DEFAULT => -59
+ {#State 140
+ DEFAULT => -51
},
- {#State 152
+ {#State 141
ACTIONS => {
'IDENTIFIER' => 26
},
- DEFAULT => -62,
+ DEFAULT => -54,
GOTOS => {
- 'identifier' => 170,
- 'bitmap_element' => 169,
- 'bitmap_elements' => 168,
- 'opt_bitmap_elements' => 171
+ 'identifier' => 158,
+ 'bitmap_element' => 157,
+ 'bitmap_elements' => 156,
+ 'opt_bitmap_elements' => 159
}
},
- {#State 153
- DEFAULT => -58
+ {#State 142
+ DEFAULT => -50
},
- {#State 154
+ {#State 143
ACTIONS => {
- "," => -84,
- "void" => 175,
- ")" => -84
+ "," => -76,
+ "void" => 163,
+ ")" => -76
},
- DEFAULT => -91,
+ DEFAULT => -83,
GOTOS => {
- 'base_element' => 172,
- 'element_list2' => 174,
- 'property_list' => 173
+ 'base_element' => 160,
+ 'element_list2' => 162,
+ 'property_list' => 161
}
},
- {#State 155
- DEFAULT => -28
- },
- {#State 156
+ {#State 144
ACTIONS => {
- "[" => 161,
- "=" => 177
+ "[" => 149,
+ "=" => 165
},
GOTOS => {
- 'array_len' => 176
+ 'array_len' => 164
}
},
- {#State 157
- DEFAULT => -81
+ {#State 145
+ DEFAULT => -73
},
- {#State 158
+ {#State 146
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 178,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 166,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 159
+ {#State 147
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 179,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 167,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 160
+ {#State 148
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 180,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 168,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 161
+ {#State 149
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
- "]" => 181,
+ "]" => 169,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 182,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 170,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 162
+ {#State 150
ACTIONS => {
- ";" => 183
+ ";" => 171
}
},
- {#State 163
+ {#State 151
ACTIONS => {
- "}" => 184
+ "}" => 172
},
- DEFAULT => -91,
+ DEFAULT => -83,
GOTOS => {
- 'optional_base_element' => 186,
- 'property_list' => 185
+ 'optional_base_element' => 174,
+ 'property_list' => 173
}
},
- {#State 164
+ {#State 152
ACTIONS => {
- "}" => 187
+ "}" => 175
},
- DEFAULT => -91,
+ DEFAULT => -83,
GOTOS => {
- 'base_element' => 188,
- 'property_list' => 173
+ 'base_element' => 176,
+ 'property_list' => 161
}
},
- {#State 165
+ {#State 153
ACTIONS => {
- "=" => 189
+ "=" => 177
},
- DEFAULT => -54
+ DEFAULT => -46
},
- {#State 166
- DEFAULT => -52
+ {#State 154
+ DEFAULT => -44
},
- {#State 167
+ {#State 155
ACTIONS => {
- "}" => 190,
- "," => 191
+ "}" => 178,
+ "," => 179
}
},
- {#State 168
+ {#State 156
ACTIONS => {
- "," => 192
+ "," => 180
},
- DEFAULT => -63
+ DEFAULT => -55
},
- {#State 169
- DEFAULT => -60
+ {#State 157
+ DEFAULT => -52
},
- {#State 170
+ {#State 158
ACTIONS => {
- "=" => 193
+ "=" => 181
}
},
- {#State 171
+ {#State 159
ACTIONS => {
- "}" => 194
+ "}" => 182
}
},
- {#State 172
- DEFAULT => -86
+ {#State 160
+ DEFAULT => -78
},
- {#State 173
+ {#State 161
ACTIONS => {
'IDENTIFIER' => 26,
- "signed" => 77,
- 'void' => 71,
- "unsigned" => 81,
+ "signed" => 75,
+ 'void' => 69,
+ "unsigned" => 79,
"[" => 20
},
- DEFAULT => -91,
+ DEFAULT => -83,
GOTOS => {
- 'existingtype' => 78,
+ 'existingtype' => 76,
'bitmap' => 44,
- 'usertype' => 73,
- 'property_list' => 72,
- 'identifier' => 74,
- 'struct' => 50,
- 'enum' => 54,
- 'type' => 195,
- 'union' => 56,
- 'sign' => 75
+ 'usertype' => 71,
+ 'property_list' => 70,
+ 'identifier' => 72,
+ 'struct' => 49,
+ 'enum' => 52,
+ 'type' => 183,
+ 'union' => 54,
+ 'sign' => 73
}
},
- {#State 174
+ {#State 162
ACTIONS => {
- "," => 196,
- ")" => 197
+ "," => 184,
+ ")" => 185
}
},
- {#State 175
- DEFAULT => -85
+ {#State 163
+ DEFAULT => -77
},
- {#State 176
+ {#State 164
ACTIONS => {
- "=" => 198
+ "=" => 186
}
},
- {#State 177
+ {#State 165
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 199,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 187,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 178
+ {#State 166
ACTIONS => {
- "-" => 90,
- ":" => 89,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "*" => 94,
- "?" => 95,
- "{" => 96,
- "&" => 97,
- "/" => 98,
- "=" => 99,
- "(" => 100,
- "|" => 101,
- "." => 102,
- ">" => 103
- },
- DEFAULT => -119
+ "-" => 83,
+ ":" => 82,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "*" => 87,
+ "?" => 88,
+ "{" => 89,
+ "&" => 90,
+ "/" => 91,
+ "=" => 92,
+ "(" => 93,
+ "|" => 94,
+ "." => 95,
+ ">" => 96
+ },
+ DEFAULT => -111
},
- {#State 179
+ {#State 167
ACTIONS => {
- "-" => 90,
- ":" => 89,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "*" => 94,
- "?" => 95,
- "{" => 96,
- "&" => 97,
- "/" => 98,
- "=" => 99,
- "(" => 100,
- "|" => 101,
- "." => 102,
- ">" => 103
+ "-" => 83,
+ ":" => 82,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "*" => 87,
+ "?" => 88,
+ "{" => 89,
+ "&" => 90,
+ "/" => 91,
+ "=" => 92,
+ "(" => 93,
+ "|" => 94,
+ "." => 95,
+ ">" => 96
},
- DEFAULT => -100
+ DEFAULT => -92
},
- {#State 180
+ {#State 168
ACTIONS => {
- ":" => 89,
- "<" => 91,
- "~" => 92,
- "?" => 95,
- "{" => 96,
- "=" => 99
+ ":" => 82,
+ "<" => 84,
+ "~" => 85,
+ "?" => 88,
+ "{" => 89,
+ "=" => 92
},
- DEFAULT => -118
+ DEFAULT => -110
},
- {#State 181
+ {#State 169
ACTIONS => {
- "[" => 161
+ "[" => 149
},
- DEFAULT => -88,
+ DEFAULT => -80,
GOTOS => {
- 'array_len' => 200
+ 'array_len' => 188
}
},
- {#State 182
+ {#State 170
ACTIONS => {
- "-" => 90,
- ":" => 89,
- "?" => 95,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "&" => 97,
- "{" => 96,
- "/" => 98,
- "=" => 99,
- "|" => 101,
- "(" => 100,
- "*" => 94,
- "." => 102,
- "]" => 201,
- ">" => 103
+ "-" => 83,
+ ":" => 82,
+ "?" => 88,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "&" => 90,
+ "{" => 89,
+ "/" => 91,
+ "=" => 92,
+ "|" => 94,
+ "(" => 93,
+ "*" => 87,
+ "." => 95,
+ "]" => 189,
+ ">" => 96
}
},
- {#State 183
- DEFAULT => -35
+ {#State 171
+ DEFAULT => -27
},
- {#State 184
- DEFAULT => -75
+ {#State 172
+ DEFAULT => -67
},
- {#State 185
+ {#State 173
ACTIONS => {
"[" => 20
},
- DEFAULT => -91,
+ DEFAULT => -83,
GOTOS => {
- 'base_or_empty' => 202,
- 'base_element' => 203,
- 'empty_element' => 204,
- 'property_list' => 205
+ 'base_or_empty' => 190,
+ 'base_element' => 191,
+ 'empty_element' => 192,
+ 'property_list' => 193
}
},
- {#State 186
- DEFAULT => -74
+ {#State 174
+ DEFAULT => -66
},
- {#State 187
- DEFAULT => -65
+ {#State 175
+ DEFAULT => -57
},
- {#State 188
+ {#State 176
ACTIONS => {
- ";" => 206
+ ";" => 194
}
},
- {#State 189
+ {#State 177
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 207,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 195,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 190
- DEFAULT => -48
+ {#State 178
+ DEFAULT => -40
},
- {#State 191
+ {#State 179
ACTIONS => {
'IDENTIFIER' => 26
},
GOTOS => {
- 'identifier' => 165,
- 'enum_element' => 208
+ 'identifier' => 153,
+ 'enum_element' => 196
}
},
- {#State 192
+ {#State 180
ACTIONS => {
'IDENTIFIER' => 26
},
GOTOS => {
- 'identifier' => 170,
- 'bitmap_element' => 209
+ 'identifier' => 158,
+ 'bitmap_element' => 197
}
},
- {#State 193
+ {#State 181
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 210,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 198,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 194
- DEFAULT => -56
+ {#State 182
+ DEFAULT => -48
},
- {#State 195
- DEFAULT => -80,
+ {#State 183
+ DEFAULT => -72,
GOTOS => {
- 'pointers' => 211
+ 'pointers' => 199
}
},
- {#State 196
- DEFAULT => -91,
+ {#State 184
+ DEFAULT => -83,
GOTOS => {
- 'base_element' => 212,
- 'property_list' => 173
+ 'base_element' => 200,
+ 'property_list' => 161
}
},
- {#State 197
+ {#State 185
ACTIONS => {
- ";" => 213
+ ";" => 201
}
},
- {#State 198
+ {#State 186
ACTIONS => {
- 'CONSTANT' => 61,
+ 'CONSTANT' => 59,
'TEXT' => 16,
'IDENTIFIER' => 26
},
- DEFAULT => -101,
+ DEFAULT => -93,
GOTOS => {
- 'identifier' => 62,
- 'anytext' => 214,
- 'text' => 63,
- 'constant' => 60
+ 'identifier' => 60,
+ 'anytext' => 202,
+ 'text' => 61,
+ 'constant' => 58
}
},
- {#State 199
+ {#State 187
ACTIONS => {
- "-" => 90,
- ":" => 89,
- "?" => 95,
- "<" => 91,
- ";" => 215,
- "+" => 93,
- "~" => 92,
- "&" => 97,
- "{" => 96,
- "/" => 98,
- "=" => 99,
- "|" => 101,
- "(" => 100,
- "*" => 94,
- "." => 102,
- ">" => 103
+ "-" => 83,
+ ":" => 82,
+ "?" => 88,
+ "<" => 84,
+ ";" => 203,
+ "+" => 86,
+ "~" => 85,
+ "&" => 90,
+ "{" => 89,
+ "/" => 91,
+ "=" => 92,
+ "|" => 94,
+ "(" => 93,
+ "*" => 87,
+ "." => 95,
+ ">" => 96
}
},
- {#State 200
- DEFAULT => -89
+ {#State 188
+ DEFAULT => -81
},
- {#State 201
+ {#State 189
ACTIONS => {
- "[" => 161
+ "[" => 149
},
- DEFAULT => -88,
+ DEFAULT => -80,
GOTOS => {
- 'array_len' => 216
+ 'array_len' => 204
}
},
- {#State 202
- DEFAULT => -72
+ {#State 190
+ DEFAULT => -64
},
- {#State 203
+ {#State 191
ACTIONS => {
- ";" => 217
+ ";" => 205
}
},
- {#State 204
- DEFAULT => -71
+ {#State 192
+ DEFAULT => -63
},
- {#State 205
+ {#State 193
ACTIONS => {
'IDENTIFIER' => 26,
- "signed" => 77,
- ";" => 218,
- 'void' => 71,
- "unsigned" => 81,
+ "signed" => 75,
+ ";" => 206,
+ 'void' => 69,
+ "unsigned" => 79,
"[" => 20
},
- DEFAULT => -91,
+ DEFAULT => -83,
GOTOS => {
- 'existingtype' => 78,
+ 'existingtype' => 76,
'bitmap' => 44,
- 'usertype' => 73,
- 'property_list' => 72,
- 'identifier' => 74,
- 'struct' => 50,
- 'enum' => 54,
- 'type' => 195,
- 'union' => 56,
- 'sign' => 75
+ 'usertype' => 71,
+ 'property_list' => 70,
+ 'identifier' => 72,
+ 'struct' => 49,
+ 'enum' => 52,
+ 'type' => 183,
+ 'union' => 54,
+ 'sign' => 73
}
},
- {#State 206
- DEFAULT => -83
+ {#State 194
+ DEFAULT => -75
},
- {#State 207
+ {#State 195
ACTIONS => {
- "-" => 90,
- ":" => 89,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "*" => 94,
- "?" => 95,
- "{" => 96,
- "&" => 97,
- "/" => 98,
- "=" => 99,
- "(" => 100,
- "|" => 101,
- "." => 102,
- ">" => 103
+ "-" => 83,
+ ":" => 82,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "*" => 87,
+ "?" => 88,
+ "{" => 89,
+ "&" => 90,
+ "/" => 91,
+ "=" => 92,
+ "(" => 93,
+ "|" => 94,
+ "." => 95,
+ ">" => 96
},
- DEFAULT => -55
+ DEFAULT => -47
},
- {#State 208
- DEFAULT => -53
+ {#State 196
+ DEFAULT => -45
},
- {#State 209
- DEFAULT => -61
+ {#State 197
+ DEFAULT => -53
},
- {#State 210
- ACTIONS => {
- "-" => 90,
- ":" => 89,
- "<" => 91,
- "+" => 93,
- "~" => 92,
- "*" => 94,
- "?" => 95,
- "{" => 96,
- "&" => 97,
- "/" => 98,
- "=" => 99,
- "(" => 100,
- "|" => 101,
- "." => 102,
- ">" => 103
+ {#State 198
+ ACTIONS => {
+ "-" => 83,
+ ":" => 82,
+ "<" => 84,
+ "+" => 86,
+ "~" => 85,
+ "*" => 87,
+ "?" => 88,
+ "{" => 89,
+ "&" => 90,
+ "/" => 91,
+ "=" => 92,
+ "(" => 93,
+ "|" => 94,
+ "." => 95,
+ ">" => 96
},
- DEFAULT => -64
+ DEFAULT => -56
},
- {#State 211
+ {#State 199
ACTIONS => {
'IDENTIFIER' => 26,
- "*" => 157
+ "*" => 145
},
GOTOS => {
- 'identifier' => 219
+ 'identifier' => 207
}
},
- {#State 212
- DEFAULT => -87
+ {#State 200
+ DEFAULT => -79
},
- {#State 213
- DEFAULT => -27
+ {#State 201
+ DEFAULT => -26
},
- {#State 214
- ACTIONS => {
- "-" => 90,
- ":" => 89,
- "?" => 95,
- "<" => 91,
- ";" => 220,
- "+" => 93,
- "~" => 92,
- "&" => 97,
- "{" => 96,
- "/" => 98,
- "=" => 99,
- "|" => 101,
- "(" => 100,
- "*" => 94,
- "." => 102,
- ">" => 103
- }
- },
- {#State 215
- DEFAULT => -25
+ {#State 202
+ ACTIONS => {
+ "-" => 83,
+ ":" => 82,
+ "?" => 88,
+ "<" => 84,
+ ";" => 208,
+ "+" => 86,
+ "~" => 85,
+ "&" => 90,
+ "{" => 89,
+ "/" => 91,
+ "=" => 92,
+ "|" => 94,
+ "(" => 93,
+ "*" => 87,
+ "." => 95,
+ ">" => 96
+ }
},
- {#State 216
- DEFAULT => -90
+ {#State 203
+ DEFAULT => -24
},
- {#State 217
- DEFAULT => -70
+ {#State 204
+ DEFAULT => -82
},
- {#State 218
- DEFAULT => -69
+ {#State 205
+ DEFAULT => -62
+ },
+ {#State 206
+ DEFAULT => -61
},
- {#State 219
+ {#State 207
ACTIONS => {
- "[" => 161
+ "[" => 149
},
- DEFAULT => -88,
+ DEFAULT => -80,
GOTOS => {
- 'array_len' => 221
+ 'array_len' => 209
}
},
- {#State 220
- DEFAULT => -26
+ {#State 208
+ DEFAULT => -25
},
- {#State 221
- DEFAULT => -79
+ {#State 209
+ DEFAULT => -71
}
],
yyrules =>
@@ -1952,9 +1893,6 @@ sub
'definition', 1, undef
],
[#Rule 24
- 'definition', 1, undef
- ],
- [#Rule 25
'const', 7,
sub
#line 100 "idl.yp"
@@ -1968,7 +1906,7 @@ sub
"LINE" => $_[0]->YYData->{LINE},
}}
],
- [#Rule 26
+ [#Rule 25
'const', 8,
sub
#line 110 "idl.yp"
@@ -1983,7 +1921,7 @@ sub
"LINE" => $_[0]->YYData->{LINE},
}}
],
- [#Rule 27
+ [#Rule 26
'function', 7,
sub
#line 124 "idl.yp"
@@ -1997,58 +1935,10 @@ sub
"LINE" => $_[0]->YYData->{LINE},
}}
],
- [#Rule 28
- 'declare', 4,
-sub
-#line 136 "idl.yp"
-{{
- "TYPE" => "DECLARE",
- "NAME" => $_[3],
- "DATA" => $_[2],
- "FILE" => $_[0]->YYData->{FILE},
- "LINE" => $_[0]->YYData->{LINE},
- }}
- ],
- [#Rule 29
- 'decl_type', 1, undef
- ],
- [#Rule 30
- 'decl_type', 1, undef
- ],
- [#Rule 31
- 'decl_type', 1, undef
- ],
- [#Rule 32
- 'decl_enum', 2,
-sub
-#line 149 "idl.yp"
-{{
- "TYPE" => "ENUM",
- "PROPERTIES" => $_[1]
- }}
- ],
- [#Rule 33
- 'decl_bitmap', 2,
-sub
-#line 156 "idl.yp"
-{{
- "TYPE" => "BITMAP",
- "PROPERTIES" => $_[1]
- }}
- ],
- [#Rule 34
- 'decl_union', 2,
-sub
-#line 163 "idl.yp"
-{{
- "TYPE" => "UNION",
- "PROPERTIES" => $_[1]
- }}
- ],
- [#Rule 35
+ [#Rule 27
'typedef', 6,
sub
-#line 170 "idl.yp"
+#line 136 "idl.yp"
{{
"TYPE" => "TYPEDEF",
"PROPERTIES" => $_[1],
@@ -2059,67 +1949,67 @@ sub
"LINE" => $_[0]->YYData->{LINE},
}}
],
- [#Rule 36
+ [#Rule 28
'usertype', 1, undef
],
- [#Rule 37
+ [#Rule 29
'usertype', 1, undef
],
- [#Rule 38
+ [#Rule 30
'usertype', 1, undef
],
- [#Rule 39
+ [#Rule 31
'usertype', 1, undef
],
- [#Rule 40
+ [#Rule 32
'typedecl', 2,
sub
-#line 183 "idl.yp"
+#line 149 "idl.yp"
{ $_[1] }
],
- [#Rule 41
+ [#Rule 33
'sign', 1, undef
],
- [#Rule 42
+ [#Rule 34
'sign', 1, undef
],
- [#Rule 43
+ [#Rule 35
'existingtype', 2,
sub
-#line 188 "idl.yp"
+#line 154 "idl.yp"
{ ($_[1]?$_[1]:"signed") ." $_[2]" }
],
- [#Rule 44
+ [#Rule 36
'existingtype', 1, undef
],
- [#Rule 45
+ [#Rule 37
'type', 1, undef
],
- [#Rule 46
+ [#Rule 38
'type', 1, undef
],
- [#Rule 47
+ [#Rule 39
'type', 1,
sub
-#line 192 "idl.yp"
+#line 158 "idl.yp"
{ "void" }
],
- [#Rule 48
+ [#Rule 40
'enum_body', 3,
sub
-#line 194 "idl.yp"
+#line 160 "idl.yp"
{ $_[2] }
],
- [#Rule 49
+ [#Rule 41
'opt_enum_body', 0, undef
],
- [#Rule 50
+ [#Rule 42
'opt_enum_body', 1, undef
],
- [#Rule 51
+ [#Rule 43
'enum', 4,
sub
-#line 197 "idl.yp"
+#line 163 "idl.yp"
{{
"TYPE" => "ENUM",
"PROPERTIES" => $_[1],
@@ -2127,43 +2017,43 @@ sub
"ELEMENTS" => $_[4]
}}
],
- [#Rule 52
+ [#Rule 44
'enum_elements', 1,
sub
-#line 206 "idl.yp"
+#line 172 "idl.yp"
{ [ $_[1] ] }
],
- [#Rule 53
+ [#Rule 45
'enum_elements', 3,
sub
-#line 207 "idl.yp"
+#line 173 "idl.yp"
{ push(@{$_[1]}, $_[3]); $_[1] }
],
- [#Rule 54
+ [#Rule 46
'enum_element', 1, undef
],
- [#Rule 55
+ [#Rule 47
'enum_element', 3,
sub
-#line 211 "idl.yp"
+#line 177 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 56
+ [#Rule 48
'bitmap_body', 3,
sub
-#line 214 "idl.yp"
+#line 180 "idl.yp"
{ $_[2] }
],
- [#Rule 57
+ [#Rule 49
'opt_bitmap_body', 0, undef
],
- [#Rule 58
+ [#Rule 50
'opt_bitmap_body', 1, undef
],
- [#Rule 59
+ [#Rule 51
'bitmap', 4,
sub
-#line 217 "idl.yp"
+#line 183 "idl.yp"
{{
"TYPE" => "BITMAP",
"PROPERTIES" => $_[1],
@@ -2171,46 +2061,46 @@ sub
"ELEMENTS" => $_[4]
}}
],
- [#Rule 60
+ [#Rule 52
'bitmap_elements', 1,
sub
-#line 226 "idl.yp"
+#line 192 "idl.yp"
{ [ $_[1] ] }
],
- [#Rule 61
+ [#Rule 53
'bitmap_elements', 3,
sub
-#line 227 "idl.yp"
+#line 193 "idl.yp"
{ push(@{$_[1]}, $_[3]); $_[1] }
],
- [#Rule 62
+ [#Rule 54
'opt_bitmap_elements', 0, undef
],
- [#Rule 63
+ [#Rule 55
'opt_bitmap_elements', 1, undef
],
- [#Rule 64
+ [#Rule 56
'bitmap_element', 3,
sub
-#line 232 "idl.yp"
+#line 198 "idl.yp"
{ "$_[1] ( $_[3] )" }
],
- [#Rule 65
+ [#Rule 57
'struct_body', 3,
sub
-#line 235 "idl.yp"
+#line 201 "idl.yp"
{ $_[2] }
],
- [#Rule 66
+ [#Rule 58
'opt_struct_body', 0, undef
],
- [#Rule 67
+ [#Rule 59
'opt_struct_body', 1, undef
],
- [#Rule 68
+ [#Rule 60
'struct', 4,
sub
-#line 239 "idl.yp"
+#line 205 "idl.yp"
{{
"TYPE" => "STRUCT",
"PROPERTIES" => $_[1],
@@ -2218,10 +2108,10 @@ sub
"ELEMENTS" => $_[4]
}}
],
- [#Rule 69
+ [#Rule 61
'empty_element', 2,
sub
-#line 248 "idl.yp"
+#line 214 "idl.yp"
{{
"NAME" => "",
"TYPE" => "EMPTY",
@@ -2232,43 +2122,43 @@ sub
"LINE" => $_[0]->YYData->{LINE},
}}
],
- [#Rule 70
+ [#Rule 62
'base_or_empty', 2, undef
],
- [#Rule 71
+ [#Rule 63
'base_or_empty', 1, undef
],
- [#Rule 72
+ [#Rule 64
'optional_base_element', 2,
sub
-#line 262 "idl.yp"
+#line 228 "idl.yp"
{ $_[2]->{PROPERTIES} = FlattenHash([$_[1],$_[2]->{PROPERTIES}]); $_[2] }
],
- [#Rule 73
+ [#Rule 65
'union_elements', 0, undef
],
- [#Rule 74
+ [#Rule 66
'union_elements', 2,
sub
-#line 267 "idl.yp"
+#line 233 "idl.yp"
{ push(@{$_[1]}, $_[2]); $_[1] }
],
- [#Rule 75
+ [#Rule 67
'union_body', 3,
sub
-#line 270 "idl.yp"
+#line 236 "idl.yp"
{ $_[2] }
],
- [#Rule 76
+ [#Rule 68
'opt_union_body', 0, undef
],
- [#Rule 77
+ [#Rule 69
'opt_union_body', 1, undef
],
- [#Rule 78
+ [#Rule 70
'union', 4,
sub
-#line 274 "idl.yp"
+#line 240 "idl.yp"
{{
"TYPE" => "UNION",
"PROPERTIES" => $_[1],
@@ -2276,10 +2166,10 @@ sub
"ELEMENTS" => $_[4]
}}
],
- [#Rule 79
+ [#Rule 71
'base_element', 5,
sub
-#line 283 "idl.yp"
+#line 249 "idl.yp"
{{
"NAME" => $_[4],
"TYPE" => $_[2],
@@ -2290,241 +2180,241 @@ sub
"LINE" => $_[0]->YYData->{LINE},
}}
],
- [#Rule 80
+ [#Rule 72
'pointers', 0,
sub
-#line 297 "idl.yp"
+#line 263 "idl.yp"
{ 0 }
],
- [#Rule 81
+ [#Rule 73
'pointers', 2,
sub
-#line 298 "idl.yp"
+#line 264 "idl.yp"
{ $_[1]+1 }
],
- [#Rule 82
+ [#Rule 74
'element_list1', 0,
sub
-#line 302 "idl.yp"
+#line 268 "idl.yp"
{ [] }
],
- [#Rule 83
+ [#Rule 75
'element_list1', 3,
sub
-#line 303 "idl.yp"
+#line 269 "idl.yp"
{ push(@{$_[1]}, $_[2]); $_[1] }
],
- [#Rule 84
+ [#Rule 76
'element_list2', 0, undef
],
- [#Rule 85
+ [#Rule 77
'element_list2', 1, undef
],
- [#Rule 86
+ [#Rule 78
'element_list2', 1,
sub
-#line 309 "idl.yp"
+#line 275 "idl.yp"
{ [ $_[1] ] }
],
- [#Rule 87
+ [#Rule 79
'element_list2', 3,
sub
-#line 310 "idl.yp"
+#line 276 "idl.yp"
{ push(@{$_[1]}, $_[3]); $_[1] }
],
- [#Rule 88
+ [#Rule 80
'array_len', 0, undef
],
- [#Rule 89
+ [#Rule 81
'array_len', 3,
sub
-#line 315 "idl.yp"
+#line 281 "idl.yp"
{ push(@{$_[3]}, "*"); $_[3] }
],
- [#Rule 90
+ [#Rule 82
'array_len', 4,
sub
-#line 316 "idl.yp"
+#line 282 "idl.yp"
{ push(@{$_[4]}, "$_[2]"); $_[4] }
],
- [#Rule 91
+ [#Rule 83
'property_list', 0, undef
],
- [#Rule 92
+ [#Rule 84
'property_list', 4,
sub
-#line 322 "idl.yp"
+#line 288 "idl.yp"
{ FlattenHash([$_[1],$_[3]]); }
],
- [#Rule 93
+ [#Rule 85
'properties', 1,
sub
-#line 325 "idl.yp"
+#line 291 "idl.yp"
{ $_[1] }
],
- [#Rule 94
+ [#Rule 86
'properties', 3,
sub
-#line 326 "idl.yp"
+#line 292 "idl.yp"
{ FlattenHash([$_[1], $_[3]]); }
],
- [#Rule 95
+ [#Rule 87
'property', 1,
sub
-#line 329 "idl.yp"
+#line 295 "idl.yp"
{{ "$_[1]" => "1" }}
],
- [#Rule 96
+ [#Rule 88
'property', 4,
sub
-#line 330 "idl.yp"
+#line 296 "idl.yp"
{{ "$_[1]" => "$_[3]" }}
],
- [#Rule 97
+ [#Rule 89
'listtext', 1, undef
],
- [#Rule 98
+ [#Rule 90
'listtext', 3,
sub
-#line 335 "idl.yp"
+#line 301 "idl.yp"
{ "$_[1] $_[3]" }
],
- [#Rule 99
+ [#Rule 91
'commalisttext', 1, undef
],
- [#Rule 100
+ [#Rule 92
'commalisttext', 3,
sub
-#line 340 "idl.yp"
+#line 306 "idl.yp"
{ "$_[1],$_[3]" }
],
- [#Rule 101
+ [#Rule 93
'anytext', 0,
sub
-#line 344 "idl.yp"
+#line 310 "idl.yp"
{ "" }
],
- [#Rule 102
+ [#Rule 94
'anytext', 1, undef
],
- [#Rule 103
+ [#Rule 95
'anytext', 1, undef
],
- [#Rule 104
+ [#Rule 96
'anytext', 1, undef
],
- [#Rule 105
+ [#Rule 97
'anytext', 3,
sub
-#line 346 "idl.yp"
+#line 312 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 106
+ [#Rule 98
'anytext', 3,
sub
-#line 347 "idl.yp"
+#line 313 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 107
+ [#Rule 99
'anytext', 3,
sub
-#line 348 "idl.yp"
+#line 314 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 108
+ [#Rule 100
'anytext', 3,
sub
-#line 349 "idl.yp"
+#line 315 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 109
+ [#Rule 101
'anytext', 3,
sub
-#line 350 "idl.yp"
+#line 316 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 110
+ [#Rule 102
'anytext', 3,
sub
-#line 351 "idl.yp"
+#line 317 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 111
+ [#Rule 103
'anytext', 3,
sub
-#line 352 "idl.yp"
+#line 318 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 112
+ [#Rule 104
'anytext', 3,
sub
-#line 353 "idl.yp"
+#line 319 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 113
+ [#Rule 105
'anytext', 3,
sub
-#line 354 "idl.yp"
+#line 320 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 114
+ [#Rule 106
'anytext', 3,
sub
-#line 355 "idl.yp"
+#line 321 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 115
+ [#Rule 107
'anytext', 3,
sub
-#line 356 "idl.yp"
+#line 322 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 116
+ [#Rule 108
'anytext', 3,
sub
-#line 357 "idl.yp"
+#line 323 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 117
+ [#Rule 109
'anytext', 3,
sub
-#line 358 "idl.yp"
+#line 324 "idl.yp"
{ "$_[1]$_[2]$_[3]" }
],
- [#Rule 118
+ [#Rule 110
'anytext', 5,
sub
-#line 359 "idl.yp"
+#line 325 "idl.yp"
{ "$_[1]$_[2]$_[3]$_[4]$_[5]" }
],
- [#Rule 119
+ [#Rule 111
'anytext', 5,
sub
-#line 360 "idl.yp"
+#line 326 "idl.yp"
{ "$_[1]$_[2]$_[3]$_[4]$_[5]" }
],
- [#Rule 120
+ [#Rule 112
'identifier', 1, undef
],
- [#Rule 121
+ [#Rule 113
'optional_identifier', 1, undef
],
- [#Rule 122
+ [#Rule 114
'optional_identifier', 0, undef
],
- [#Rule 123
+ [#Rule 115
'constant', 1, undef
],
- [#Rule 124
+ [#Rule 116
'text', 1,
sub
-#line 374 "idl.yp"
+#line 340 "idl.yp"
{ "\"$_[1]\"" }
],
- [#Rule 125
+ [#Rule 117
'optional_semicolon', 0, undef
],
- [#Rule 126
+ [#Rule 118
'optional_semicolon', 1, undef
]
],
@@ -2532,7 +2422,7 @@ sub
bless($self,$class);
}
-#line 385 "idl.yp"
+#line 351 "idl.yp"
use Parse::Pidl qw(error);
@@ -2627,7 +2517,7 @@ again:
if (s/^([\w_]+)//) {
$parser->YYData->{LAST_TOKEN} = $1;
if ($1 =~
- /^(coclass|interface|const|typedef|declare|union|cpp_quote
+ /^(coclass|interface|const|typedef|union|cpp_quote
|struct|enum|bitmap|void|unsigned|signed|import|include
|importlib)$/x) {
return $1;
diff --git a/source4/pidl/lib/Parse/Pidl/NDR.pm b/source4/pidl/lib/Parse/Pidl/NDR.pm
index f624d2bdc0..fc6bfe4c96 100644
--- a/source4/pidl/lib/Parse/Pidl/NDR.pm
+++ b/source4/pidl/lib/Parse/Pidl/NDR.pm
@@ -35,7 +35,7 @@ use vars qw($VERSION);
$VERSION = '0.01';
@ISA = qw(Exporter);
@EXPORT = qw(GetPrevLevel GetNextLevel ContainsDeferred ContainsString);
-@EXPORT_OK = qw(GetElementLevelTable ParseElement ValidElement align_type mapToScalar ParseType can_contain_deferred);
+@EXPORT_OK = qw(GetElementLevelTable ParseElement ValidElement align_type mapToScalar ParseType can_contain_deferred is_charset_array);
use strict;
use Parse::Pidl qw(warning fatal);
@@ -287,8 +287,6 @@ sub can_contain_deferred($)
return 0 if (Parse::Pidl::Typelist::is_scalar($type));
- return 1 if ($type->{TYPE} eq "DECLARE"); # assume the worst
-
return can_contain_deferred($type->{DATA}) if ($type->{TYPE} eq "TYPEDEF");
return 0 unless defined($type->{ELEMENTS});
@@ -354,21 +352,25 @@ sub align_type($)
return $scalar_alignment->{$e->{NAME}};
}
+ return 0 if ($e eq "EMPTY");
+
unless (hasType($e)) {
# it must be an external type - all we can do is guess
- # print "Warning: assuming alignment of unknown type '$e' is 4\n";
+ # warning($e, "assuming alignment of unknown type '$e' is 4");
return 4;
}
my $dt = getType($e);
- if ($dt->{TYPE} eq "TYPEDEF" or $dt->{TYPE} eq "DECLARE") {
+ if ($dt->{TYPE} eq "TYPEDEF") {
return align_type($dt->{DATA});
} elsif ($dt->{TYPE} eq "ENUM") {
return align_type(Parse::Pidl::Typelist::enum_type_fn($dt));
} elsif ($dt->{TYPE} eq "BITMAP") {
return align_type(Parse::Pidl::Typelist::bitmap_type_fn($dt));
} elsif (($dt->{TYPE} eq "STRUCT") or ($dt->{TYPE} eq "UNION")) {
+ # Struct/union without body: assume 4
+ return 4 unless (defined($dt->{ELEMENTS}));
return find_largest_alignment($dt);
}
@@ -631,7 +633,7 @@ sub FindNestedTypes($$)
sub FindNestedTypes($$);
my ($l, $t) = @_;
- return if not defined($t->{ELEMENTS});
+ return unless defined($t->{ELEMENTS});
return if ($t->{TYPE} eq "ENUM");
return if ($t->{TYPE} eq "BITMAP");
@@ -650,7 +652,6 @@ sub ParseInterface($)
my @consts = ();
my @functions = ();
my @endpoints;
- my @declares = ();
my $opnum = 0;
my $version;
@@ -667,9 +668,7 @@ sub ParseInterface($)
}
foreach my $d (@{$idl->{DATA}}) {
- if ($d->{TYPE} eq "DECLARE") {
- push (@declares, $d);
- } elsif ($d->{TYPE} eq "FUNCTION") {
+ if ($d->{TYPE} eq "FUNCTION") {
push (@functions, ParseFunction($idl, $d, \$opnum));
} elsif ($d->{TYPE} eq "CONST") {
push (@consts, ParseConst($idl, $d));
@@ -701,7 +700,6 @@ sub ParseInterface($)
FUNCTIONS => \@functions,
CONSTS => \@consts,
TYPES => \@types,
- DECLARES => \@declares,
ENDPOINTS => \@endpoints
};
}
@@ -1183,4 +1181,19 @@ sub Validate($)
}
}
+sub is_charset_array($$)
+{
+ my ($e,$l) = @_;
+
+ return 0 if ($l->{TYPE} ne "ARRAY");
+
+ my $nl = GetNextLevel($e,$l);
+
+ return 0 unless ($nl->{TYPE} eq "DATA");
+
+ return has_property($e, "charset");
+}
+
+
+
1;
diff --git a/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm b/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm
index b7372a802a..86b8951026 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm
@@ -9,7 +9,7 @@ package Parse::Pidl::Samba3::ClientNDR;
use Exporter;
@ISA = qw(Exporter);
-@EXPORT_OK = qw(GenerateFunctionInEnv ParseFunction $res $res_hdr);
+@EXPORT_OK = qw(ParseFunction $res $res_hdr);
use strict;
use Parse::Pidl qw(fatal warning);
@@ -17,7 +17,7 @@ use Parse::Pidl::Typelist qw(hasType getType mapTypeName scalar_is_reference);
use Parse::Pidl::Util qw(has_property is_constant ParseExpr);
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
use Parse::Pidl::Samba4 qw(DeclLong);
-use Parse::Pidl::Samba4::NDR::Parser qw(GenerateFunctionInEnv);
+use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv);
use vars qw($VERSION);
$VERSION = '0.01';
diff --git a/source4/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm b/source4/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
index 47312bc83d..ca9e7d15db 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
@@ -6,13 +6,17 @@
package Parse::Pidl::Samba3::ServerNDR;
+use Exporter;
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(DeclLevel);
+
use strict;
use Parse::Pidl qw(warning fatal);
use Parse::Pidl::Typelist qw(mapTypeName scalar_is_reference);
use Parse::Pidl::Util qw(ParseExpr has_property is_constant);
use Parse::Pidl::NDR qw(GetNextLevel);
use Parse::Pidl::Samba4 qw(ElementStars DeclLong);
-use Parse::Pidl::Samba4::NDR::Parser qw(GenerateFunctionOutEnv);
+use Parse::Pidl::Samba4::Header qw(GenerateFunctionOutEnv);
use vars qw($VERSION);
$VERSION = '0.01';
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4.pm b/source4/pidl/lib/Parse/Pidl/Samba4.pm
index 5848543a60..d42e01cdb0 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba4.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba4.pm
@@ -12,6 +12,7 @@ require Exporter;
use Parse::Pidl::Util qw(has_property is_constant);
use Parse::Pidl::NDR qw(GetNextLevel);
use Parse::Pidl::Typelist qw(mapTypeName scalar_is_reference);
+use Parse::Pidl qw(fatal);
use strict;
use vars qw($VERSION);
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/EJS.pm b/source4/pidl/lib/Parse/Pidl/Samba4/EJS.pm
index 2e9bc0953c..efb3f2858d 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba4/EJS.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba4/EJS.pm
@@ -8,13 +8,14 @@ package Parse::Pidl::Samba4::EJS;
use Exporter;
@ISA = qw(Exporter);
-@EXPORT_OK = qw(get_pointer_to get_value_of check_null_pointer fn_declare TypeFunctionName);
+@EXPORT_OK = qw(check_null_pointer fn_declare TypeFunctionName);
use strict;
-use Parse::Pidl::Typelist;
+use Parse::Pidl::Typelist qw(typeHasBody);
+use Parse::Pidl::CUtil qw(get_pointer_to get_value_of);
use Parse::Pidl::Util qw(has_property ParseExpr);
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel);
-use Parse::Pidl::Samba4::NDR::Parser qw(GenerateStructEnv GenerateFunctionInEnv
+use Parse::Pidl::Samba4::Header qw(GenerateStructEnv GenerateFunctionInEnv
GenerateFunctionOutEnv);
use vars qw($VERSION);
@@ -54,30 +55,6 @@ sub deindent($)
$self->{tabs} = substr($self->{tabs}, 0, -1);
}
-sub get_pointer_to($)
-{
- my $var_name = shift;
-
- if ($var_name =~ /^\*(.*)$/) {
- return $1;
- } elsif ($var_name =~ /^\&(.*)$/) {
- return "&($var_name)";
- } else {
- return "&$var_name";
- }
-}
-
-sub get_value_of($)
-{
- my $var_name = shift;
-
- if ($var_name =~ /^\&(.*)$/) {
- return $1;
- } else {
- return "*$var_name";
- }
-}
-
#####################################################################
# check that a variable we get from ParseExpr isn't a null pointer
sub check_null_pointer($$)
@@ -297,6 +274,7 @@ sub EjsUnionPull($$$)
sub EjsEnumConstant($$)
{
my ($self, $d) = @_;
+ return unless (defined($d->{ELEMENTS}));
my $v = 0;
foreach my $e (@{$d->{ELEMENTS}}) {
my $el = $e;
@@ -595,6 +573,7 @@ sub EjsEnumPush($$$)
sub EjsBitmapPush($$$)
{
my ($self, $d, $varname) = @_;
+ return unless (defined($d->{ELEMENTS}));
my $type_fn = $d->{BASE_TYPE};
# put the bitmap elements in the constants array
foreach my $e (@{$d->{ELEMENTS}}) {
@@ -733,6 +712,7 @@ sub EjsInterface($$$)
$self->pidl_hdr("\n");
foreach my $d (@{$interface->{TYPES}}) {
+ next unless (typeHasBody($d));
($needed->{TypeFunctionName("ejs_push", $d)}) && $self->EjsTypePushFunction($d, $d->{NAME});
($needed->{TypeFunctionName("ejs_pull", $d)}) && $self->EjsTypePullFunction($d, $d->{NAME});
}
@@ -846,8 +826,9 @@ sub NeededType($$$)
NeededType($t->{DATA}, $needed, $req) if ($t->{TYPE} eq "TYPEDEF");
- return if (($t->{TYPE} ne "STRUCT") and
- ($t->{TYPE} ne "UNION"));
+ return unless (($t->{TYPE} eq "STRUCT") or ($t->{TYPE} eq "UNION"));
+
+ return unless(typeHasBody($t));
foreach (@{$t->{ELEMENTS}}) {
next if (has_property($_, "subcontext")); #FIXME: Support subcontexts
@@ -883,7 +864,7 @@ sub TypeFunctionName($$)
my ($prefix, $t) = @_;
return "$prefix\_$t->{NAME}" if (ref($t) eq "HASH" and
- ($t->{TYPE} eq "TYPEDEF" or $t->{TYPE} eq "DECLARE"));
+ $t->{TYPE} eq "TYPEDEF");
return "$prefix\_$t->{TYPE}_$t->{NAME}" if (ref($t) eq "HASH");
return "$prefix\_$t";
}
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm b/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm
index 7a6ffa46d6..2b3a9df80f 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm
@@ -6,10 +6,15 @@
package Parse::Pidl::Samba4::Header;
+require Exporter;
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv);
+
use strict;
use Parse::Pidl qw(fatal);
use Parse::Pidl::Typelist qw(mapTypeName scalar_is_reference);
-use Parse::Pidl::Util qw(has_property is_constant unmake_str);
+use Parse::Pidl::Util qw(has_property is_constant unmake_str ParseExpr);
use Parse::Pidl::Samba4 qw(is_intree ElementStars ArrayBrackets choose_header);
use vars qw($VERSION);
@@ -107,47 +112,49 @@ sub HeaderEnum($$)
my($enum,$name) = @_;
my $first = 1;
- pidl "#ifndef USE_UINT_ENUMS\n";
- pidl "enum $name {\n";
- $tab_depth++;
+ pidl "enum $name";
if (defined($enum->{ELEMENTS})) {
+ pidl "\n#ifndef USE_UINT_ENUMS\n";
+ pidl " {\n";
+ $tab_depth++;
foreach my $e (@{$enum->{ELEMENTS}}) {
unless ($first) { pidl ",\n"; }
$first = 0;
pidl tabs();
pidl $e;
}
- }
- pidl "\n";
- $tab_depth--;
- pidl "}\n";
- pidl "#else\n";
- my $count = 0;
- pidl "enum $name { __donnot_use_enum_$name=0x7FFFFFFF}\n";
- my $with_val = 0;
- my $without_val = 0;
- if (defined($enum->{ELEMENTS})) {
- foreach my $e (@{$enum->{ELEMENTS}}) {
- my $t = "$e";
- my $name;
- my $value;
- if ($t =~ /(.*)=(.*)/) {
- $name = $1;
- $value = $2;
- $with_val = 1;
- fatal($e->{ORIGINAL}, "you can't mix enum member with values and without values!")
- unless ($without_val == 0);
- } else {
- $name = $t;
- $value = $count++;
- $without_val = 1;
- fatal($e->{ORIGINAL}, "you can't mix enum member with values and without values!")
- unless ($with_val == 0);
+ pidl "\n";
+ $tab_depth--;
+ pidl "}";
+ pidl "\n";
+ pidl "#else\n";
+ my $count = 0;
+ my $with_val = 0;
+ my $without_val = 0;
+ if (defined($enum->{ELEMENTS})) {
+ pidl " { __donnot_use_enum_$name=0x7FFFFFFF}\n";
+ foreach my $e (@{$enum->{ELEMENTS}}) {
+ my $t = "$e";
+ my $name;
+ my $value;
+ if ($t =~ /(.*)=(.*)/) {
+ $name = $1;
+ $value = $2;
+ $with_val = 1;
+ fatal($e->{ORIGINAL}, "you can't mix enum member with values and without values!")
+ unless ($without_val == 0);
+ } else {
+ $name = $t;
+ $value = $count++;
+ $without_val = 1;
+ fatal($e->{ORIGINAL}, "you can't mix enum member with values and without values!")
+ unless ($with_val == 0);
+ }
+ pidl "#define $name ( $value )\n";
}
- pidl "#define $name ( $value )\n";
}
+ pidl "#endif\n";
}
- pidl "#endif\n";
}
#####################################################################
@@ -215,7 +222,7 @@ sub HeaderType($$$)
sub HeaderTypedef($)
{
my($typedef) = shift;
- HeaderType($typedef, $typedef->{DATA}, $typedef->{NAME});
+ HeaderType($typedef, $typedef->{DATA}, $typedef->{NAME}) if defined ($typedef->{DATA});
}
#####################################################################
@@ -404,4 +411,66 @@ sub Parse($)
return $res;
}
+sub GenerateStructEnv($$)
+{
+ my ($x, $v) = @_;
+ my %env;
+
+ foreach my $e (@{$x->{ELEMENTS}}) {
+ $env{$e->{NAME}} = "$v->$e->{NAME}";
+ }
+
+ $env{"this"} = $v;
+
+ return \%env;
+}
+
+sub EnvSubstituteValue($$)
+{
+ my ($env,$s) = @_;
+
+ # Substitute the value() values in the env
+ foreach my $e (@{$s->{ELEMENTS}}) {
+ next unless (defined(my $v = has_property($e, "value")));
+
+ $env->{$e->{NAME}} = ParseExpr($v, $env, $e);
+ }
+
+ return $env;
+}
+
+sub GenerateFunctionInEnv($;$)
+{
+ my ($fn, $base) = @_;
+ my %env;
+
+ $base = "r->" unless defined($base);
+
+ foreach my $e (@{$fn->{ELEMENTS}}) {
+ if (grep (/in/, @{$e->{DIRECTION}})) {
+ $env{$e->{NAME}} = $base."in.$e->{NAME}";
+ }
+ }
+
+ return \%env;
+}
+
+sub GenerateFunctionOutEnv($;$)
+{
+ my ($fn, $base) = @_;
+ my %env;
+
+ $base = "r->" unless defined($base);
+
+ foreach my $e (@{$fn->{ELEMENTS}}) {
+ if (grep (/out/, @{$e->{DIRECTION}})) {
+ $env{$e->{NAME}} = $base."out.$e->{NAME}";
+ } elsif (grep (/in/, @{$e->{DIRECTION}})) {
+ $env{$e->{NAME}} = $base."in.$e->{NAME}";
+ }
+ }
+
+ return \%env;
+}
+
1;
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
index c9b48b017c..02d3a80992 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
@@ -9,13 +9,15 @@ package Parse::Pidl::Samba4::NDR::Parser;
require Exporter;
@ISA = qw(Exporter);
-@EXPORT_OK = qw(check_null_pointer GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv NeededFunction NeededElement NeededType $res NeededInterface TypeFunctionName ParseElementPrint);
+@EXPORT_OK = qw(check_null_pointer NeededFunction NeededElement NeededType $res NeededInterface TypeFunctionName ParseElementPrint);
use strict;
-use Parse::Pidl::Typelist qw(hasType getType mapTypeName);
+use Parse::Pidl::Typelist qw(hasType getType mapTypeName typeHasBody);
use Parse::Pidl::Util qw(has_property ParseExpr ParseExprExt print_uuid);
-use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
+use Parse::Pidl::CUtil qw(get_pointer_to get_value_of);
+use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred is_charset_array);
use Parse::Pidl::Samba4 qw(is_intree choose_header);
+use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv);
use Parse::Pidl qw(warning);
use vars qw($VERSION);
@@ -76,42 +78,6 @@ sub has_fast_array($$)
return ($t->{NAME} eq "uint8") or ($t->{NAME} eq "string");
}
-sub is_charset_array($$)
-{
- my ($e,$l) = @_;
-
- return 0 if ($l->{TYPE} ne "ARRAY");
-
- my $nl = GetNextLevel($e,$l);
-
- return 0 unless ($nl->{TYPE} eq "DATA");
-
- return has_property($e, "charset");
-}
-
-sub get_pointer_to($)
-{
- my $var_name = shift;
-
- if ($var_name =~ /^\*(.*)$/) {
- return $1;
- } elsif ($var_name =~ /^\&(.*)$/) {
- return "&($var_name)";
- } else {
- return "&$var_name";
- }
-}
-
-sub get_value_of($)
-{
- my $var_name = shift;
-
- if ($var_name =~ /^\&(.*)$/) {
- return $1;
- } else {
- return "*$var_name";
- }
-}
####################################
# pidl() is our basic output routine
@@ -215,68 +181,6 @@ sub end_flags($$)
}
}
-sub GenerateStructEnv($$)
-{
- my ($x, $v) = @_;
- my %env;
-
- foreach my $e (@{$x->{ELEMENTS}}) {
- $env{$e->{NAME}} = "$v->$e->{NAME}";
- }
-
- $env{"this"} = $v;
-
- return \%env;
-}
-
-sub EnvSubstituteValue($$)
-{
- my ($env,$s) = @_;
-
- # Substitute the value() values in the env
- foreach my $e (@{$s->{ELEMENTS}}) {
- next unless (defined(my $v = has_property($e, "value")));
-
- $env->{$e->{NAME}} = ParseExpr($v, $env, $e);
- }
-
- return $env;
-}
-
-sub GenerateFunctionInEnv($;$)
-{
- my ($fn, $base) = @_;
- my %env;
-
- $base = "r->" unless defined($base);
-
- foreach my $e (@{$fn->{ELEMENTS}}) {
- if (grep (/in/, @{$e->{DIRECTION}})) {
- $env{$e->{NAME}} = $base."in.$e->{NAME}";
- }
- }
-
- return \%env;
-}
-
-sub GenerateFunctionOutEnv($;$)
-{
- my ($fn, $base) = @_;
- my %env;
-
- $base = "r->" unless defined($base);
-
- foreach my $e (@{$fn->{ELEMENTS}}) {
- if (grep (/out/, @{$e->{DIRECTION}})) {
- $env{$e->{NAME}} = $base."out.$e->{NAME}";
- } elsif (grep (/in/, @{$e->{DIRECTION}})) {
- $env{$e->{NAME}} = $base."in.$e->{NAME}";
- }
- }
-
- return \%env;
-}
-
#####################################################################
# parse the data of an array - push side
sub ParseArrayPushHeader($$$$$$)
@@ -2565,6 +2469,8 @@ sub ParseInterface($$$)
# Typedefs
foreach my $d (@{$interface->{TYPES}}) {
+ next unless(typeHasBody($d));
+
($needed->{TypeFunctionName("ndr_push", $d)}) && $self->ParseTypePushFunction($d, "r");
($needed->{TypeFunctionName("ndr_pull", $d)}) && $self->ParseTypePullFunction($d, "r");
($needed->{TypeFunctionName("ndr_print", $d)}) && $self->ParseTypePrintFunction($d, "r");
@@ -2708,6 +2614,7 @@ sub NeededType($$$)
NeededType($t->{DATA}, $needed, $req) if ($t->{TYPE} eq "TYPEDEF");
if ($t->{TYPE} eq "STRUCT" or $t->{TYPE} eq "UNION") {
+ return unless defined($t->{ELEMENTS});
for my $e (@{$t->{ELEMENTS}}) {
$e->{PARENT} = $t;
if (has_property($e, "compression")) {
@@ -2745,7 +2652,7 @@ sub TypeFunctionName($$)
my ($prefix, $t) = @_;
return "$prefix\_$t->{NAME}" if (ref($t) eq "HASH" and
- ($t->{TYPE} eq "TYPEDEF" or $t->{TYPE} eq "DECLARE"));
+ $t->{TYPE} eq "TYPEDEF");
return "$prefix\_$t->{TYPE}_$t->{NAME}" if (ref($t) eq "HASH");
return "$prefix\_$t";
}
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/Python.pm b/source4/pidl/lib/Parse/Pidl/Samba4/Python.pm
index 8effff9d5e..2475925377 100644
--- a/source4/pidl/lib/Parse/Pidl/Samba4/Python.pm
+++ b/source4/pidl/lib/Parse/Pidl/Samba4/Python.pm
@@ -1,6 +1,6 @@
###################################################
# Python function wrapper generator
-# Copyright jelmer@samba.org 2007
+# Copyright jelmer@samba.org 2007-2008
# released under the GNU GPL
package Parse::Pidl::Samba4::Python;
@@ -9,15 +9,19 @@ use Exporter;
@ISA = qw(Exporter);
use strict;
-use Parse::Pidl::Typelist;
+use Parse::Pidl::Typelist qw(hasType resolveType getType mapTypeName expandAlias);
use Parse::Pidl::Util qw(has_property ParseExpr);
+use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred is_charset_array);
+use Parse::Pidl::CUtil qw(get_value_of get_pointer_to);
+use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv);
use vars qw($VERSION);
$VERSION = '0.01';
sub new($) {
my ($class) = @_;
- my $self = { res => "", res_hdr => "", tabs => "", constants => {}};
+ my $self = { res => "", res_hdr => "", tabs => "", constants => {},
+ module_methods => []};
bless($self, $class);
}
@@ -63,121 +67,371 @@ sub Import
sub Const($$)
{
my ($self, $const) = @_;
- $self->{constants}->{$const->{NAME}} = [$const->{DATA}->{TYPE}, $const->{VALUE}];
+ $self->register_constant($const->{NAME}, $const->{DTYPE}, $const->{VALUE});
}
-sub FromTypeToPythonFunction($$)
+sub register_constant($$$$)
{
- my ($self, $type) = @_;
+ my ($self, $name, $type, $value) = @_;
- #FIXME
+ $self->{constants}->{$name} = [$type, $value];
}
-sub FromPythonToTypeFunction($$)
+sub EnumAndBitmapConsts($$$)
{
- my ($self, $type) = @_;
+ my ($self, $name, $d) = @_;
- #FIXME
+ return unless (defined($d->{ELEMENTS}));
+
+ foreach my $e (@{$d->{ELEMENTS}}) {
+ $e =~ /^([A-Za-z0-9_]+)/;
+ my $cname = $1;
+
+ $self->register_constant($cname, $d, $cname);
+ }
}
-sub TypeConstructor($$)
+sub FromUnionToPythonFunction($$$$)
{
- my ($self, $type) = @_;
+ my ($self, $mem_ctx, $type, $switch, $name) = @_;
+
+ $self->pidl("PyObject *ret;");
+ $self->pidl("");
- $self->pidl("staticforward PyTypeObject $type->{NAME}_ObjectType;");
- $self->pidl("typedef struct {");
+ $self->pidl("switch ($switch) {");
$self->indent;
- $self->pidl("PyObject_HEAD");
- $self->pidl("void *object;"); # FIXME: Use real type rather than void
+
+ foreach my $e (@{$type->{ELEMENTS}}) {
+ $self->pidl("$e->{CASE}:");
+
+ $self->indent;
+
+ if ($e->{NAME}) {
+ $self->ConvertObjectToPython($mem_ctx, {}, $e, "$name->$e->{NAME}", "ret");
+ } else {
+ $self->pidl("ret = Py_None;");
+ }
+
+ $self->pidl("return ret;");
+ $self->pidl("");
+
+ $self->deindent;
+ }
+
$self->deindent;
- $self->pidl("} $type->{NAME}_Object;");
+ $self->pidl("}");
- $self->pidl("");
+ $self->pidl("PyErr_SetString(PyExc_TypeError, \"unknown union level\");");
+ $self->pidl("return NULL;");
+}
- $self->pidl("static PyObject *py_$type->{NAME}_getattr(PyTypeObject *obj, char *name)");
- $self->pidl("{");
+sub FromPythonToUnionFunction($$$$$)
+{
+ my ($self, $type, $typename, $switch, $mem_ctx, $name) = @_;
+
+ my $has_default = 0;
+
+ $self->pidl("$typename *ret = talloc_zero($mem_ctx, $typename);");
+
+ $self->pidl("switch ($switch) {");
$self->indent;
- $self->pidl("return Py_None;");
+
+ foreach my $e (@{$type->{ELEMENTS}}) {
+ $self->pidl("$e->{CASE}:");
+ if ($e->{CASE} eq "default") { $has_default = 1; }
+ $self->indent;
+ if ($e->{NAME}) {
+ $self->ConvertObjectFromPython({}, $mem_ctx, $e, $name, "ret->$e->{NAME}", "talloc_free(ret); return NULL;");
+ }
+ $self->pidl("break;");
+ $self->deindent;
+ $self->pidl("");
+ }
+
+ if (!$has_default) {
+ $self->pidl("default:");
+ $self->indent;
+ $self->pidl("PyErr_SetString(PyExc_TypeError, \"invalid union level value\");");
+ $self->pidl("talloc_free(ret);");
+ $self->pidl("ret = NULL;");
+ $self->deindent;
+ }
+
$self->deindent;
$self->pidl("}");
$self->pidl("");
+ $self->pidl("return ret;");
+}
+
+sub PythonStruct($$$$)
+{
+ my ($self, $name, $cname, $d) = @_;
+
+ my $env = GenerateStructEnv($d, "object");
+
+ $self->pidl("");
- $self->pidl("static void py_$type->{NAME}_dealloc(PyObject* self)");
+ $self->pidl("static PyObject *py_$name\_getattr(PyObject *obj, char *name)");
$self->pidl("{");
$self->indent;
- $self->pidl("$type->{NAME}_Object *obj = ($type->{NAME}_Object *)self;");
- $self->pidl("talloc_free(obj->object);");
- $self->pidl("PyObject_Del(self);");
+ if ($#{$d->{ELEMENTS}} > -1) {
+ $self->pidl("$cname *object = py_talloc_get_ptr(obj);");
+ foreach my $e (@{$d->{ELEMENTS}}) {
+ $self->pidl("if (!strcmp(name, \"$e->{NAME}\")) {");
+ my $varname = "object->$e->{NAME}";
+ $self->indent;
+ $self->pidl("PyObject *py_$e->{NAME};");
+ $self->ConvertObjectToPython("py_talloc_get_mem_ctx(obj)", $env, $e, $varname, "py_$e->{NAME}");
+ $self->pidl("return py_$e->{NAME};");
+ $self->deindent;
+ $self->pidl("}");
+ }
+ }
+ $self->pidl("PyErr_SetString(PyExc_AttributeError, \"no such attribute\");");
+ $self->pidl("return NULL;");
$self->deindent;
$self->pidl("}");
$self->pidl("");
- $self->pidl("static PyObject *py_$type->{NAME}_setattr(PyTypeObject *obj, char *name, PyObject *value)");
+ $self->pidl("static int py_$name\_setattr(PyObject *py_obj, char *name, PyObject *value)");
$self->pidl("{");
$self->indent;
- $self->pidl("return Py_None;");
+ if ($#{$d->{ELEMENTS}} > -1) {
+ $self->pidl("$cname *object = py_talloc_get_ptr(py_obj);");
+ my $mem_ctx = "py_talloc_get_mem_ctx(py_obj)";
+ foreach my $e (@{$d->{ELEMENTS}}) {
+ $self->pidl("if (!strcmp(name, \"$e->{NAME}\")) {");
+ my $varname = "object->$e->{NAME}";
+ $self->indent;
+ my $l = $e->{LEVELS}[0];
+ my $nl = GetNextLevel($e, $l);
+ if ($l->{TYPE} eq "POINTER" and
+ not ($nl->{TYPE} eq "ARRAY" and ($nl->{IS_FIXED} or is_charset_array($e, $nl))) and
+ not ($nl->{TYPE} eq "DATA" and Parse::Pidl::Typelist::scalar_is_reference($nl->{DATA_TYPE}))) {
+ $self->pidl("talloc_free($varname);");
+ }
+ $self->ConvertObjectFromPython($env, $mem_ctx, $e, "value", $varname, "return -1;");
+ $self->pidl("return 0;");
+ $self->deindent;
+ $self->pidl("}");
+ }
+ }
+ $self->pidl("PyErr_SetString(PyExc_AttributeError, \"no such attribute\");");
+ $self->pidl("return -1;");
$self->deindent;
$self->pidl("}");
$self->pidl("");
- $self->pidl("static PyTypeObject $type->{NAME}_ObjectType = {");
+ $self->pidl_hdr("PyAPI_DATA(PyTypeObject) $name\_Type;\n");
+ $self->pidl_hdr("#define $name\_Check(op) PyObject_TypeCheck(op, &$name\_Type)\n");
+ $self->pidl_hdr("#define $name\_CheckExact(op) ((op)->ob_type == &$name\_Type)\n");
+ $self->pidl_hdr("\n");
+ $self->pidl("PyTypeObject $name\_Type = {");
$self->indent;
$self->pidl("PyObject_HEAD_INIT(NULL) 0,");
- $self->pidl(".tp_name = \"$type->{NAME}\",");
- $self->pidl(".tp_basicsize = sizeof($type->{NAME}_Object),");
- $self->pidl(".tp_dealloc = (destructor)py_$type->{NAME}_dealloc,");
- $self->pidl(".tp_getattr = (getattrfunc)py_$type->{NAME}_getattr,");
- $self->pidl(".tp_setattr = (setattrfunc)py_$type->{NAME}_setattr,");
+ $self->pidl(".tp_name = \"$name\",");
+ $self->pidl(".tp_basicsize = sizeof(py_talloc_Object),");
+ $self->pidl(".tp_dealloc = py_talloc_dealloc,");
+ $self->pidl(".tp_getattr = py_$name\_getattr,");
+ $self->pidl(".tp_setattr = py_$name\_setattr,");
+ $self->pidl(".tp_repr = py_talloc_default_repr,");
$self->deindent;
$self->pidl("};");
$self->pidl("");
- $self->pidl("static PyObject *py_$type->{NAME}(PyObject *self, PyObject *args)");
+ my $py_fnname = "py_$name";
+ $self->pidl("static PyObject *$py_fnname(PyObject *self, PyObject *args)");
$self->pidl("{");
$self->indent;
- $self->pidl("$type->{NAME}\_Object *ret;");
- $self->pidl("ret = PyObject_New($type->{NAME}_Object, &$type->{NAME}_ObjectType);");
- $self->pidl("return (PyObject *) ret;");
+ $self->pidl("$cname *ret = talloc_zero(NULL, $cname);");
+ $self->pidl("return py_talloc_import(&$name\_Type, ret);");
$self->deindent;
$self->pidl("}");
$self->pidl("");
+
+ return $py_fnname;
}
sub PythonFunction($$$)
{
my ($self, $fn, $iface) = @_;
- $self->pidl("static PyObject *py_$fn->{NAME}(PyObject *self, PyObject *args)");
+ $self->pidl("static PyObject *py_$fn->{NAME}(PyObject *self, PyObject *args, PyObject *kwargs)");
$self->pidl("{");
$self->indent;
$self->pidl("$iface\_InterfaceObject *iface = ($iface\_InterfaceObject *)self;");
$self->pidl("NTSTATUS status;");
+ $self->pidl("TALLOC_CTX *mem_ctx = talloc_new(NULL);");
+ $self->pidl("struct $fn->{NAME} *r = talloc_zero(mem_ctx, struct $fn->{NAME});");
+ $self->pidl("PyObject *result = Py_None;");
+
+ my $env = GenerateFunctionInEnv($fn, "r->");
+ my $result_size = 0;
+
+ my $args_format = "";
+ my $args_string = "";
+ my $args_names = "";
+
+ foreach my $e (@{$fn->{ELEMENTS}}) {
+ $self->pidl("PyObject *py_$e->{NAME};");
+ if (grep(/out/,@{$e->{DIRECTION}})) {
+ $result_size++;
+ }
+ if (grep(/in/,@{$e->{DIRECTION}})) {
+ $args_format .= "O";
+ $args_string .= ", &py_$e->{NAME}";
+ $args_names .= "\"$e->{NAME}\", ";
+ }
+ }
+ $self->pidl("const char *kwnames[] = {");
+ $self->indent;
+ $self->pidl($args_names . "NULL");
+ $self->deindent;
+ $self->pidl("};");
+
$self->pidl("");
- # FIXME
- $self->handle_ntstatus("status", "NULL");
- $self->pidl("return Py_None;");
+ $self->pidl("if (!PyArg_ParseTupleAndKeywords(args, kwargs, \"$args_format:$fn->{NAME}\", discard_const_p(char *, kwnames)$args_string)) {");
+ $self->indent;
+ $self->pidl("return NULL;");
+ $self->deindent;
+ $self->pidl("}");
+
+ if ($fn->{RETURN_TYPE}) {
+ $result_size++ unless ($fn->{RETURN_TYPE} eq "WERROR" or $fn->{RETURN_TYPE} eq "NTSTATUS");
+ }
+
+ foreach my $e (@{$fn->{ELEMENTS}}) {
+ if (grep(/in/,@{$e->{DIRECTION}})) {
+ $self->ConvertObjectFromPython($env, "mem_ctx", $e, "py_$e->{NAME}", "r->in.$e->{NAME}", "talloc_free(mem_ctx); return NULL;");
+ }
+ }
+ $self->pidl("status = dcerpc_$fn->{NAME}(iface->pipe, mem_ctx, r);");
+ $self->handle_ntstatus("status", "NULL", "mem_ctx");
+
+ $env = GenerateFunctionOutEnv($fn, "r->");
+ my $i = 0;
+
+ if ($result_size > 1) {
+ $self->pidl("result = PyTuple_New($result_size);");
+ }
+
+ foreach my $e (@{$fn->{ELEMENTS}}) {
+ my $py_name = "py_$e->{NAME}";
+ if (grep(/out/,@{$e->{DIRECTION}})) {
+ $self->ConvertObjectToPython("r", $env, $e, "r->out.$e->{NAME}", $py_name);
+ if ($result_size > 1) {
+ $self->pidl("PyTuple_SetItem(result, $i, $py_name);");
+ $i++;
+ } else {
+ $self->pidl("result = $py_name;");
+ }
+ }
+ }
+
+ if (defined($fn->{RETURN_TYPE}) and $fn->{RETURN_TYPE} eq "NTSTATUS") {
+ $self->handle_ntstatus("r->out.result", "NULL", "mem_ctx");
+ } elsif (defined($fn->{RETURN_TYPE}) and $fn->{RETURN_TYPE} eq "WERROR") {
+ $self->handle_werror("r->out.result", "NULL", "mem_ctx");
+ } elsif (defined($fn->{RETURN_TYPE})) {
+ my $conv = $self->ConvertObjectToPythonData("r", $fn->{RETURN_TYPE}, "r->out.result");
+ if ($result_size > 1) {
+ $self->pidl("PyTuple_SetItem(result, $i, $conv);");
+ } else {
+ $self->pidl("result = $conv;");
+ }
+ }
+
+ $self->pidl("talloc_free(mem_ctx);");
+ $self->pidl("return result;");
+ $self->deindent;
+ $self->pidl("}");
+ $self->pidl("");
+}
+
+sub handle_werror($$$$)
+{
+ my ($self, $var, $retval, $mem_ctx) = @_;
+
+ $self->pidl("if (!W_ERROR_IS_OK($var)) {");
+ $self->indent;
+ $self->pidl("PyErr_SetString(PyExc_RuntimeError, win_errstr($var));");
+ $self->pidl("talloc_free($mem_ctx);") if ($mem_ctx);
+ $self->pidl("return $retval;");
$self->deindent;
$self->pidl("}");
$self->pidl("");
}
-sub handle_ntstatus($$$)
+sub handle_ntstatus($$$$)
{
- my ($self, $var, $retval) = @_;
+ my ($self, $var, $retval, $mem_ctx) = @_;
$self->pidl("if (NT_STATUS_IS_ERR($var)) {");
$self->indent;
$self->pidl("PyErr_SetString(PyExc_RuntimeError, nt_errstr($var));");
+ $self->pidl("talloc_free($mem_ctx);") if ($mem_ctx);
$self->pidl("return $retval;");
$self->deindent;
$self->pidl("}");
$self->pidl("");
}
-sub Interface($$)
+sub PythonType($$$)
{
- my($self,$interface) = @_;
+ my ($self, $d, $interface, $basename) = @_;
+
+ my $actual_ctype = $d;
+ if ($actual_ctype->{TYPE} eq "TYPEDEF") {
+ $actual_ctype = $actual_ctype->{DATA};
+ }
+
+ if ($actual_ctype->{TYPE} eq "STRUCT") {
+ my $py_fnname;
+ if ($d->{TYPE} eq "STRUCT") {
+ $py_fnname = $self->PythonStruct($d->{NAME}, mapTypeName($d), $d);
+ } else {
+ $py_fnname = $self->PythonStruct($d->{NAME}, mapTypeName($d), $d->{DATA});
+ }
+
+ my $fn_name = $d->{NAME};
+
+ $fn_name =~ s/^$interface->{NAME}_//;
+ $fn_name =~ s/^$basename\_//;
+
+ $self->register_module_method($fn_name, $py_fnname, "METH_NOARGS", "NULL");
+ }
+
+ if ($d->{TYPE} eq "ENUM" or $d->{TYPE} eq "BITMAP") {
+ $self->EnumAndBitmapConsts($d->{NAME}, $d);
+ }
+
+ if ($d->{TYPE} eq "TYPEDEF" and ($d->{DATA}->{TYPE} eq "ENUM" or $d->{DATA}->{TYPE} eq "BITMAP")) {
+ $self->EnumAndBitmapConsts($d->{NAME}, $d->{DATA});
+ }
+
+ if ($actual_ctype->{TYPE} eq "UNION" and defined($actual_ctype->{ELEMENTS})) {
+ $self->pidl("PyObject *py_import_$d->{NAME}(TALLOC_CTX *mem_ctx, int level, " .mapTypeName($d) . " *in)");
+ $self->pidl("{");
+ $self->indent;
+ $self->FromUnionToPythonFunction("mem_ctx", $actual_ctype, "level", "in") if ($actual_ctype->{TYPE} eq "UNION");
+ $self->deindent;
+ $self->pidl("}");
+ $self->pidl("");
+
+ $self->pidl(mapTypeName($d) . " *py_export_$d->{NAME}(TALLOC_CTX *mem_ctx, int level, PyObject *in)");
+ $self->pidl("{");
+ $self->indent;
+ $self->FromPythonToUnionFunction($actual_ctype, mapTypeName($d), "level", "mem_ctx", "in") if ($actual_ctype->{TYPE} eq "UNION");
+ $self->deindent;
+ $self->pidl("}");
+ $self->pidl("");
+ }
+}
+
+sub Interface($$$)
+{
+ my($self,$interface,$basename) = @_;
$self->pidl_hdr("#ifndef _HEADER_PYTHON_$interface->{NAME}\n");
$self->pidl_hdr("#define _HEADER_PYTHON_$interface->{NAME}\n\n");
@@ -186,108 +440,454 @@ sub Interface($$)
$self->Const($_) foreach (@{$interface->{CONSTS}});
- foreach (@{$interface->{TYPES}}) {
- $self->FromTypeToPythonFunction($_);
- $self->FromPythonToTypeFunction($_);
- $self->TypeConstructor($_);
+ foreach my $d (@{$interface->{TYPES}}) {
+ next if has_property($d, "nopython");
+
+ $self->PythonType($d, $interface, $basename);
}
- $self->pidl("staticforward PyTypeObject $interface->{NAME}_InterfaceType;");
- $self->pidl("typedef struct {");
- $self->indent;
- $self->pidl("PyObject_HEAD");
- $self->pidl("struct dcerpc_pipe *pipe;");
- $self->deindent;
- $self->pidl("} $interface->{NAME}_InterfaceObject;");
+ if (defined $interface->{PROPERTIES}->{uuid}) {
+ $self->pidl_hdr("PyAPI_DATA(PyTypeObject) $interface->{NAME}_InterfaceType;\n");
+ $self->pidl("typedef struct {");
+ $self->indent;
+ $self->pidl("PyObject_HEAD");
+ $self->pidl("struct dcerpc_pipe *pipe;");
+ $self->deindent;
+ $self->pidl("} $interface->{NAME}_InterfaceObject;");
- $self->pidl("");
+ $self->pidl("");
- foreach my $d (@{$interface->{FUNCTIONS}}) {
- next if not defined($d->{OPNUM});
- next if has_property($d, "nopython");
+ foreach my $d (@{$interface->{FUNCTIONS}}) {
+ next if not defined($d->{OPNUM});
+ next if has_property($d, "nopython");
+
+ $self->PythonFunction($d, $interface->{NAME});
+ }
+
+ $self->pidl("static PyMethodDef interface_$interface->{NAME}\_methods[] = {");
+ $self->indent;
+ foreach my $d (@{$interface->{FUNCTIONS}}) {
+ next if not defined($d->{OPNUM});
+ next if has_property($d, "nopython");
- $self->PythonFunction($d, $interface->{NAME});
+ my $fn_name = $d->{NAME};
+
+ $fn_name =~ s/^$interface->{NAME}_//;
+ $fn_name =~ s/^$basename\_//;
+
+ $self->pidl("{ \"$fn_name\", (PyCFunction)py_$d->{NAME}, METH_VARARGS|METH_KEYWORDS, NULL },");
+ }
+ $self->pidl("{ NULL, NULL, 0, NULL }");
+ $self->deindent;
+ $self->pidl("};");
+ $self->pidl("");
+
+ $self->pidl("static void interface_$interface->{NAME}_dealloc(PyObject* self)");
+ $self->pidl("{");
+ $self->indent;
+ $self->pidl("$interface->{NAME}_InterfaceObject *interface = ($interface->{NAME}_InterfaceObject *)self;");
+ $self->pidl("talloc_free(interface->pipe);");
+ $self->pidl("PyObject_Del(self);");
+ $self->deindent;
+ $self->pidl("}");
+ $self->pidl("");
+
+ $self->pidl("static PyObject *interface_$interface->{NAME}_getattr(PyObject *obj, char *name)");
+ $self->pidl("{");
+ $self->indent;
+ $self->pidl("return Py_FindMethod(interface_$interface->{NAME}\_methods, obj, name);");
+ $self->deindent;
+ $self->pidl("}");
+
+ $self->pidl("");
+
+ $self->pidl("PyTypeObject $interface->{NAME}_InterfaceType = {");
+ $self->indent;
+ $self->pidl("PyObject_HEAD_INIT(NULL) 0,");
+ $self->pidl(".tp_name = \"$interface->{NAME}\",");
+ $self->pidl(".tp_basicsize = sizeof($interface->{NAME}_InterfaceObject),");
+ $self->pidl(".tp_dealloc = interface_$interface->{NAME}_dealloc,");
+ $self->pidl(".tp_getattr = interface_$interface->{NAME}_getattr,");
+ $self->deindent;
+ $self->pidl("};");
+
+ $self->pidl("");
+
+ $self->register_module_method($interface->{NAME}, "interface_$interface->{NAME}", "METH_VARARGS|METH_KEYWORDS", "NULL");
+ $self->pidl("static PyObject *interface_$interface->{NAME}(PyObject *self, PyObject *args, PyObject *kwargs)");
+ $self->pidl("{");
+ $self->indent;
+ $self->pidl("$interface->{NAME}_InterfaceObject *ret;");
+ $self->pidl("const char *binding_string;");
+ $self->pidl("struct cli_credentials *credentials;");
+ $self->pidl("struct loadparm_context *lp_ctx = NULL;");
+ $self->pidl("PyObject *py_lp_ctx = NULL, *py_credentials = Py_None;");
+ $self->pidl("TALLOC_CTX *mem_ctx = NULL;");
+ $self->pidl("NTSTATUS status;");
+ $self->pidl("");
+ $self->pidl("const char *kwnames[] = {");
+ $self->indent;
+ $self->pidl("\"binding\", \"lp_ctx\", \"credentials\", NULL");
+ $self->deindent;
+ $self->pidl("};");
+ $self->pidl("extern struct loadparm_context *lp_from_py_object(PyObject *py_obj);");
+ $self->pidl("extern struct cli_credentials *cli_credentials_from_py_object(PyObject *py_obj);");
+ $self->pidl("");
+ $self->pidl("if (!PyArg_ParseTupleAndKeywords(args, kwargs, \"sO|O:$interface->{NAME}\", discard_const_p(char *, kwnames), &binding_string, &py_lp_ctx, &py_credentials)) {");
+ $self->indent;
+ $self->pidl("return NULL;");
+ $self->deindent;
+ $self->pidl("}");
+ $self->pidl("");
+ $self->pidl("if (py_lp_ctx != NULL) {");
+ $self->indent;
+ $self->pidl("lp_ctx = lp_from_py_object(py_lp_ctx);");
+ $self->pidl("if (lp_ctx == NULL) {");
+ $self->indent;
+ $self->pidl("PyErr_SetString(PyExc_TypeError, \"Expected loadparm context\");");
+ $self->pidl("return NULL;");
+ $self->deindent;
+ $self->pidl("}");
+ $self->deindent;
+ $self->pidl("}");
+ $self->pidl("");
+
+ $self->pidl("credentials = cli_credentials_from_py_object(py_credentials);");
+ $self->pidl("if (credentials == NULL) {");
+ $self->indent;
+ $self->pidl("PyErr_SetString(PyExc_TypeError, \"Expected credentials\");");
+ $self->pidl("return NULL;");
+ $self->deindent;
+ $self->pidl("}");
+
+ $self->pidl("ret = PyObject_New($interface->{NAME}_InterfaceObject, &$interface->{NAME}_InterfaceType);");
+ $self->pidl("");
+
+ $self->pidl("status = dcerpc_pipe_connect(NULL, &ret->pipe, binding_string, ");
+ $self->pidl(" &ndr_table_$interface->{NAME}, credentials, NULL, lp_ctx);");
+ $self->handle_ntstatus("status", "NULL", "mem_ctx");
+
+ $self->pidl("ret->pipe->conn->flags |= DCERPC_NDR_REF_ALLOC;");
+
+ $self->pidl("return (PyObject *)ret;");
+ $self->deindent;
+ $self->pidl("}");
+
+ $self->pidl("");
}
- $self->pidl("static PyMethodDef interface_$interface->{NAME}\_methods[] = {");
- $self->indent;
- foreach my $d (@{$interface->{FUNCTIONS}}) {
- next if not defined($d->{OPNUM});
- next if has_property($d, "nopython");
+ $self->pidl_hdr("\n");
+ $self->pidl_hdr("#endif /* _HEADER_NDR_$interface->{NAME} */\n");
+}
- my $fn_name = $d->{NAME};
+sub register_module_method($$$$$)
+{
+ my ($self, $fn_name, $pyfn_name, $flags, $doc) = @_;
- $fn_name =~ s/^$interface->{NAME}_//;
+ push (@{$self->{module_methods}}, [$fn_name, $pyfn_name, $flags, $doc])
+}
- $self->pidl("{ \"$fn_name\", (PyCFunction)py_$d->{NAME}, METH_VARARGS|METH_KEYWORDS, NULL },");
+sub assign($$$)
+{
+ my ($self, $dest, $src) = @_;
+ if ($dest =~ /^\&/) {
+ $self->pidl("memcpy($dest, $src, sizeof(" . get_value_of($dest) . "));");
+ } else {
+ $self->pidl("$dest = $src;");
}
- $self->pidl("{ NULL, NULL, 0, NULL }");
- $self->deindent;
- $self->pidl("};");
- $self->pidl("");
+}
- $self->pidl("static void interface_$interface->{NAME}_dealloc(PyObject* self)");
- $self->pidl("{");
- $self->indent;
- $self->pidl("$interface->{NAME}_InterfaceObject *interface = ($interface->{NAME}_InterfaceObject *)self;");
- $self->pidl("talloc_free(interface->pipe);");
- $self->pidl("PyObject_Del(self);");
- $self->deindent;
- $self->pidl("}");
- $self->pidl("");
+sub ConvertObjectFromPythonData($$$$$$)
+{
+ my ($self, $mem_ctx, $cvar, $ctype, $target, $fail) = @_;
- $self->pidl("static PyObject *interface_$interface->{NAME}_getattr(PyTypeObject *obj, char *name)");
- $self->pidl("{");
- $self->indent;
- $self->pidl("return Py_FindMethod(interface_$interface->{NAME}\_methods, (PyObject *)obj, name);");
- $self->deindent;
- $self->pidl("}");
+ die("undef type for $cvar") unless(defined($ctype));
- $self->pidl("");
+ $ctype = resolveType($ctype);
- $self->pidl("static PyTypeObject $interface->{NAME}_InterfaceType = {");
- $self->indent;
- $self->pidl("PyObject_HEAD_INIT(NULL) 0,");
- $self->pidl(".tp_name = \"$interface->{NAME}\",");
- $self->pidl(".tp_basicsize = sizeof($interface->{NAME}_InterfaceObject),");
- $self->pidl(".tp_dealloc = interface_$interface->{NAME}_dealloc,");
- $self->pidl(".tp_getattr = interface_$interface->{NAME}_getattr,");
- $self->deindent;
- $self->pidl("};");
+ my $actual_ctype = $ctype;
+ if ($ctype->{TYPE} eq "TYPEDEF") {
+ $actual_ctype = $ctype->{DATA};
+ }
- $self->pidl("");
+ if ($actual_ctype->{TYPE} eq "ENUM" or $actual_ctype->{TYPE} eq "BITMAP" or
+ $actual_ctype->{TYPE} eq "SCALAR" and (
+ expandAlias($actual_ctype->{NAME}) =~ /^(u?int[0-9]*|hyper|NTTIME|time_t|NTTIME_hyper|NTTIME_1sec|dlong|udlong|udlongr)$/)) {
+ $self->pidl("PY_CHECK_TYPE(PyInt, $cvar, $fail);");
+ $self->pidl("$target = PyInt_AsLong($cvar);");
+ return;
+ }
- $self->pidl("static PyObject *interface_$interface->{NAME}(PyObject *self, PyObject *args)");
- $self->pidl("{");
- $self->indent;
- $self->pidl("$interface->{NAME}_InterfaceObject *ret;");
- $self->pidl("const char *binding_string;");
- $self->pidl("struct cli_credentials *credentials;");
- $self->pidl("struct loadparm_context *lp_ctx;");
- $self->pidl("NTSTATUS status;");
- $self->pidl("");
+ if ($actual_ctype->{TYPE} eq "STRUCT") {
+ $self->pidl("PY_CHECK_TYPE($ctype->{NAME}, $cvar, $fail);");
+ $self->assign($target, "py_talloc_get_ptr($cvar)");
+ return;
+ }
- # FIXME: Arguments: binding string, credentials, loadparm context
- $self->pidl("ret = PyObject_New($interface->{NAME}_InterfaceObject, &$interface->{NAME}_InterfaceType);");
- $self->pidl("");
+ if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "DATA_BLOB") {
+ $self->pidl("$target = data_blob_talloc($mem_ctx, PyString_AsString($cvar), PyString_Size($cvar));");
+ return;
+ }
- $self->pidl("status = dcerpc_pipe_connect(NULL, &ret->pipe, binding_string, ");
- $self->pidl(" &ndr_table_$interface->{NAME}, credentials, NULL, lp_ctx);");
- $self->handle_ntstatus("status", "NULL");
+ if ($actual_ctype->{TYPE} eq "SCALAR" and
+ ($actual_ctype->{NAME} eq "string" or $actual_ctype->{NAME} eq "nbt_string" or $actual_ctype->{NAME} eq "nbt_name" or $actual_ctype->{NAME} eq "wrepl_nbt_name")) {
+ $self->pidl("$target = talloc_strdup($mem_ctx, PyString_AsString($cvar));");
+ return;
+ }
- $self->pidl("return (PyObject *)ret;");
- $self->deindent;
- $self->pidl("}");
+ if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "ipv4address") {
+ $self->pidl("$target = PyString_AsString($cvar);");
+ return;
+ }
+
+
+ if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "NTSTATUS") {
+ $self->pidl("$target = NT_STATUS(PyInt_AsLong($cvar));");
+ return;
+ }
+
+ if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "WERROR") {
+ $self->pidl("$target = W_ERROR(PyInt_AsLong($cvar));");
+ return;
+ }
+
+ if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "string_array") {
+ $self->pidl("$target = PyCObject_AsVoidPtr($cvar);");
+ return;
+ }
+
+ if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "pointer") {
+ $self->assign($target, "PyCObject_AsVoidPtr($cvar)");
+ return;
+ }
+
+ die("unknown type ".mapTypeName($ctype) . ": $cvar");
+
+}
+
+sub ConvertObjectFromPythonLevel($$$$$$$$)
+{
+ my ($self, $env, $mem_ctx, $py_var, $e, $l, $var_name, $fail) = @_;
+ my $nl = GetNextLevel($e, $l);
+
+ if ($l->{TYPE} eq "POINTER") {
+ if ($nl->{TYPE} eq "DATA" and Parse::Pidl::Typelist::scalar_is_reference($nl->{DATA_TYPE})) {
+ $self->ConvertObjectFromPythonLevel($env, $mem_ctx, $py_var, $e, $nl, $var_name, $fail);
+ return;
+ }
+ if ($l->{POINTER_TYPE} ne "ref") {
+ $self->pidl("if ($py_var == Py_None) {");
+ $self->indent;
+ $self->pidl("$var_name = NULL;");
+ $self->deindent;
+ $self->pidl("} else {");
+ $self->indent;
+ }
+ $self->pidl("$var_name = talloc_ptrtype($mem_ctx, $var_name);");
+ $self->ConvertObjectFromPythonLevel($env, $mem_ctx, $py_var, $e, $nl, get_value_of($var_name), $fail);
+ if ($l->{POINTER_TYPE} ne "ref") {
+ $self->deindent;
+ $self->pidl("}");
+ }
+ } elsif ($l->{TYPE} eq "ARRAY") {
+ my $pl = GetPrevLevel($e, $l);
+ if ($pl && $pl->{TYPE} eq "POINTER") {
+ $var_name = get_pointer_to($var_name);
+ }
+
+ if (is_charset_array($e, $l)) {
+ $self->pidl("PY_CHECK_TYPE(PyUnicode, $py_var, $fail);");
+ # FIXME: Use Unix charset setting rather than utf-8
+ $self->pidl($var_name . " = PyString_AsString(PyUnicode_AsEncodedString($py_var, \"utf-8\", \"ignore\"));");
+ } else {
+ my $counter = "$e->{NAME}_cntr_$l->{LEVEL_INDEX}";
+ $self->pidl("PY_CHECK_TYPE(PyList, $py_var, $fail);");
+ $self->pidl("{");
+ $self->indent;
+ $self->pidl("int $counter;");
+ if (!$l->{IS_FIXED}) {
+ $self->pidl("$var_name = talloc_array_ptrtype($mem_ctx, $var_name, PyList_Size($py_var));");
+ }
+ $self->pidl("for ($counter = 0; $counter < PyList_Size($py_var); $counter++) {");
+ $self->indent;
+ $self->ConvertObjectFromPythonLevel($env, $var_name, "PyList_GetItem($py_var, $counter)", $e, GetNextLevel($e, $l), $var_name."[$counter]", $fail);
+ $self->deindent;
+ $self->pidl("}");
+ $self->deindent;
+ $self->pidl("}");
+ }
+ } elsif ($l->{TYPE} eq "DATA") {
+
+ if (not Parse::Pidl::Typelist::is_scalar($l->{DATA_TYPE})) {
+ $var_name = get_pointer_to($var_name);
+ }
+ $self->ConvertObjectFromPythonData($mem_ctx, $py_var, $l->{DATA_TYPE}, $var_name, $fail);
+ } elsif ($l->{TYPE} eq "SWITCH") {
+ $var_name = get_pointer_to($var_name);
+ my $switch = ParseExpr($l->{SWITCH_IS}, $env, $e);
+ $self->assign($var_name, "py_export_" . GetNextLevel($e, $l)->{DATA_TYPE} . "($mem_ctx, $switch, $py_var)");
+ } elsif ($l->{TYPE} eq "SUBCONTEXT") {
+ $self->ConvertObjectFromPythonLevel($env, $mem_ctx, $py_var, $e, GetNextLevel($e, $l), $var_name, $fail);
+ } else {
+ die("unknown level type $l->{TYPE}");
+ }
+}
+
+sub ConvertObjectFromPython($$$$$$$)
+{
+ my ($self, $env, $mem_ctx, $ctype, $cvar, $target, $fail) = @_;
+
+ $self->ConvertObjectFromPythonLevel($env, $mem_ctx, $cvar, $ctype, $ctype->{LEVELS}[0], $target, $fail);
+}
+
+sub ConvertScalarToPython($$$)
+{
+ my ($self, $ctypename, $cvar) = @_;
+
+ die("expected string for $cvar, not $ctypename") if (ref($ctypename) eq "HASH");
+
+ $ctypename = expandAlias($ctypename);
+
+ if ($ctypename =~ /^(char|u?int[0-9]*|hyper|dlong|udlong|udlongr|time_t|NTTIME_hyper|NTTIME|NTTIME_1sec)$/) {
+ return "PyInt_FromLong($cvar)";
+ }
+
+ if ($ctypename eq "DATA_BLOB") {
+ return "PyString_FromStringAndSize((char *)($cvar).data, ($cvar).length)";
+ }
+
+ if ($ctypename eq "NTSTATUS") {
+ return "PyInt_FromLong(NT_STATUS_V($cvar))";
+ }
+
+ if ($ctypename eq "WERROR") {
+ return "PyInt_FromLong(W_ERROR_V($cvar))";
+ }
+
+ if (($ctypename eq "string" or $ctypename eq "nbt_string" or $ctypename eq "nbt_name" or $ctypename eq "wrepl_nbt_name")) {
+ return "PyString_FromString($cvar)";
+ }
+
+ # Not yet supported
+ if ($ctypename eq "string_array") { return "PyCObject_FromVoidPtr($cvar)"; }
+ if ($ctypename eq "ipv4address") { return "PyString_FromString($cvar)"; }
+ if ($ctypename eq "pointer") {
+ return "PyCObject_FromVoidPtr($cvar, talloc_free)";
+ }
+
+ die("Unknown scalar type $ctypename");
+}
+
+sub ConvertObjectToPythonData($$$$$)
+{
+ my ($self, $mem_ctx, $ctype, $cvar) = @_;
+
+ die("undef type for $cvar") unless(defined($ctype));
+
+ $ctype = resolveType($ctype);
+
+ my $actual_ctype = $ctype;
+ if ($ctype->{TYPE} eq "TYPEDEF") {
+ $actual_ctype = $ctype->{DATA};
+ }
- $self->pidl("");
+ if ($actual_ctype->{TYPE} eq "ENUM") {
+ return $self->ConvertScalarToPython(Parse::Pidl::Typelist::enum_type_fn($actual_ctype), $cvar);
+ } elsif ($actual_ctype->{TYPE} eq "BITMAP") {
+ return $self->ConvertScalarToPython(Parse::Pidl::Typelist::bitmap_type_fn($actual_ctype), $cvar);
+ } elsif ($actual_ctype->{TYPE} eq "SCALAR") {
+ return $self->ConvertScalarToPython($actual_ctype->{NAME}, $cvar);
+ } elsif ($actual_ctype->{TYPE} eq "STRUCT") {
+ return "py_talloc_import_ex(&$ctype->{NAME}_Type, $mem_ctx, $cvar)";
+ }
- $self->pidl_hdr("\n");
- $self->pidl_hdr("#endif /* _HEADER_NDR_$interface->{NAME} */\n");
+ die("unknown type ".mapTypeName($ctype) . ": $cvar");
}
-sub Parse($$$$)
+sub ConvertObjectToPythonLevel($$$$$)
{
- my($self,$basename,$ndr,$hdr) = @_;
+ my ($self, $mem_ctx, $env, $e, $l, $var_name, $py_var) = @_;
+ my $nl = GetNextLevel($e, $l);
+
+ if ($l->{TYPE} eq "POINTER") {
+ if ($nl->{TYPE} eq "DATA" and Parse::Pidl::Typelist::scalar_is_reference($nl->{DATA_TYPE})) {
+ $self->ConvertObjectToPythonLevel($var_name, $env, $e, $nl, $var_name, $py_var);
+ return;
+ }
+ if ($l->{POINTER_TYPE} ne "ref") {
+ $self->pidl("if ($var_name == NULL) {");
+ $self->indent;
+ $self->pidl("$py_var = Py_None;");
+ $self->deindent;
+ $self->pidl("} else {");
+ $self->indent;
+ }
+ $self->ConvertObjectToPythonLevel($var_name, $env, $e, $nl, get_value_of($var_name), $py_var);
+ if ($l->{POINTER_TYPE} ne "ref") {
+ $self->deindent;
+ $self->pidl("}");
+ }
+ } elsif ($l->{TYPE} eq "ARRAY") {
+ if (is_charset_array($e, $l)) {
+ $var_name = get_pointer_to($var_name);
+ # FIXME: Use Unix charset setting rather than utf-8
+ $self->pidl("$py_var = PyUnicode_Decode($var_name, strlen($var_name), \"utf-8\", \"ignore\");");
+ } else {
+ my $pl = GetPrevLevel($e, $l);
+ if ($pl && $pl->{TYPE} eq "POINTER") {
+ $var_name = get_pointer_to($var_name);
+ }
+
+ die("No SIZE_IS for array $var_name") unless (defined($l->{SIZE_IS}));
+ my $length = $l->{SIZE_IS};
+ if (defined($l->{LENGTH_IS})) {
+ $length = $l->{LENGTH_IS};
+ }
+
+ $length = ParseExpr($length, $env, $e);
+ $self->pidl("$py_var = PyList_New($length);");
+ $self->pidl("{");
+ $self->indent;
+ my $counter = "$e->{NAME}_cntr_$l->{LEVEL_INDEX}";
+ $self->pidl("int $counter;");
+ $self->pidl("for ($counter = 0; $counter < $length; $counter++) {");
+ $self->indent;
+ my $member_var = "py_$e->{NAME}_$l->{LEVEL_INDEX}";
+ $self->pidl("PyObject *$member_var;");
+ $self->ConvertObjectToPythonLevel($var_name, $env, $e, GetNextLevel($e, $l), $var_name."[$counter]", $member_var);
+ $self->pidl("PyList_SetItem($py_var, $counter, $member_var);");
+ $self->deindent;
+ $self->pidl("}");
+ $self->deindent;
+ $self->pidl("}");
+ }
+ } elsif ($l->{TYPE} eq "SWITCH") {
+ $var_name = get_pointer_to($var_name);
+ my $switch = ParseExpr($l->{SWITCH_IS}, $env, $e);
+ $self->pidl("$py_var = py_import_" . GetNextLevel($e, $l)->{DATA_TYPE} . "($mem_ctx, $switch, $var_name);");
+ } elsif ($l->{TYPE} eq "DATA") {
+ if (not Parse::Pidl::Typelist::is_scalar($l->{DATA_TYPE})) {
+ $var_name = get_pointer_to($var_name);
+ }
+ my $conv = $self->ConvertObjectToPythonData($mem_ctx, $l->{DATA_TYPE}, $var_name);
+ $self->pidl("$py_var = $conv;");
+ } elsif ($l->{TYPE} eq "SUBCONTEXT") {
+ $self->ConvertObjectToPythonLevel($mem_ctx, $env, $e, GetNextLevel($e, $l), $var_name, $py_var);
+ } else {
+ die("Unknown level type $l->{TYPE} $var_name");
+ }
+}
+
+sub ConvertObjectToPython($$$$$$)
+{
+ my ($self, $mem_ctx, $env, $ctype, $cvar, $py_var) = @_;
+
+ $self->ConvertObjectToPythonLevel($mem_ctx, $env, $ctype, $ctype->{LEVELS}[0], $cvar, $py_var);
+}
+
+sub Parse($$$$$)
+{
+ my($self,$basename,$ndr,$ndr_hdr,$hdr) = @_;
my $py_hdr = $hdr;
$py_hdr =~ s/ndr_([^\/]+)$/py_$1/g;
@@ -299,33 +899,24 @@ sub Parse($$$$)
#include \"includes.h\"
#include <Python.h>
#include \"librpc/rpc/dcerpc.h\"
+#include \"scripting/python/pytalloc.h\"
+#include \"scripting/python/pyrpc.h\"
#include \"$hdr\"
+#include \"$ndr_hdr\"
#include \"$py_hdr\"
");
foreach my $x (@$ndr) {
- ($x->{TYPE} eq "INTERFACE") && $self->Interface($x);
($x->{TYPE} eq "IMPORT") && $self->Import(@{$x->{PATHS}});
+ ($x->{TYPE} eq "INTERFACE") && $self->Interface($x, $basename);
}
$self->pidl("static PyMethodDef $basename\_methods[] = {");
$self->indent;
- foreach my $x (@$ndr) {
- next if ($x->{TYPE} ne "INTERFACE");
- $self->pidl("{ \"$x->{NAME}\", (PyCFunction)interface_$x->{NAME}, METH_VARARGS|METH_KEYWORDS, NULL },");
-
- foreach my $d (@{$x->{TYPES}}) {
- next if has_property($d, "nopython");
- next if ($d->{TYPE} eq "ENUM" or $d->{TYPE} eq "BITMAP");
-
- my $fn_name = $d->{NAME};
-
- $fn_name =~ s/^$x->{NAME}_//;
- $fn_name =~ s/^$basename\_//;
-
- $self->pidl("{ \"$fn_name\", (PyCFunction)py_$d->{NAME}, METH_VARARGS|METH_KEYWORDS, NULL },");
- }
+ foreach (@{$self->{module_methods}}) {
+ my ($fn_name, $pyfn_name, $flags, $doc) = @$_;
+ $self->pidl("{ \"$fn_name\", (PyCFunction)$pyfn_name, $flags, $doc },");
}
$self->pidl("{ NULL, NULL, 0, NULL }");
@@ -339,9 +930,18 @@ sub Parse($$$$)
$self->indent;
$self->pidl("PyObject *m;");
$self->pidl("m = Py_InitModule(\"$basename\", $basename\_methods);");
- foreach (keys %{$self->{constants}}) {
- # FIXME: Handle non-string constants
- $self->pidl("PyModule_AddObject(m, \"$_\", PyString_FromString(" . $self->{constants}->{$_}->[1] . "));");
+ foreach my $name (keys %{$self->{constants}}) {
+ my $py_obj;
+ my ($ctype, $cvar) = @{$self->{constants}->{$name}};
+ if ($cvar =~ /^[0-9]+$/ or $cvar =~ /^0x[0-9a-fA-F]+$/) {
+ $py_obj = "PyInt_FromLong($cvar)";
+ } elsif ($cvar =~ /^".*"$/) {
+ $py_obj = "PyString_FromString($cvar)";
+ } else {
+ $py_obj = $self->ConvertObjectToPythonData("NULL", expandAlias($ctype), $cvar);
+ }
+
+ $self->pidl("PyModule_AddObject(m, \"$name\", $py_obj);");
}
$self->deindent;
$self->pidl("}");
diff --git a/source4/pidl/lib/Parse/Pidl/Typelist.pm b/source4/pidl/lib/Parse/Pidl/Typelist.pm
index b2069c784b..8ba1ae47af 100644
--- a/source4/pidl/lib/Parse/Pidl/Typelist.pm
+++ b/source4/pidl/lib/Parse/Pidl/Typelist.pm
@@ -7,9 +7,9 @@ package Parse::Pidl::Typelist;
require Exporter;
@ISA = qw(Exporter);
-@EXPORT_OK = qw(hasType getType mapTypeName scalar_is_reference expandAlias
+@EXPORT_OK = qw(hasType getType resolveType mapTypeName scalar_is_reference expandAlias
mapScalarType addType typeIs is_scalar enum_type_fn
- bitmap_type_fn mapType
+ bitmap_type_fn mapType typeHasBody
);
use vars qw($VERSION);
$VERSION = '0.01';
@@ -59,6 +59,7 @@ my %aliases = (
"boolean8" => "uint8",
"boolean32" => "uint32",
"DWORD" => "uint32",
+ "uint" => "uint32",
"int" => "int32",
"WORD" => "uint16",
"char" => "uint8",
@@ -95,6 +96,20 @@ sub addType($)
$types{$t->{NAME}} = $t;
}
+sub resolveType($)
+{
+ my ($ctype) = @_;
+
+ if (not hasType($ctype)) {
+ # assume struct typedef
+ return { TYPE => "TYPEDEF", NAME => $ctype, DATA => { TYPE => "STRUCT" } };
+ } else {
+ return getType($ctype);
+ }
+
+ return $ctype;
+}
+
sub getType($)
{
my $t = shift;
@@ -135,11 +150,12 @@ sub is_scalar($)
sub is_scalar($);
my $type = shift;
- return 1 if (ref($type) eq "HASH" and $type->{TYPE} eq "SCALAR");
+ return 1 if (ref($type) eq "HASH" and
+ ($type->{TYPE} eq "SCALAR" or $type->{TYPE} eq "ENUM" or
+ $type->{TYPE} eq "BITMAP"));
if (my $dt = getType($type)) {
- return is_scalar($dt->{DATA}) if ($dt->{TYPE} eq "TYPEDEF" or
- $dt->{TYPE} eq "DECLARE");
+ return is_scalar($dt->{DATA}) if ($dt->{TYPE} eq "TYPEDEF");
return 1 if ($dt->{TYPE} eq "SCALAR" or $dt->{TYPE} eq "ENUM" or
$dt->{TYPE} eq "BITMAP");
}
@@ -150,7 +166,7 @@ sub is_scalar($)
sub scalar_is_reference($)
{
my $name = shift;
-
+
return 1 if (grep(/^$name$/, @reference_scalars));
return 0;
}
@@ -208,13 +224,25 @@ sub bitmap_type_fn($)
return "uint32";
}
+sub typeHasBody($)
+{
+ sub typeHasBody($);
+ my ($e) = @_;
+
+ if ($e->{TYPE} eq "TYPEDEF") {
+ return 0 unless(defined($e->{DATA}));
+ return typeHasBody($e->{DATA});
+ }
+
+ return defined($e->{ELEMENTS});
+}
+
sub mapType($$)
{
sub mapType($$);
my ($t, $n) = @_;
return mapType($t->{DATA}, $n) if ($t->{TYPE} eq "TYPEDEF");
- return mapType($t->{DATA}, $n) if ($t->{TYPE} eq "DECLARE");
return mapScalarType($n) if ($t->{TYPE} eq "SCALAR");
return "enum $n" if ($t->{TYPE} eq "ENUM");
return "struct $n" if ($t->{TYPE} eq "STRUCT");
@@ -240,7 +268,7 @@ sub mapTypeName($)
sub LoadIdl($)
{
- my $idl = shift;
+ my ($idl) = @_;
foreach my $x (@{$idl}) {
next if $x->{TYPE} ne "INTERFACE";
@@ -248,7 +276,6 @@ sub LoadIdl($)
foreach my $y (@{$x->{DATA}}) {
addType($y) if (
$y->{TYPE} eq "TYPEDEF"
- or $y->{TYPE} eq "DECLARE"
or $y->{TYPE} eq "UNION"
or $y->{TYPE} eq "STRUCT"
or $y->{TYPE} eq "ENUM"
@@ -257,6 +284,11 @@ sub LoadIdl($)
}
}
+sub GenerateTypeLib()
+{
+ return Parse::Pidl::Util::MyDumper(\%types);
+}
+
RegisterScalars();
1;
diff --git a/source4/pidl/pidl b/source4/pidl/pidl
index 4395df2020..220d62cd71 100755
--- a/source4/pidl/pidl
+++ b/source4/pidl/pidl
@@ -17,7 +17,7 @@ pidl - An IDL compiler written in Perl
pidl --help
-pidl [--outputdir[=OUTNAME]] [--includedir DIR...] [--parse-idl-tree] [--dump-idl-tree] [--dump-ndr-tree] [--header[=OUTPUT]] [--ejs[=OUTPUT]] [--python[=OUTPUT]] [--swig[=OUTPUT]] [--ndr-parser[=OUTPUT]] [--client] [--server] [--warn-compat] [--quiet] [--verbose] [--template] [--ws-parser[=OUTPUT]] [--diff] [--dump-idl] [--tdr-parser[=OUTPUT]] [--samba3-ndr-client[=OUTPUT]] [--samba3-ndr-server[=OUTPUT]] [<idlfile>.idl]...
+pidl [--outputdir[=OUTNAME]] [--includedir DIR...] [--parse-idl-tree] [--dump-idl-tree] [--dump-ndr-tree] [--header[=OUTPUT]] [--ejs[=OUTPUT]] [--python[=OUTPUT]] [--swig[=OUTPUT]] [--ndr-parser[=OUTPUT]] [--client] [--server] [--warn-compat] [--quiet] [--verbose] [--template] [--ws-parser[=OUTPUT]] [--diff] [--dump-idl] [--tdr-parser[=OUTPUT]] [--samba3-ndr-client[=OUTPUT]] [--samba3-ndr-server[=OUTPUT]] [--typelib=[OUTPUT]] [<idlfile>.idl]...
=head1 DESCRIPTION
@@ -52,6 +52,10 @@ both marshalling/unmarshalling and debugging purposes).
=item I<--help>
Show list of available options.
+
+=item I<--version>
+
+Show pidl version
=item I<--outputdir OUTNAME>
@@ -88,6 +92,10 @@ Generate a C file and C header containing TDR parsers. The filename for
the parser defaults to tdr_OUTNAME.c. The header filename will be the
parser filename with the extension changed from .c to .h.
+=item I<--typelib>
+
+Write type information to the specified file.
+
=item I<--server>
Generate boilerplate for the RPC server that implements
@@ -399,7 +407,7 @@ use lib "$RealBin";
use lib "$RealBin/lib";
use Getopt::Long;
use File::Basename;
-use Parse::Pidl;
+use Parse::Pidl qw ( $VERSION );
use Parse::Pidl::Util;
#####################################################################
@@ -449,6 +457,7 @@ sub FileSave($$)
my(@opt_incdirs) = ();
my($opt_help) = 0;
+my($opt_version) = 0;
my($opt_parse_idl_tree) = 0;
my($opt_dump_idl_tree);
my($opt_dump_ndr_tree);
@@ -462,6 +471,7 @@ my($opt_samba3_ndr_client);
my($opt_samba3_ndr_server);
my($opt_template) = 0;
my($opt_client);
+my($opt_typelib);
my($opt_server);
my($opt_ndr_parser);
my($opt_tdr_parser);
@@ -478,7 +488,9 @@ my($opt_warn_compat) = 0;
# display help text
sub ShowHelp()
{
-print "perl IDL parser and code generator
+print "perl IDL parser and code generator\n";
+ShowVersion();
+print"
Copyright (C) Andrew Tridgell <tridge\@samba.org>
Copyright (C) Jelmer Vernooij <jelmer\@samba.org>
@@ -486,6 +498,7 @@ Usage: $Script [options] [--] <idlfile> [<idlfile>...]
Generic Options:
--help this help page
+ --version show pidl version
--outputdir=OUTDIR put output in OUTDIR/ [.]
--warn-compat warn about incompatibility with other compilers
--quiet be quiet
@@ -498,6 +511,7 @@ Debugging:
--dump-ndr-tree[=FILE] dump internal NDR data tree to file [BASENAME.ndr]
--dump-idl regenerate IDL file
--diff run diff on original IDL and dumped output
+ --typelib print type information
Samba 4 output:
--header[=OUTFILE] create generic header file [BASENAME.h]
@@ -522,9 +536,17 @@ Wireshark parsers:
exit(0);
}
+#########################################
+# Display version
+sub ShowVersion()
+{
+ print "perl IDL version $VERSION\n";
+}
+
# main program
my $result = GetOptions (
'help|h|?' => \$opt_help,
+ 'version' => \$opt_version,
'outputdir=s' => \$opt_outputdir,
'dump-idl' => \$opt_dump_idl,
'dump-idl-tree:s' => \$opt_dump_idl_tree,
@@ -534,6 +556,7 @@ my $result = GetOptions (
'samba3-ndr-server:s' => \$opt_samba3_ndr_server,
'header:s' => \$opt_header,
'server:s' => \$opt_server,
+ 'typelib:s' => \$opt_typelib,
'tdr-parser:s' => \$opt_tdr_parser,
'template' => \$opt_template,
'ndr-parser:s' => \$opt_ndr_parser,
@@ -558,6 +581,11 @@ if ($opt_help) {
exit(0);
}
+if ($opt_version) {
+ ShowVersion();
+ exit(0);
+}
+
sub process_file($)
{
my $idl_file = shift;
@@ -664,7 +692,8 @@ sub process_file($)
if (defined($opt_python)) {
require Parse::Pidl::Samba4::Python;
my $generator = new Parse::Pidl::Samba4::Python();
- my ($hdr,$prsr) = $generator->Parse($basename, $ndr, $h_filename);
+ my ($hdr,$prsr) = $generator->Parse($basename, $ndr,
+ "$outputdir/ndr_$basename\_c.h", $h_filename);
FileSave("$outputdir/py_$basename.c", $prsr);
FileSave("$outputdir/py_$basename.h", $hdr);
}
@@ -711,6 +740,12 @@ sub process_file($)
FileSave($tdr_header, $hdr);
}
+ if (defined($opt_typelib)) {
+ my $typelib = ($opt_typelib or "$outputdir/$basename.tlb");
+ require Parse::Pidl::Typelist;
+ FileSave($typelib, Parse::Pidl::Typelist::GenerateTypeLib());
+ }
+
if ($opt_template) {
require Parse::Pidl::Samba4::Template;
print Parse::Pidl::Samba4::Template::Parse($pidl);
diff --git a/source4/pidl/smb_interfaces.pm b/source4/pidl/smb_interfaces.pm
deleted file mode 100644
index c9cc4495b1..0000000000
--- a/source4/pidl/smb_interfaces.pm
+++ /dev/null
@@ -1,1272 +0,0 @@
-####################################################################
-#
-# This file was generated using Parse::Yapp version 1.05.
-#
-# Don't edit this file, use source file instead.
-#
-# ANY CHANGE MADE HERE WILL BE LOST !
-#
-####################################################################
-package smb_interfaces;
-use vars qw ( @ISA );
-use strict;
-
-@ISA= qw ( Parse::Yapp::Driver );
-#Included Parse/Yapp/Driver.pm file----------------------------------------
-{
-#
-# Module Parse::Yapp::Driver
-#
-# This module is part of the Parse::Yapp package available on your
-# nearest CPAN
-#
-# Any use of this module in a standalone parser make the included
-# text under the same copyright as the Parse::Yapp module itself.
-#
-# This notice should remain unchanged.
-#
-# (c) Copyright 1998-2001 Francois Desarmenien, all rights reserved.
-# (see the pod text in Parse::Yapp module for use and distribution rights)
-#
-
-package Parse::Yapp::Driver;
-
-require 5.004;
-
-use strict;
-
-use vars qw ( $VERSION $COMPATIBLE $FILENAME );
-
-$VERSION = '1.05';
-$COMPATIBLE = '0.07';
-$FILENAME=__FILE__;
-
-use Carp;
-
-#Known parameters, all starting with YY (leading YY will be discarded)
-my(%params)=(YYLEX => 'CODE', 'YYERROR' => 'CODE', YYVERSION => '',
- YYRULES => 'ARRAY', YYSTATES => 'ARRAY', YYDEBUG => '');
-#Mandatory parameters
-my(@params)=('LEX','RULES','STATES');
-
-sub new {
- my($class)=shift;
- my($errst,$nberr,$token,$value,$check,$dotpos);
- my($self)={ ERROR => \&_Error,
- ERRST => \$errst,
- NBERR => \$nberr,
- TOKEN => \$token,
- VALUE => \$value,
- DOTPOS => \$dotpos,
- STACK => [],
- DEBUG => 0,
- CHECK => \$check };
-
- _CheckParams( [], \%params, \@_, $self );
-
- exists($$self{VERSION})
- and $$self{VERSION} < $COMPATIBLE
- and croak "Yapp driver version $VERSION ".
- "incompatible with version $$self{VERSION}:\n".
- "Please recompile parser module.";
-
- ref($class)
- and $class=ref($class);
-
- bless($self,$class);
-}
-
-sub YYParse {
- my($self)=shift;
- my($retval);
-
- _CheckParams( \@params, \%params, \@_, $self );
-
- if($$self{DEBUG}) {
- _DBLoad();
- $retval = eval '$self->_DBParse()';#Do not create stab entry on compile
- $@ and die $@;
- }
- else {
- $retval = $self->_Parse();
- }
- $retval
-}
-
-sub YYData {
- my($self)=shift;
-
- exists($$self{USER})
- or $$self{USER}={};
-
- $$self{USER};
-
-}
-
-sub YYErrok {
- my($self)=shift;
-
- ${$$self{ERRST}}=0;
- undef;
-}
-
-sub YYNberr {
- my($self)=shift;
-
- ${$$self{NBERR}};
-}
-
-sub YYRecovering {
- my($self)=shift;
-
- ${$$self{ERRST}} != 0;
-}
-
-sub YYAbort {
- my($self)=shift;
-
- ${$$self{CHECK}}='ABORT';
- undef;
-}
-
-sub YYAccept {
- my($self)=shift;
-
- ${$$self{CHECK}}='ACCEPT';
- undef;
-}
-
-sub YYError {
- my($self)=shift;
-
- ${$$self{CHECK}}='ERROR';
- undef;
-}
-
-sub YYSemval {
- my($self)=shift;
- my($index)= $_[0] - ${$$self{DOTPOS}} - 1;
-
- $index < 0
- and -$index <= @{$$self{STACK}}
- and return $$self{STACK}[$index][1];
-
- undef; #Invalid index
-}
-
-sub YYCurtok {
- my($self)=shift;
-
- @_
- and ${$$self{TOKEN}}=$_[0];
- ${$$self{TOKEN}};
-}
-
-sub YYCurval {
- my($self)=shift;
-
- @_
- and ${$$self{VALUE}}=$_[0];
- ${$$self{VALUE}};
-}
-
-sub YYExpect {
- my($self)=shift;
-
- keys %{$self->{STATES}[$self->{STACK}[-1][0]]{ACTIONS}}
-}
-
-sub YYLexer {
- my($self)=shift;
-
- $$self{LEX};
-}
-
-
-#################
-# Private stuff #
-#################
-
-
-sub _CheckParams {
- my($mandatory,$checklist,$inarray,$outhash)=@_;
- my($prm,$value);
- my($prmlst)={};
-
- while(($prm,$value)=splice(@$inarray,0,2)) {
- $prm=uc($prm);
- exists($$checklist{$prm})
- or croak("Unknow parameter '$prm'");
- ref($value) eq $$checklist{$prm}
- or croak("Invalid value for parameter '$prm'");
- $prm=unpack('@2A*',$prm);
- $$outhash{$prm}=$value;
- }
- for (@$mandatory) {
- exists($$outhash{$_})
- or croak("Missing mandatory parameter '".lc($_)."'");
- }
-}
-
-sub _Error {
- print "Parse error.\n";
-}
-
-sub _DBLoad {
- {
- no strict 'refs';
-
- exists(${__PACKAGE__.'::'}{_DBParse})#Already loaded ?
- and return;
- }
- my($fname)=__FILE__;
- my(@drv);
- open(DRV,"<$fname") or die "Report this as a BUG: Cannot open $fname";
- while(<DRV>) {
- /^\s*sub\s+_Parse\s*{\s*$/ .. /^\s*}\s*#\s*_Parse\s*$/
- and do {
- s/^#DBG>//;
- push(@drv,$_);
- }
- }
- close(DRV);
-
- $drv[0]=~s/_P/_DBP/;
- eval join('',@drv);
-}
-
-#Note that for loading debugging version of the driver,
-#this file will be parsed from 'sub _Parse' up to '}#_Parse' inclusive.
-#So, DO NOT remove comment at end of sub !!!
-sub _Parse {
- my($self)=shift;
-
- my($rules,$states,$lex,$error)
- = @$self{ 'RULES', 'STATES', 'LEX', 'ERROR' };
- my($errstatus,$nberror,$token,$value,$stack,$check,$dotpos)
- = @$self{ 'ERRST', 'NBERR', 'TOKEN', 'VALUE', 'STACK', 'CHECK', 'DOTPOS' };
-
-#DBG> my($debug)=$$self{DEBUG};
-#DBG> my($dbgerror)=0;
-
-#DBG> my($ShowCurToken) = sub {
-#DBG> my($tok)='>';
-#DBG> for (split('',$$token)) {
-#DBG> $tok.= (ord($_) < 32 or ord($_) > 126)
-#DBG> ? sprintf('<%02X>',ord($_))
-#DBG> : $_;
-#DBG> }
-#DBG> $tok.='<';
-#DBG> };
-
- $$errstatus=0;
- $$nberror=0;
- ($$token,$$value)=(undef,undef);
- @$stack=( [ 0, undef ] );
- $$check='';
-
- while(1) {
- my($actions,$act,$stateno);
-
- $stateno=$$stack[-1][0];
- $actions=$$states[$stateno];
-
-#DBG> print STDERR ('-' x 40),"\n";
-#DBG> $debug & 0x2
-#DBG> and print STDERR "In state $stateno:\n";
-#DBG> $debug & 0x08
-#DBG> and print STDERR "Stack:[".
-#DBG> join(',',map { $$_[0] } @$stack).
-#DBG> "]\n";
-
-
- if (exists($$actions{ACTIONS})) {
-
- defined($$token)
- or do {
- ($$token,$$value)=&$lex($self);
-#DBG> $debug & 0x01
-#DBG> and print STDERR "Need token. Got ".&$ShowCurToken."\n";
- };
-
- $act= exists($$actions{ACTIONS}{$$token})
- ? $$actions{ACTIONS}{$$token}
- : exists($$actions{DEFAULT})
- ? $$actions{DEFAULT}
- : undef;
- }
- else {
- $act=$$actions{DEFAULT};
-#DBG> $debug & 0x01
-#DBG> and print STDERR "Don't need token.\n";
- }
-
- defined($act)
- and do {
-
- $act > 0
- and do { #shift
-
-#DBG> $debug & 0x04
-#DBG> and print STDERR "Shift and go to state $act.\n";
-
- $$errstatus
- and do {
- --$$errstatus;
-
-#DBG> $debug & 0x10
-#DBG> and $dbgerror
-#DBG> and $$errstatus == 0
-#DBG> and do {
-#DBG> print STDERR "**End of Error recovery.\n";
-#DBG> $dbgerror=0;
-#DBG> };
- };
-
-
- push(@$stack,[ $act, $$value ]);
-
- $$token ne '' #Don't eat the eof
- and $$token=$$value=undef;
- next;
- };
-
- #reduce
- my($lhs,$len,$code,@sempar,$semval);
- ($lhs,$len,$code)=@{$$rules[-$act]};
-
-#DBG> $debug & 0x04
-#DBG> and $act
-#DBG> and print STDERR "Reduce using rule ".-$act." ($lhs,$len): ";
-
- $act
- or $self->YYAccept();
-
- $$dotpos=$len;
-
- unpack('A1',$lhs) eq '@' #In line rule
- and do {
- $lhs =~ /^\@[0-9]+\-([0-9]+)$/
- or die "In line rule name '$lhs' ill formed: ".
- "report it as a BUG.\n";
- $$dotpos = $1;
- };
-
- @sempar = $$dotpos
- ? map { $$_[1] } @$stack[ -$$dotpos .. -1 ]
- : ();
-
- $semval = $code ? &$code( $self, @sempar )
- : @sempar ? $sempar[0] : undef;
-
- splice(@$stack,-$len,$len);
-
- $$check eq 'ACCEPT'
- and do {
-
-#DBG> $debug & 0x04
-#DBG> and print STDERR "Accept.\n";
-
- return($semval);
- };
-
- $$check eq 'ABORT'
- and do {
-
-#DBG> $debug & 0x04
-#DBG> and print STDERR "Abort.\n";
-
- return(undef);
-
- };
-
-#DBG> $debug & 0x04
-#DBG> and print STDERR "Back to state $$stack[-1][0], then ";
-
- $$check eq 'ERROR'
- or do {
-#DBG> $debug & 0x04
-#DBG> and print STDERR
-#DBG> "go to state $$states[$$stack[-1][0]]{GOTOS}{$lhs}.\n";
-
-#DBG> $debug & 0x10
-#DBG> and $dbgerror
-#DBG> and $$errstatus == 0
-#DBG> and do {
-#DBG> print STDERR "**End of Error recovery.\n";
-#DBG> $dbgerror=0;
-#DBG> };
-
- push(@$stack,
- [ $$states[$$stack[-1][0]]{GOTOS}{$lhs}, $semval ]);
- $$check='';
- next;
- };
-
-#DBG> $debug & 0x04
-#DBG> and print STDERR "Forced Error recovery.\n";
-
- $$check='';
-
- };
-
- #Error
- $$errstatus
- or do {
-
- $$errstatus = 1;
- &$error($self);
- $$errstatus # if 0, then YYErrok has been called
- or next; # so continue parsing
-
-#DBG> $debug & 0x10
-#DBG> and do {
-#DBG> print STDERR "**Entering Error recovery.\n";
-#DBG> ++$dbgerror;
-#DBG> };
-
- ++$$nberror;
-
- };
-
- $$errstatus == 3 #The next token is not valid: discard it
- and do {
- $$token eq '' # End of input: no hope
- and do {
-#DBG> $debug & 0x10
-#DBG> and print STDERR "**At eof: aborting.\n";
- return(undef);
- };
-
-#DBG> $debug & 0x10
-#DBG> and print STDERR "**Dicard invalid token ".&$ShowCurToken.".\n";
-
- $$token=$$value=undef;
- };
-
- $$errstatus=3;
-
- while( @$stack
- and ( not exists($$states[$$stack[-1][0]]{ACTIONS})
- or not exists($$states[$$stack[-1][0]]{ACTIONS}{error})
- or $$states[$$stack[-1][0]]{ACTIONS}{error} <= 0)) {
-
-#DBG> $debug & 0x10
-#DBG> and print STDERR "**Pop state $$stack[-1][0].\n";
-
- pop(@$stack);
- }
-
- @$stack
- or do {
-
-#DBG> $debug & 0x10
-#DBG> and print STDERR "**No state left on stack: aborting.\n";
-
- return(undef);
- };
-
- #shift the error token
-
-#DBG> $debug & 0x10
-#DBG> and print STDERR "**Shift \$error token and go to state ".
-#DBG> $$states[$$stack[-1][0]]{ACTIONS}{error}.
-#DBG> ".\n";
-
- push(@$stack, [ $$states[$$stack[-1][0]]{ACTIONS}{error}, undef ]);
-
- }
-
- #never reached
- croak("Error in driver logic. Please, report it as a BUG");
-
-}#_Parse
-#DO NOT remove comment
-
-1;
-
-}
-#End of include--------------------------------------------------
-
-
-
-
-sub new {
- my($class)=shift;
- ref($class)
- and $class=ref($class);
-
- my($self)=$class->SUPER::new( yyversion => '1.05',
- yystates =>
-[
- {#State 0
- ACTIONS => {
- 'UNION' => 5,
- 'ENUM' => 1,
- 'TYPEDEF' => 7,
- 'STRUCT' => 2
- },
- GOTOS => {
- 'struct' => 6,
- 'enum' => 9,
- 'typedef' => 8,
- 'union' => 10,
- 'definitions' => 3,
- 'definition' => 4
- }
- },
- {#State 1
- ACTIONS => {
- 'IDENTIFIER' => 11
- }
- },
- {#State 2
- ACTIONS => {
- 'IDENTIFIER' => 12
- },
- DEFAULT => -33,
- GOTOS => {
- 'optional_identifier' => 13
- }
- },
- {#State 3
- ACTIONS => {
- '' => 14,
- 'UNION' => 5,
- 'ENUM' => 1,
- 'TYPEDEF' => 7,
- 'STRUCT' => 2
- },
- GOTOS => {
- 'struct' => 6,
- 'typedef' => 8,
- 'enum' => 9,
- 'union' => 10,
- 'definition' => 15
- }
- },
- {#State 4
- DEFAULT => -1
- },
- {#State 5
- ACTIONS => {
- 'IDENTIFIER' => 12
- },
- DEFAULT => -33,
- GOTOS => {
- 'optional_identifier' => 16
- }
- },
- {#State 6
- DEFAULT => -3
- },
- {#State 7
- ACTIONS => {
- 'STRUCT' => 17
- }
- },
- {#State 8
- DEFAULT => -5
- },
- {#State 9
- DEFAULT => -6
- },
- {#State 10
- DEFAULT => -4
- },
- {#State 11
- ACTIONS => {
- "{" => 18
- }
- },
- {#State 12
- DEFAULT => -32
- },
- {#State 13
- ACTIONS => {
- "{" => 19
- }
- },
- {#State 14
- DEFAULT => 0
- },
- {#State 15
- DEFAULT => -2
- },
- {#State 16
- ACTIONS => {
- "{" => 20
- }
- },
- {#State 17
- ACTIONS => {
- "{" => 21
- }
- },
- {#State 18
- ACTIONS => {
- 'IDENTIFIER' => 22
- },
- GOTOS => {
- 'enum_identifiers' => 23,
- 'enum_identifier' => 24
- }
- },
- {#State 19
- DEFAULT => -15,
- GOTOS => {
- 'elements' => 25
- }
- },
- {#State 20
- DEFAULT => -15,
- GOTOS => {
- 'elements' => 26
- }
- },
- {#State 21
- DEFAULT => -15,
- GOTOS => {
- 'elements' => 27
- }
- },
- {#State 22
- ACTIONS => {
- "=" => 28
- },
- DEFAULT => -13
- },
- {#State 23
- ACTIONS => {
- "}" => 29,
- "," => 30
- }
- },
- {#State 24
- DEFAULT => -11
- },
- {#State 25
- ACTIONS => {
- "}" => 31,
- 'UNION' => 37,
- 'IDENTIFIER' => 33,
- 'ENUM' => 32,
- 'STRUCT' => 35,
- 'CONST' => 34
- },
- GOTOS => {
- 'struct' => 38,
- 'type' => 39,
- 'union' => 40,
- 'element' => 36
- }
- },
- {#State 26
- ACTIONS => {
- "}" => 41,
- 'UNION' => 37,
- 'IDENTIFIER' => 33,
- 'ENUM' => 32,
- 'STRUCT' => 35,
- 'CONST' => 34
- },
- GOTOS => {
- 'struct' => 38,
- 'type' => 39,
- 'union' => 40,
- 'element' => 36
- }
- },
- {#State 27
- ACTIONS => {
- "}" => 42,
- 'UNION' => 37,
- 'IDENTIFIER' => 33,
- 'ENUM' => 32,
- 'STRUCT' => 35,
- 'CONST' => 34
- },
- GOTOS => {
- 'struct' => 38,
- 'type' => 39,
- 'union' => 40,
- 'element' => 36
- }
- },
- {#State 28
- ACTIONS => {
- 'IDENTIFIER' => 43
- }
- },
- {#State 29
- ACTIONS => {
- ";" => 44
- }
- },
- {#State 30
- ACTIONS => {
- 'IDENTIFIER' => 22
- },
- GOTOS => {
- 'enum_identifier' => 45
- }
- },
- {#State 31
- DEFAULT => -28,
- GOTOS => {
- 'pointers' => 46
- }
- },
- {#State 32
- ACTIONS => {
- 'IDENTIFIER' => 47
- }
- },
- {#State 33
- DEFAULT => -26
- },
- {#State 34
- ACTIONS => {
- 'IDENTIFIER' => 33,
- 'ENUM' => 32
- },
- GOTOS => {
- 'type' => 48
- }
- },
- {#State 35
- ACTIONS => {
- 'IDENTIFIER' => 49
- },
- DEFAULT => -33,
- GOTOS => {
- 'optional_identifier' => 13
- }
- },
- {#State 36
- DEFAULT => -16
- },
- {#State 37
- ACTIONS => {
- 'IDENTIFIER' => 50
- },
- DEFAULT => -33,
- GOTOS => {
- 'optional_identifier' => 16
- }
- },
- {#State 38
- DEFAULT => -18
- },
- {#State 39
- DEFAULT => -28,
- GOTOS => {
- 'pointers' => 51
- }
- },
- {#State 40
- DEFAULT => -19
- },
- {#State 41
- DEFAULT => -28,
- GOTOS => {
- 'pointers' => 52
- }
- },
- {#State 42
- ACTIONS => {
- 'IDENTIFIER' => 12
- },
- DEFAULT => -33,
- GOTOS => {
- 'optional_identifier' => 53
- }
- },
- {#State 43
- DEFAULT => -14
- },
- {#State 44
- DEFAULT => -10
- },
- {#State 45
- DEFAULT => -12
- },
- {#State 46
- ACTIONS => {
- 'IDENTIFIER' => 12,
- "*" => 55
- },
- DEFAULT => -33,
- GOTOS => {
- 'optional_identifier' => 54,
- 'optional_identifiers' => 56
- }
- },
- {#State 47
- DEFAULT => -27
- },
- {#State 48
- DEFAULT => -28,
- GOTOS => {
- 'pointers' => 57
- }
- },
- {#State 49
- ACTIONS => {
- "{" => -32
- },
- DEFAULT => -28,
- GOTOS => {
- 'pointers' => 58
- }
- },
- {#State 50
- ACTIONS => {
- "{" => -32
- },
- DEFAULT => -28,
- GOTOS => {
- 'pointers' => 59
- }
- },
- {#State 51
- ACTIONS => {
- 'IDENTIFIER' => 60,
- "*" => 55
- }
- },
- {#State 52
- ACTIONS => {
- 'IDENTIFIER' => 12,
- "*" => 55
- },
- DEFAULT => -33,
- GOTOS => {
- 'optional_identifier' => 61
- }
- },
- {#State 53
- ACTIONS => {
- ";" => 62
- }
- },
- {#State 54
- DEFAULT => -30
- },
- {#State 55
- DEFAULT => -29
- },
- {#State 56
- ACTIONS => {
- ";" => 63,
- "," => 64
- }
- },
- {#State 57
- ACTIONS => {
- 'IDENTIFIER' => 65,
- "*" => 55
- }
- },
- {#State 58
- ACTIONS => {
- 'IDENTIFIER' => 66,
- "*" => 55
- }
- },
- {#State 59
- ACTIONS => {
- 'IDENTIFIER' => 67,
- "*" => 55
- }
- },
- {#State 60
- ACTIONS => {
- "[" => 69
- },
- DEFAULT => -24,
- GOTOS => {
- 'array' => 68
- }
- },
- {#State 61
- ACTIONS => {
- ";" => 70
- }
- },
- {#State 62
- DEFAULT => -9
- },
- {#State 63
- DEFAULT => -7
- },
- {#State 64
- ACTIONS => {
- 'IDENTIFIER' => 12
- },
- DEFAULT => -33,
- GOTOS => {
- 'optional_identifier' => 71
- }
- },
- {#State 65
- ACTIONS => {
- "[" => 69
- },
- DEFAULT => -24,
- GOTOS => {
- 'array' => 72
- }
- },
- {#State 66
- ACTIONS => {
- ";" => 73
- }
- },
- {#State 67
- ACTIONS => {
- ";" => 74
- }
- },
- {#State 68
- ACTIONS => {
- ";" => 75
- }
- },
- {#State 69
- ACTIONS => {
- 'CONSTANT' => 76
- }
- },
- {#State 70
- DEFAULT => -8
- },
- {#State 71
- DEFAULT => -31
- },
- {#State 72
- ACTIONS => {
- ";" => 77
- }
- },
- {#State 73
- DEFAULT => -20
- },
- {#State 74
- DEFAULT => -21
- },
- {#State 75
- DEFAULT => -23
- },
- {#State 76
- ACTIONS => {
- "]" => 78
- }
- },
- {#State 77
- DEFAULT => -22
- },
- {#State 78
- DEFAULT => -25
- }
-],
- yyrules =>
-[
- [#Rule 0
- '$start', 2, undef
- ],
- [#Rule 1
- 'definitions', 1,
-sub
-#line 14 "build/pidl/smb_interfaces.yp"
-{ [$_[1]] }
- ],
- [#Rule 2
- 'definitions', 2,
-sub
-#line 15 "build/pidl/smb_interfaces.yp"
-{ push(@{$_[1]}, $_[2]); $_[1] }
- ],
- [#Rule 3
- 'definition', 1, undef
- ],
- [#Rule 4
- 'definition', 1, undef
- ],
- [#Rule 5
- 'definition', 1, undef
- ],
- [#Rule 6
- 'definition', 1, undef
- ],
- [#Rule 7
- 'struct', 8,
-sub
-#line 26 "build/pidl/smb_interfaces.yp"
-{
- {
- "NAME" => $_[7],
- "STRUCT_NAME" => $_[2],
- "TYPE" => "struct",
- "DATA" => $_[4],
- }
- }
- ],
- [#Rule 8
- 'union', 8,
-sub
-#line 38 "build/pidl/smb_interfaces.yp"
-{
- {
- "NAME" => $_[7],
- "UNION_NAME" => $_[2],
- "TYPE" => "union",
- "DATA" => $_[4],
- }
- }
- ],
- [#Rule 9
- 'typedef', 7, undef
- ],
- [#Rule 10
- 'enum', 6, undef
- ],
- [#Rule 11
- 'enum_identifiers', 1, undef
- ],
- [#Rule 12
- 'enum_identifiers', 3, undef
- ],
- [#Rule 13
- 'enum_identifier', 1, undef
- ],
- [#Rule 14
- 'enum_identifier', 3, undef
- ],
- [#Rule 15
- 'elements', 0, undef
- ],
- [#Rule 16
- 'elements', 2,
-sub
-#line 65 "build/pidl/smb_interfaces.yp"
-{ push(@{$_[1]}, $_[2]); $_[1] }
- ],
- [#Rule 17
- 'element', 0, undef
- ],
- [#Rule 18
- 'element', 1, undef
- ],
- [#Rule 19
- 'element', 1, undef
- ],
- [#Rule 20
- 'element', 5,
-sub
-#line 72 "build/pidl/smb_interfaces.yp"
-{{
- "NAME" => [$_[2]],
- "POINTERS" => $_[3],
- "TYPE" => "struct $_[2]",
- }}
- ],
- [#Rule 21
- 'element', 5,
-sub
-#line 78 "build/pidl/smb_interfaces.yp"
-{{
- "NAME" => $_[2],
- "POINTERS" => $_[3],
- "TYPE" => "union $_[2]",
- }}
- ],
- [#Rule 22
- 'element', 6,
-sub
-#line 84 "build/pidl/smb_interfaces.yp"
-{{
- "NAME" => [$_[4]],
- "TYPE" => $_[2],
- "POINTERS" => $_[3],
- }}
- ],
- [#Rule 23
- 'element', 5,
-sub
-#line 90 "build/pidl/smb_interfaces.yp"
-{{
- "NAME" => [$_[3]],
- "TYPE" => $_[1],
- "POINTERS" => $_[2],
- "ARRAY_LENGTH" => $_[4]
- }}
- ],
- [#Rule 24
- 'array', 0, undef
- ],
- [#Rule 25
- 'array', 3,
-sub
-#line 99 "build/pidl/smb_interfaces.yp"
-{ int($_[2]) }
- ],
- [#Rule 26
- 'type', 1, undef
- ],
- [#Rule 27
- 'type', 2,
-sub
-#line 104 "build/pidl/smb_interfaces.yp"
-{ "enum $_[2]" }
- ],
- [#Rule 28
- 'pointers', 0, undef
- ],
- [#Rule 29
- 'pointers', 2,
-sub
-#line 109 "build/pidl/smb_interfaces.yp"
-{ $_[1]+1 }
- ],
- [#Rule 30
- 'optional_identifiers', 1,
-sub
-#line 112 "build/pidl/smb_interfaces.yp"
-{ [$_[1]] }
- ],
- [#Rule 31
- 'optional_identifiers', 3,
-sub
-#line 113 "build/pidl/smb_interfaces.yp"
-{ push(@{$_[1]}, $_[3]); $_[1] }
- ],
- [#Rule 32
- 'optional_identifier', 1, undef
- ],
- [#Rule 33
- 'optional_identifier', 0, undef
- ]
-],
- @_);
- bless($self,$class);
-}
-
-#line 119 "build/pidl/smb_interfaces.yp"
-
-
-#####################################################################
-# traverse a perl data structure removing any empty arrays or
-# hashes and any hash elements that map to undef
-sub CleanData($)
-{
- sub CleanData($);
- my($v) = shift;
- if (ref($v) eq "ARRAY") {
- foreach my $i (0 .. $#{$v}) {
- CleanData($v->[$i]);
- if (ref($v->[$i]) eq "ARRAY" && $#{$v->[$i]}==-1) {
- $v->[$i] = undef;
- next;
- }
- }
- # this removes any undefined elements from the array
- @{$v} = grep { defined $_ } @{$v};
- } elsif (ref($v) eq "HASH") {
- foreach my $x (keys %{$v}) {
- CleanData($v->{$x});
- if (!defined $v->{$x}) { delete($v->{$x}); next; }
- if (ref($v->{$x}) eq "ARRAY" && $#{$v->{$x}}==-1) { delete($v->{$x}); next; }
- }
- }
- return $v;
-}
-
-sub _Error {
- if (exists $_[0]->YYData->{ERRMSG}) {
- print $_[0]->YYData->{ERRMSG};
- delete $_[0]->YYData->{ERRMSG};
- return;
- };
- my $line = $_[0]->YYData->{LINE};
- my $last_token = $_[0]->YYData->{LAST_TOKEN};
- my $file = $_[0]->YYData->{INPUT_FILENAME};
-
- print "$file:$line: Syntax error near '$last_token'\n";
-}
-
-sub _Lexer($)
-{
- my($parser)=shift;
-
- $parser->YYData->{INPUT} or return('',undef);
-
-again:
- $parser->YYData->{INPUT} =~ s/^[ \t]*//;
-
- for ($parser->YYData->{INPUT}) {
- if (/^\#/) {
- if (s/^\# (\d+) \"(.*?)\"( \d+|)//) {
- $parser->YYData->{LINE} = $1-1;
- $parser->YYData->{INPUT_FILENAME} = $2;
- goto again;
- }
- if (s/^\#line (\d+) \"(.*?)\"( \d+|)//) {
- $parser->YYData->{LINE} = $1-1;
- $parser->YYData->{INPUT_FILENAME} = $2;
- goto again;
- }
- if (s/^(\#.*)$//m) {
- goto again;
- }
- }
- if (s/^(\n)//) {
- $parser->YYData->{LINE}++;
- goto again;
- }
- if (s/^\"(.*?)\"//) {
- $parser->YYData->{LAST_TOKEN} = $1;
- return('TEXT',$1);
- }
- if (s/^(\d+)(\W|$)/$2/) {
- $parser->YYData->{LAST_TOKEN} = $1;
- return('CONSTANT',$1);
- }
- if (s/^([\w_]+)//) {
- $parser->YYData->{LAST_TOKEN} = $1;
- if ($1 =~
- /^(const|typedef|union|struct|enum)$/x) {
- return uc($1);
- }
- return('IDENTIFIER',$1);
- }
- if (s/^(.)//s) {
- $parser->YYData->{LAST_TOKEN} = $1;
- return($1,$1);
- }
- }
-}
-
-sub parse($$)
-{
- my ($self,$filename) = @_;
-
- my $saved_delim = $/;
- undef $/;
- my $cpp = $ENV{CPP};
- if (! defined $cpp) {
- $cpp = "cpp"
- }
- my $data = `$cpp -D__PIDL__ -xc $filename`;
- $/ = $saved_delim;
-
- $self->YYData->{INPUT} = $data;
- $self->YYData->{LINE} = 0;
- $self->YYData->{LAST_TOKEN} = "NONE";
-
- my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
-
- return CleanData($idl);
-}
-
-1;
diff --git a/source4/pidl/smb_interfaces.yp b/source4/pidl/smb_interfaces.yp
deleted file mode 100644
index f8c34eacdc..0000000000
--- a/source4/pidl/smb_interfaces.yp
+++ /dev/null
@@ -1,233 +0,0 @@
-########################
-# Parse::Yapp parser for a C header file that contains only structures
-# or unions.
-
-# Copyright (C) 2005, Tim Potter <tpot@samba.org> released under the
-# GNU GPL version 2 or later
-
-################
-# grammar
-
-%%
-
-definitions:
- definition { [$_[1]] }
- | definitions definition { push(@{$_[1]}, $_[2]); $_[1] }
-;
-
-definition:
- struct
- | union
- | typedef
- | enum
-;
-
-struct: STRUCT optional_identifier '{' elements '}' pointers optional_identifiers ';'
- {
- {
- "NAME" => $_[7],
- "STRUCT_NAME" => $_[2],
- "TYPE" => "struct",
- "DATA" => $_[4],
- }
- }
-;
-
-union:
- UNION optional_identifier '{' elements '}' pointers optional_identifier ';'
- {
- {
- "NAME" => $_[7],
- "UNION_NAME" => $_[2],
- "TYPE" => "union",
- "DATA" => $_[4],
- }
- }
-;
-
-typedef:
- TYPEDEF STRUCT '{' elements '}' optional_identifier ';'
-;
-
-enum:
- ENUM IDENTIFIER '{' enum_identifiers '}' ';'
-;
-
-enum_identifiers: enum_identifier
- | enum_identifiers ',' enum_identifier
-;
-
-enum_identifier: IDENTIFIER
- | IDENTIFIER '=' IDENTIFIER
-;
-
-elements: #empty
- | elements element { push(@{$_[1]}, $_[2]); $_[1] }
-;
-
-element:
- | struct
- | union
- | STRUCT IDENTIFIER pointers IDENTIFIER ';'
- {{
- "NAME" => [$_[2]],
- "POINTERS" => $_[3],
- "TYPE" => "struct $_[2]",
- }}
- | UNION IDENTIFIER pointers IDENTIFIER ';'
- {{
- "NAME" => $_[2],
- "POINTERS" => $_[3],
- "TYPE" => "union $_[2]",
- }}
- | CONST type pointers IDENTIFIER array ';'
- {{
- "NAME" => [$_[4]],
- "TYPE" => $_[2],
- "POINTERS" => $_[3],
- }}
- | type pointers IDENTIFIER array ';'
- {{
- "NAME" => [$_[3]],
- "TYPE" => $_[1],
- "POINTERS" => $_[2],
- "ARRAY_LENGTH" => $_[4]
- }}
-;
-
-array: #empty
- | '[' CONSTANT ']' { int($_[2]) }
-;
-
-type: IDENTIFIER
- | ENUM IDENTIFIER
- { "enum $_[2]" }
-;
-
-pointers:
- #empty { 0 }
- | pointers '*' { $_[1]+1 }
-;
-
-optional_identifiers: optional_identifier { [$_[1]] }
- | optional_identifiers ',' optional_identifier { push(@{$_[1]}, $_[3]); $_[1] }
-;
-
-optional_identifier: IDENTIFIER | #empty { undef }
-;
-
-%%
-
-#####################################################################
-# traverse a perl data structure removing any empty arrays or
-# hashes and any hash elements that map to undef
-sub CleanData($)
-{
- sub CleanData($);
- my($v) = shift;
- if (ref($v) eq "ARRAY") {
- foreach my $i (0 .. $#{$v}) {
- CleanData($v->[$i]);
- if (ref($v->[$i]) eq "ARRAY" && $#{$v->[$i]}==-1) {
- $v->[$i] = undef;
- next;
- }
- }
- # this removes any undefined elements from the array
- @{$v} = grep { defined $_ } @{$v};
- } elsif (ref($v) eq "HASH") {
- foreach my $x (keys %{$v}) {
- CleanData($v->{$x});
- if (!defined $v->{$x}) { delete($v->{$x}); next; }
- if (ref($v->{$x}) eq "ARRAY" && $#{$v->{$x}}==-1) { delete($v->{$x}); next; }
- }
- }
- return $v;
-}
-
-sub _Error {
- if (exists $_[0]->YYData->{ERRMSG}) {
- print $_[0]->YYData->{ERRMSG};
- delete $_[0]->YYData->{ERRMSG};
- return;
- };
- my $line = $_[0]->YYData->{LINE};
- my $last_token = $_[0]->YYData->{LAST_TOKEN};
- my $file = $_[0]->YYData->{INPUT_FILENAME};
-
- print "$file:$line: Syntax error near '$last_token'\n";
-}
-
-sub _Lexer($)
-{
- my($parser)=shift;
-
- $parser->YYData->{INPUT} or return('',undef);
-
-again:
- $parser->YYData->{INPUT} =~ s/^[ \t]*//;
-
- for ($parser->YYData->{INPUT}) {
- if (/^\#/) {
- if (s/^\# (\d+) \"(.*?)\"( \d+|)//) {
- $parser->YYData->{LINE} = $1-1;
- $parser->YYData->{INPUT_FILENAME} = $2;
- goto again;
- }
- if (s/^\#line (\d+) \"(.*?)\"( \d+|)//) {
- $parser->YYData->{LINE} = $1-1;
- $parser->YYData->{INPUT_FILENAME} = $2;
- goto again;
- }
- if (s/^(\#.*)$//m) {
- goto again;
- }
- }
- if (s/^(\n)//) {
- $parser->YYData->{LINE}++;
- goto again;
- }
- if (s/^\"(.*?)\"//) {
- $parser->YYData->{LAST_TOKEN} = $1;
- return('TEXT',$1);
- }
- if (s/^(\d+)(\W|$)/$2/) {
- $parser->YYData->{LAST_TOKEN} = $1;
- return('CONSTANT',$1);
- }
- if (s/^([\w_]+)//) {
- $parser->YYData->{LAST_TOKEN} = $1;
- if ($1 =~
- /^(const|typedef|union|struct|enum)$/x) {
- return uc($1);
- }
- return('IDENTIFIER',$1);
- }
- if (s/^(.)//s) {
- $parser->YYData->{LAST_TOKEN} = $1;
- return($1,$1);
- }
- }
-}
-
-sub parse($$)
-{
- my ($self,$filename) = @_;
-
- my $saved_delim = $/;
- undef $/;
- my $cpp = $ENV{CPP};
- if (! defined $cpp) {
- $cpp = "cpp"
- }
- my $data = `$cpp -D__PIDL__ -xc $filename`;
- $/ = $saved_delim;
-
- $self->YYData->{INPUT} = $data;
- $self->YYData->{LINE} = 0;
- $self->YYData->{LAST_TOKEN} = "NONE";
-
- my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
-
- return CleanData($idl);
-}
diff --git a/source4/pidl/tests/cutil.pl b/source4/pidl/tests/cutil.pl
new file mode 100755
index 0000000000..78c8bce45e
--- /dev/null
+++ b/source4/pidl/tests/cutil.pl
@@ -0,0 +1,21 @@
+#!/usr/bin/perl
+# (C) 2007 Jelmer Vernooij <jelmer@samba.org>
+# Published under the GNU General Public License
+use strict;
+use warnings;
+
+use Test::More tests => 7;
+use FindBin qw($RealBin);
+use lib "$RealBin";
+use Util;
+use Parse::Pidl::Util qw(MyDumper);
+use Parse::Pidl::CUtil qw(get_pointer_to get_value_of);
+
+is("&foo", get_pointer_to("foo"));
+is("&(&foo)", get_pointer_to(get_pointer_to("foo")));
+is("*foo", get_pointer_to("**foo"));
+is("foo", get_pointer_to("*foo"));
+
+is("foo", get_value_of("&foo"));
+is("*foo", get_value_of("foo"));
+is("**foo", get_value_of("*foo"));
diff --git a/source4/pidl/tests/header.pl b/source4/pidl/tests/header.pl
index 8d0dccf507..db59484444 100755
--- a/source4/pidl/tests/header.pl
+++ b/source4/pidl/tests/header.pl
@@ -4,12 +4,14 @@
use strict;
use warnings;
-use Test::More tests => 16;
+use Test::More tests => 27;
use FindBin qw($RealBin);
use lib "$RealBin";
use Util;
use Parse::Pidl::Util qw(MyDumper);
-use Parse::Pidl::Samba4::Header;
+use Parse::Pidl::Samba4::Header qw(
+ GenerateFunctionInEnv GenerateFunctionOutEnv GenerateStructEnv
+ EnvSubstituteValue);
use Parse::Pidl::IDL qw(parse_string);
use Parse::Pidl::NDR;
@@ -56,3 +58,51 @@ like(parse_idl("interface p { typedef struct x { int p; } x; };"),
like(parse_idl("cpp_quote(\"some-foo\")"),
qr/some-foo/sm, "cpp quote");
+
+# Make sure GenerateFunctionInEnv and GenerateFunctionOutEnv work
+my $fn = { ELEMENTS => [ { DIRECTION => ["in"], NAME => "foo" } ] };
+is_deeply({ "foo" => "r->in.foo" }, GenerateFunctionInEnv($fn));
+
+$fn = { ELEMENTS => [ { DIRECTION => ["out"], NAME => "foo" } ] };
+is_deeply({ "foo" => "r->out.foo" }, GenerateFunctionOutEnv($fn));
+
+$fn = { ELEMENTS => [ { DIRECTION => ["out", "in"], NAME => "foo" } ] };
+is_deeply({ "foo" => "r->in.foo" }, GenerateFunctionInEnv($fn));
+
+$fn = { ELEMENTS => [ { DIRECTION => ["out", "in"], NAME => "foo" } ] };
+is_deeply({ "foo" => "r->out.foo" }, GenerateFunctionOutEnv($fn));
+
+$fn = { ELEMENTS => [ { DIRECTION => ["in"], NAME => "foo" } ] };
+is_deeply({ "foo" => "r->in.foo" }, GenerateFunctionOutEnv($fn));
+
+$fn = { ELEMENTS => [ { DIRECTION => ["out"], NAME => "foo" } ] };
+is_deeply({ }, GenerateFunctionInEnv($fn));
+
+$fn = { ELEMENTS => [ { NAME => "foo" }, { NAME => "bar" } ] };
+is_deeply({ foo => "r->foo", bar => "r->bar", this => "r" },
+ GenerateStructEnv($fn, "r"));
+
+$fn = { ELEMENTS => [ { NAME => "foo" }, { NAME => "bar" } ] };
+is_deeply({ foo => "some->complex.variable->foo",
+ bar => "some->complex.variable->bar",
+ this => "some->complex.variable" },
+ GenerateStructEnv($fn, "some->complex.variable"));
+
+$fn = { ELEMENTS => [ { NAME => "foo", PROPERTIES => { value => 3 }} ] };
+
+my $env = GenerateStructEnv($fn, "r");
+EnvSubstituteValue($env, $fn);
+is_deeply($env, { foo => 3, this => "r" });
+
+$fn = { ELEMENTS => [ { NAME => "foo" }, { NAME => "bar" } ] };
+$env = GenerateStructEnv($fn, "r");
+EnvSubstituteValue($env, $fn);
+is_deeply($env, { foo => 'r->foo', bar => 'r->bar', this => "r" });
+
+$fn = { ELEMENTS => [ { NAME => "foo", PROPERTIES => { value => 0 }} ] };
+
+$env = GenerateStructEnv($fn, "r");
+EnvSubstituteValue($env, $fn);
+is_deeply($env, { foo => 0, this => "r" });
+
+
diff --git a/source4/pidl/tests/ndr.pl b/source4/pidl/tests/ndr.pl
index 1512f19d52..7fcc7ef40e 100755
--- a/source4/pidl/tests/ndr.pl
+++ b/source4/pidl/tests/ndr.pl
@@ -4,7 +4,7 @@
use strict;
use warnings;
-use Test::More tests => 34;
+use Test::More tests => 40;
use FindBin qw($RealBin);
use lib "$RealBin";
use Util;
@@ -212,9 +212,16 @@ is(align_type({ TYPE => "STRUCT", "NAME" => "bla",
ELEMENTS => [ { TYPE => "uint16" } ] }), 4);
is(align_type({ TYPE => "STRUCT",
ELEMENTS => [ { TYPE => "hyper" } ] }), 8);
-is(align_type({ TYPE => "DECLARE", DATA => {
+is(align_type({ TYPE => "TYPEDEF", DATA => {
TYPE => "STRUCT",
ELEMENTS => [ { TYPE => "hyper" } ] }}), 8);
+# typedef of struct without body
+is(align_type({ TYPE => "TYPEDEF", DATA => {
+ TYPE => "STRUCT", ELEMENTS => undef }}), 4);
+# struct without body
+is(align_type({ TYPE => "STRUCT", ELEMENTS => undef }), 4);
+# empty struct
+is(align_type({ TYPE => "STRUCT", ELEMENTS => [] }), 1);
is(align_type({ TYPE => "STRUCT", "NAME" => "bla",
ELEMENTS => [ { TYPE => "uint8" } ] }), 4);
@@ -268,3 +275,9 @@ ok(not can_contain_deferred({ TYPE => "TYPEDEF",
ELEMENTS => [ { TYPE => "uint32" } ]}}));
ok(can_contain_deferred({ TYPE => "STRUCT",
ELEMENTS => [ { TYPE => "someunknowntype" } ]}));
+# Make sure the elements for a enum without body aren't filled in
+ok(not defined(ParseType({TYPE => "ENUM", NAME => "foo" }, "ref")->{ELEMENTS}));
+# Make sure the elements for a bitmap without body aren't filled in
+ok(not defined(ParseType({TYPE => "BITMAP", NAME => "foo" }, "ref")->{ELEMENTS}));
+# Make sure the elements for a union without body aren't filled in
+ok(not defined(ParseType({TYPE => "UNION", NAME => "foo" }, "ref")->{ELEMENTS}));
diff --git a/source4/pidl/tests/parse_idl.pl b/source4/pidl/tests/parse_idl.pl
index 96c7b2adc8..9d43ddccc7 100755
--- a/source4/pidl/tests/parse_idl.pl
+++ b/source4/pidl/tests/parse_idl.pl
@@ -4,7 +4,7 @@
# Published under the GNU General Public License
use strict;
-use Test::More tests => 65 * 2 + 3;
+use Test::More tests => 65 * 2 + 7;
use FindBin qw($RealBin);
use lib "$RealBin";
use Util qw(test_errors);
@@ -129,4 +129,36 @@ is_deeply($x,
[ { 'FILE' => '<quote>', 'DATA' => '"foobar"',
'TYPE' => 'CPP_QUOTE', 'LINE' => 0 } ]);
+# A typedef of a struct without body
+$x = Parse::Pidl::IDL::parse_string("interface foo { typedef struct x y; }", "<foo>");
+is_deeply($x,
+ [ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [
+ { 'FILE' => '<foo>', 'LINE' => 0, 'NAME' => 'y', 'TYPE' => 'TYPEDEF', DATA => {
+ TYPE => 'STRUCT', NAME => 'x' } } ],
+ 'TYPE' => 'INTERFACE', 'LINE' => 0 } ]);
+
+# A typedef of a struct with empty body
+$x = Parse::Pidl::IDL::parse_string("interface foo { typedef struct {} y; }", "<foo>");
+
+is_deeply($x,
+ [ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [
+ { 'FILE' => '<foo>', 'LINE' => 0, 'NAME' => 'y', 'TYPE' => 'TYPEDEF', DATA => { TYPE => 'STRUCT', ELEMENTS => [] } } ],
+ 'TYPE' => 'INTERFACE', 'LINE' => 0 } ]);
+
+# A typedef of a bitmap with no body
+$x = Parse::Pidl::IDL::parse_string("interface foo { typedef bitmap x y; }", "<foo>");
+
+is_deeply($x,
+ [ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [
+ { 'FILE' => '<foo>', 'LINE' => 0, 'NAME' => 'y', 'TYPE' => 'TYPEDEF', DATA => { TYPE => 'BITMAP', NAME => 'x' } } ],
+ 'TYPE' => 'INTERFACE', 'LINE' => 0 } ]);
+
+
+# A typedef of a union with no body
+$x = Parse::Pidl::IDL::parse_string("interface foo { typedef union x y; }", "<foo>");
+
+is_deeply($x,
+ [ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [
+ { 'FILE' => '<foo>', 'LINE' => 0, 'NAME' => 'y', 'TYPE' => 'TYPEDEF', DATA => { TYPE => 'UNION', NAME => 'x' } } ],
+ 'TYPE' => 'INTERFACE', 'LINE' => 0 } ]);
diff --git a/source4/pidl/tests/samba-ejs.pl b/source4/pidl/tests/samba-ejs.pl
index adc00e224f..094d37a103 100755
--- a/source4/pidl/tests/samba-ejs.pl
+++ b/source4/pidl/tests/samba-ejs.pl
@@ -4,23 +4,14 @@
use strict;
use warnings;
-use Test::More tests => 17;
+use Test::More tests => 10;
use FindBin qw($RealBin);
use lib "$RealBin";
use Util;
use Parse::Pidl::Util qw(MyDumper);
-use Parse::Pidl::Samba4::EJS qw(get_pointer_to get_value_of check_null_pointer
+use Parse::Pidl::Samba4::EJS qw(check_null_pointer
fn_declare TypeFunctionName);
-is("&foo", get_pointer_to("foo"));
-is("&(&foo)", get_pointer_to(get_pointer_to("foo")));
-is("*foo", get_pointer_to("**foo"));
-is("foo", get_pointer_to("*foo"));
-
-is("foo", get_value_of("&foo"));
-is("*foo", get_value_of("foo"));
-is("**foo", get_value_of("*foo"));
-
my $ejs = new Parse::Pidl::Samba4::EJS();
$ejs->check_null_pointer("bla");
diff --git a/source4/pidl/tests/samba-ndr.pl b/source4/pidl/tests/samba-ndr.pl
index 05c3c1c0df..a14111961f 100755
--- a/source4/pidl/tests/samba-ndr.pl
+++ b/source4/pidl/tests/samba-ndr.pl
@@ -4,15 +4,14 @@
use strict;
use warnings;
-use Test::More tests => 41;
+use Test::More tests => 30;
use FindBin qw($RealBin);
use lib "$RealBin";
use Util;
use strict;
use Parse::Pidl::Util qw(MyDumper);
use Parse::Pidl::Samba4::NDR::Parser qw(check_null_pointer
- GenerateFunctionInEnv GenerateFunctionOutEnv GenerateStructEnv
- EnvSubstituteValue NeededFunction NeededElement NeededType
+ NeededFunction NeededElement NeededType
NeededInterface TypeFunctionName ParseElementPrint);
my $output;
@@ -138,52 +137,6 @@ test_warnings("nofile:2: unknown dereferenced expression `r->in.bla'\n",
is($output, "if (r->in.bla == NULL) return;");
-# Make sure GenerateFunctionInEnv and GenerateFunctionOutEnv work
-$fn = { ELEMENTS => [ { DIRECTION => ["in"], NAME => "foo" } ] };
-is_deeply({ "foo" => "r->in.foo" }, GenerateFunctionInEnv($fn));
-
-$fn = { ELEMENTS => [ { DIRECTION => ["out"], NAME => "foo" } ] };
-is_deeply({ "foo" => "r->out.foo" }, GenerateFunctionOutEnv($fn));
-
-$fn = { ELEMENTS => [ { DIRECTION => ["out", "in"], NAME => "foo" } ] };
-is_deeply({ "foo" => "r->in.foo" }, GenerateFunctionInEnv($fn));
-
-$fn = { ELEMENTS => [ { DIRECTION => ["out", "in"], NAME => "foo" } ] };
-is_deeply({ "foo" => "r->out.foo" }, GenerateFunctionOutEnv($fn));
-
-$fn = { ELEMENTS => [ { DIRECTION => ["in"], NAME => "foo" } ] };
-is_deeply({ "foo" => "r->in.foo" }, GenerateFunctionOutEnv($fn));
-
-$fn = { ELEMENTS => [ { DIRECTION => ["out"], NAME => "foo" } ] };
-is_deeply({ }, GenerateFunctionInEnv($fn));
-
-$fn = { ELEMENTS => [ { NAME => "foo" }, { NAME => "bar" } ] };
-is_deeply({ foo => "r->foo", bar => "r->bar", this => "r" },
- GenerateStructEnv($fn, "r"));
-
-$fn = { ELEMENTS => [ { NAME => "foo" }, { NAME => "bar" } ] };
-is_deeply({ foo => "some->complex.variable->foo",
- bar => "some->complex.variable->bar",
- this => "some->complex.variable" },
- GenerateStructEnv($fn, "some->complex.variable"));
-
-$fn = { ELEMENTS => [ { NAME => "foo", PROPERTIES => { value => 3 }} ] };
-
-my $env = GenerateStructEnv($fn, "r");
-EnvSubstituteValue($env, $fn);
-is_deeply($env, { foo => 3, this => "r" });
-
-$fn = { ELEMENTS => [ { NAME => "foo" }, { NAME => "bar" } ] };
-$env = GenerateStructEnv($fn, "r");
-EnvSubstituteValue($env, $fn);
-is_deeply($env, { foo => 'r->foo', bar => 'r->bar', this => "r" });
-
-$fn = { ELEMENTS => [ { NAME => "foo", PROPERTIES => { value => 0 }} ] };
-
-$env = GenerateStructEnv($fn, "r");
-EnvSubstituteValue($env, $fn);
-is_deeply($env, { foo => 0, this => "r" });
-
my $needed = {};
NeededElement({ TYPE => "foo", REPRESENTATION_TYPE => "foo" }, "pull", $needed);
is_deeply($needed, { ndr_pull_foo => 1 });
diff --git a/source4/pidl/tests/samba3-cli.pl b/source4/pidl/tests/samba3-cli.pl
index 5086300e46..f5b51b7d34 100755
--- a/source4/pidl/tests/samba3-cli.pl
+++ b/source4/pidl/tests/samba3-cli.pl
@@ -10,7 +10,7 @@ use lib "$RealBin";
use Util;
use Parse::Pidl::Util qw(MyDumper);
use Parse::Pidl::Samba3::ClientNDR qw(ParseFunction);
-use Parse::Pidl::Samba4::NDR::Parser qw(GenerateFunctionInEnv GenerateFunctionOutEnv);
+use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv GenerateFunctionOutEnv);
# Make sure GenerateFunctionInEnv and GenerateFunctionOutEnv work
my $fn = { ELEMENTS => [ { DIRECTION => ["in"], NAME => "foo" } ] };
@@ -29,31 +29,40 @@ my $x = new Parse::Pidl::Samba3::ClientNDR();
$fn = { NAME => "bar", ELEMENTS => [ ] };
$x->ParseFunction("foo", $fn);
-is($x->{res}, "NTSTATUS rpccli_bar(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx)
+is($x->{res},
+"NTSTATUS rpccli_bar(struct rpc_pipe_client *cli,
+ TALLOC_CTX *mem_ctx)
{
\tstruct bar r;
\tNTSTATUS status;
-\t
+
\t/* In parameters */
-\t
-\tif (DEBUGLEVEL >= 10)
+
+\tif (DEBUGLEVEL >= 10) {
\t\tNDR_PRINT_IN_DEBUG(bar, &r);
-\t
-\tstatus = cli_do_rpc_ndr(cli, mem_ctx, PI_FOO, &ndr_table_foo, NDR_BAR, &r);
-\t
+\t}
+
+ status = cli_do_rpc_ndr(cli,
+ mem_ctx,
+ PI_FOO,
+ &ndr_table_foo,
+ NDR_BAR,
+ &r);
+
\tif (!NT_STATUS_IS_OK(status)) {
\t\treturn status;
\t}
-\t
-\tif (DEBUGLEVEL >= 10)
+
+\tif (DEBUGLEVEL >= 10) {
\t\tNDR_PRINT_OUT_DEBUG(bar, &r);
-\t
+\t}
+
\tif (NT_STATUS_IS_ERR(status)) {
\t\treturn status;
\t}
-\t
+
\t/* Return variables */
-\t
+
\t/* Return result */
\treturn NT_STATUS_OK;
}
@@ -64,36 +73,46 @@ $x = new Parse::Pidl::Samba3::ClientNDR();
$fn = { NAME => "bar", ELEMENTS => [ ], RETURN_TYPE => "WERROR" };
$x->ParseFunction("foo", $fn);
-is($x->{res}, "NTSTATUS rpccli_bar(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, WERROR *werror)
+is($x->{res},
+"NTSTATUS rpccli_bar(struct rpc_pipe_client *cli,
+ TALLOC_CTX *mem_ctx,
+ WERROR *werror)
{
\tstruct bar r;
\tNTSTATUS status;
-\t
+
\t/* In parameters */
-\t
-\tif (DEBUGLEVEL >= 10)
+
+\tif (DEBUGLEVEL >= 10) {
\t\tNDR_PRINT_IN_DEBUG(bar, &r);
-\t
-\tstatus = cli_do_rpc_ndr(cli, mem_ctx, PI_FOO, &ndr_table_foo, NDR_BAR, &r);
-\t
+\t}
+
+ status = cli_do_rpc_ndr(cli,
+ mem_ctx,
+ PI_FOO,
+ &ndr_table_foo,
+ NDR_BAR,
+ &r);
+
\tif (!NT_STATUS_IS_OK(status)) {
\t\treturn status;
\t}
-\t
-\tif (DEBUGLEVEL >= 10)
+
+\tif (DEBUGLEVEL >= 10) {
\t\tNDR_PRINT_OUT_DEBUG(bar, &r);
-\t
+\t}
+
\tif (NT_STATUS_IS_ERR(status)) {
\t\treturn status;
\t}
-\t
+
\t/* Return variables */
-\t
+
\t/* Return result */
\tif (werror) {
\t\t*werror = r.out.result;
\t}
-\t
+
\treturn werror_to_ntstatus(r.out.result);
}
diff --git a/source4/pidl/tests/samba3-srv.pl b/source4/pidl/tests/samba3-srv.pl
new file mode 100644
index 0000000000..d1e2bc9545
--- /dev/null
+++ b/source4/pidl/tests/samba3-srv.pl
@@ -0,0 +1,18 @@
+#!/usr/bin/perl
+# (C) 2008 Jelmer Vernooij <jelmer@samba.org>
+# Published under the GNU General Public License
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+use FindBin qw($RealBin);
+use lib "$RealBin";
+use Util;
+use Parse::Pidl::Util qw(MyDumper has_property);
+use Parse::Pidl::Samba3::ServerNDR qw(DeclLevel);
+
+my $l = { TYPE => "DATA", DATA_TYPE => "uint32" };
+my $e = { FILE => "foo", LINE => 0, PROPERTIES => { }, TYPE => "uint32",
+ LEVELS => [ $l ] };
+
+is("uint32_t", DeclLevel($e, 0));
diff --git a/source4/pidl/tests/typelist.pl b/source4/pidl/tests/typelist.pl
index c5c409a525..54f4d34586 100755
--- a/source4/pidl/tests/typelist.pl
+++ b/source4/pidl/tests/typelist.pl
@@ -4,11 +4,11 @@
use strict;
use warnings;
-use Test::More tests => 53;
+use Test::More tests => 54;
use FindBin qw($RealBin);
use lib "$RealBin";
use Util;
-use Parse::Pidl::Typelist qw(hasType getType mapTypeName expandAlias
+use Parse::Pidl::Typelist qw(hasType typeHasBody getType mapTypeName expandAlias
mapScalarType addType typeIs is_scalar scalar_is_reference
enum_type_fn bitmap_type_fn mapType);
@@ -56,7 +56,6 @@ is(1, is_scalar({TYPE => "ENUM"}));
is(0, is_scalar({TYPE => "STRUCT"}));
is(1, is_scalar({TYPE => "TYPEDEF", DATA => {TYPE => "ENUM" }}));
is(1, is_scalar("mytypedef"));
-is(1, is_scalar({TYPE => "DECLARE", DATA => {TYPE => "ENUM" }}));
is(1, scalar_is_reference("string"));
is(0, scalar_is_reference("uint32"));
@@ -81,3 +80,6 @@ is("uint32_t", mapType({TYPE => "TYPEDEF", DATA => {TYPE => "SCALAR"}}, "uint32"
is("void", mapTypeName(undef));
is("uint32_t", mapTypeName("uint32"));
is("int32_t", mapTypeName("int"));
+
+ok(not typeHasBody({TYPE => "TYPEDEF", DATA => { TYPE => "STRUCT" }}));
+ok(typeHasBody({TYPE => "TYPEDEF", DATA => { TYPE => "STRUCT", ELEMENTS => [] }}));