forked from osmocom/wireshark
update pidl to the current samba version so we can generate ndr64
compatible dissectors svn path=/trunk/; revision=30413
This commit is contained in:
parent
6c7cf66046
commit
0659b21e03
|
@ -2,70 +2,120 @@
|
||||||
# Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
|
# Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
|
||||||
# Published under the GNU GPL
|
# Published under the GNU GPL
|
||||||
#
|
#
|
||||||
%left '->'
|
%left '->'
|
||||||
%right '!' '~'
|
%right '!' '~'
|
||||||
%left '*' '/' '%'
|
%left '*' '/' '%'
|
||||||
%left '+' '-'
|
%left '+' '-'
|
||||||
%left '<<' '>>'
|
%left '<<' '>>'
|
||||||
%left '>' '<'
|
%left '>' '<'
|
||||||
%left '==' '!='
|
%left '==' '!='
|
||||||
%left '&'
|
%left '&'
|
||||||
%left '|'
|
%left '|'
|
||||||
%left '&&'
|
%left '&&'
|
||||||
%left '||'
|
%left '||'
|
||||||
%left '?' ':'
|
%left '?' ':'
|
||||||
%left NEG DEREF ADDROF INV
|
%left NEG DEREF ADDROF INV
|
||||||
%left '.'
|
%left '.'
|
||||||
|
|
||||||
%%
|
%%
|
||||||
exp: NUM
|
exp:
|
||||||
| TEXT { "\"$_[1]\"" }
|
NUM
|
||||||
| func
|
|
|
||||||
| var
|
TEXT { "\"$_[1]\"" }
|
||||||
| '~' exp %prec INV { "~$_[2]" }
|
|
|
||||||
| exp '+' exp { "$_[1] + $_[3]" }
|
func
|
||||||
| exp '-' exp { "$_[1] - $_[3]" }
|
|
|
||||||
| exp '*' exp { "$_[1] * $_[3]" }
|
var
|
||||||
| exp '%' exp { "$_[1] % $_[3]" }
|
|
|
||||||
| exp '<' exp { "$_[1] < $_[3]" }
|
'~' exp %prec INV { "~$_[2]" }
|
||||||
| exp '>' exp { "$_[1] > $_[3]" }
|
|
|
||||||
| exp '|' exp { "$_[1] | $_[3]" }
|
exp '+' exp { "$_[1] + $_[3]" }
|
||||||
| exp '==' exp { "$_[1] == $_[3]" }
|
|
|
||||||
| exp '<=' exp { "$_[1] <= $_[3]" }
|
exp '-' exp { "$_[1] - $_[3]" }
|
||||||
| exp '=>' exp { "$_[1] => $_[3]" }
|
|
|
||||||
| exp '<<' exp { "$_[1] << $_[3]" }
|
exp '*' exp { "$_[1] * $_[3]" }
|
||||||
| exp '>>' exp { "$_[1] >> $_[3]" }
|
|
|
||||||
| exp '!=' exp { "$_[1] != $_[3]" }
|
exp '%' exp { "$_[1] % $_[3]" }
|
||||||
| exp '||' exp { "$_[1] || $_[3]" }
|
|
|
||||||
| exp '&&' exp { "$_[1] && $_[3]" }
|
exp '<' exp { "$_[1] < $_[3]" }
|
||||||
| exp '&' exp { "$_[1] & $_[3]" }
|
|
|
||||||
| exp '?' exp ':' exp { "$_[1]?$_[3]:$_[5]" }
|
exp '>' exp { "$_[1] > $_[3]" }
|
||||||
| '~' exp { "~$_[1]" }
|
|
|
||||||
| '!' exp { "not $_[1]" }
|
exp '|' exp { "$_[1] | $_[3]" }
|
||||||
| exp '/' exp { "$_[1] / $_[3]" }
|
|
|
||||||
| '-' exp %prec NEG { "-$_[2]" }
|
exp '==' exp { "$_[1] == $_[3]" }
|
||||||
| '&' exp %prec ADDROF { "&$_[2]" }
|
|
|
||||||
| exp '^' exp { "$_[1]^$_[3]" }
|
exp '<=' exp { "$_[1] <= $_[3]" }
|
||||||
| '(' exp ')' { "($_[2])" }
|
|
|
||||||
|
exp '=>' exp { "$_[1] => $_[3]" }
|
||||||
|
|
|
||||||
|
exp '<<' exp { "$_[1] << $_[3]" }
|
||||||
|
|
|
||||||
|
exp '>>' exp { "$_[1] >> $_[3]" }
|
||||||
|
|
|
||||||
|
exp '!=' exp { "$_[1] != $_[3]" }
|
||||||
|
|
|
||||||
|
exp '||' exp { "$_[1] || $_[3]" }
|
||||||
|
|
|
||||||
|
exp '&&' exp { "$_[1] && $_[3]" }
|
||||||
|
|
|
||||||
|
exp '&' exp { "$_[1] & $_[3]" }
|
||||||
|
|
|
||||||
|
exp '?' exp ':' exp { "$_[1]?$_[3]:$_[5]" }
|
||||||
|
|
|
||||||
|
'~' exp { "~$_[1]" }
|
||||||
|
|
|
||||||
|
'!' exp { "not $_[1]" }
|
||||||
|
|
|
||||||
|
exp '/' exp { "$_[1] / $_[3]" }
|
||||||
|
|
|
||||||
|
'-' exp %prec NEG { "-$_[2]" }
|
||||||
|
|
|
||||||
|
'&' exp %prec ADDROF { "&$_[2]" }
|
||||||
|
|
|
||||||
|
exp '^' exp { "$_[1]^$_[3]" }
|
||||||
|
|
|
||||||
|
'(' exp ')' { "($_[2])" }
|
||||||
;
|
;
|
||||||
|
|
||||||
possible_pointer:
|
possible_pointer:
|
||||||
VAR { $_[0]->_Lookup($_[1]) }
|
VAR { $_[0]->_Lookup($_[1]) }
|
||||||
| '*' possible_pointer %prec DEREF { $_[0]->_Dereference($_[2]); "*$_[2]" }
|
|
|
||||||
;
|
'*' possible_pointer %prec DEREF { $_[0]->_Dereference($_[2]); "*$_[2]" }
|
||||||
|
;
|
||||||
|
|
||||||
var: possible_pointer { $_[0]->_Use($_[1]) }
|
var:
|
||||||
| var '.' VAR { $_[0]->_Use("$_[1].$_[3]") }
|
possible_pointer { $_[0]->_Use($_[1]) }
|
||||||
| '(' var ')' { "($_[2])" }
|
|
|
||||||
| var '->' VAR { $_[0]->_Use("*$_[1]"); $_[1]."->".$_[3] }
|
var '.' VAR { $_[0]->_Use("$_[1].$_[3]") }
|
||||||
|
|
|
||||||
|
'(' var ')' { "($_[2])" }
|
||||||
|
|
|
||||||
|
var '->' VAR { $_[0]->_Use("*$_[1]"); $_[1]."->".$_[3] }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
func: VAR '(' opt_args ')' { "$_[1]($_[3])" };
|
func:
|
||||||
opt_args: { "" } | args;
|
VAR '(' opt_args ')' { "$_[1]($_[3])" }
|
||||||
exp_or_possible_pointer: exp | possible_pointer;
|
;
|
||||||
args: exp_or_possible_pointer
|
|
||||||
| exp_or_possible_pointer ',' args { "$_[1], $_[3]" }
|
opt_args:
|
||||||
|
#empty
|
||||||
|
{ "" }
|
||||||
|
|
|
||||||
|
args
|
||||||
|
;
|
||||||
|
|
||||||
|
exp_or_possible_pointer:
|
||||||
|
exp
|
||||||
|
|
|
||||||
|
possible_pointer
|
||||||
|
;
|
||||||
|
|
||||||
|
args:
|
||||||
|
exp_or_possible_pointer
|
||||||
|
|
|
||||||
|
exp_or_possible_pointer ',' args { "$_[1], $_[3]" }
|
||||||
;
|
;
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
@ -73,22 +123,22 @@ args: exp_or_possible_pointer
|
||||||
package Parse::Pidl::Expr;
|
package Parse::Pidl::Expr;
|
||||||
|
|
||||||
sub _Lexer {
|
sub _Lexer {
|
||||||
my($parser)=shift;
|
my($parser)=shift;
|
||||||
|
|
||||||
$parser->YYData->{INPUT}=~s/^[ \t]//;
|
$parser->YYData->{INPUT}=~s/^[ \t]//;
|
||||||
|
|
||||||
for ($parser->YYData->{INPUT}) {
|
for ($parser->YYData->{INPUT}) {
|
||||||
if (s/^(0x[0-9A-Fa-f]+)//) {
|
if (s/^(0x[0-9A-Fa-f]+)//) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
return('NUM',$1);
|
return('NUM',$1);
|
||||||
}
|
}
|
||||||
if (s/^([0-9]+(?:\.[0-9]+)?)//) {
|
if (s/^([0-9]+(?:\.[0-9]+)?)//) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
return('NUM',$1);
|
return('NUM',$1);
|
||||||
}
|
}
|
||||||
if (s/^([A-Za-z_][A-Za-z0-9_]*)//) {
|
if (s/^([A-Za-z_][A-Za-z0-9_]*)//) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
return('VAR',$1);
|
return('VAR',$1);
|
||||||
}
|
}
|
||||||
if (s/^\"(.*?)\"//) {
|
if (s/^\"(.*?)\"//) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
|
@ -96,13 +146,13 @@ sub _Lexer {
|
||||||
}
|
}
|
||||||
if (s/^(==|!=|<=|>=|->|\|\||<<|>>|&&)//s) {
|
if (s/^(==|!=|<=|>=|->|\|\||<<|>>|&&)//s) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
return($1,$1);
|
return($1,$1);
|
||||||
}
|
}
|
||||||
if (s/^(.)//s) {
|
if (s/^(.)//s) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
return($1,$1);
|
return($1,$1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _Use($$)
|
sub _Use($$)
|
||||||
|
@ -139,12 +189,14 @@ sub _Error($)
|
||||||
}
|
}
|
||||||
|
|
||||||
sub Run {
|
sub Run {
|
||||||
my($self, $data, $error, $lookup, $deref, $use) = @_;
|
my($self, $data, $error, $lookup, $deref, $use) = @_;
|
||||||
$self->YYData->{FULL_INPUT} = $data;
|
|
||||||
$self->YYData->{INPUT} = $data;
|
$self->YYData->{FULL_INPUT} = $data;
|
||||||
$self->YYData->{LOOKUP} = $lookup;
|
$self->YYData->{INPUT} = $data;
|
||||||
$self->YYData->{DEREFERENCE} = $deref;
|
$self->YYData->{LOOKUP} = $lookup;
|
||||||
$self->YYData->{ERROR} = $error;
|
$self->YYData->{DEREFERENCE} = $deref;
|
||||||
$self->YYData->{USE} = $use;
|
$self->YYData->{ERROR} = $error;
|
||||||
return $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error);
|
$self->YYData->{USE} = $use;
|
||||||
|
|
||||||
|
return $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,119 +16,148 @@
|
||||||
%%
|
%%
|
||||||
idl:
|
idl:
|
||||||
#empty { {} }
|
#empty { {} }
|
||||||
| idl interface { push(@{$_[1]}, $_[2]); $_[1] }
|
|
|
||||||
| idl coclass { push(@{$_[1]}, $_[2]); $_[1] }
|
idl interface { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
| idl import { push(@{$_[1]}, $_[2]); $_[1] }
|
|
|
||||||
| idl include { push(@{$_[1]}, $_[2]); $_[1] }
|
idl coclass { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
| idl importlib { push(@{$_[1]}, $_[2]); $_[1] }
|
|
|
||||||
| idl cpp_quote { push(@{$_[1]}, $_[2]); $_[1] }
|
idl import { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
|
|
|
||||||
|
idl include { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
|
|
|
||||||
|
idl importlib { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
|
|
|
||||||
|
idl cpp_quote { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
;
|
;
|
||||||
|
|
||||||
import: 'import' commalist ';' {{
|
import:
|
||||||
"TYPE" => "IMPORT",
|
'import' commalist ';'
|
||||||
"PATHS" => $_[2],
|
{{
|
||||||
"FILE" => $_[0]->YYData->{FILE},
|
"TYPE" => "IMPORT",
|
||||||
"LINE" => $_[0]->YYData->{LINE}
|
"PATHS" => $_[2],
|
||||||
}}
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
;
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
include: 'include' commalist ';' {{
|
}}
|
||||||
"TYPE" => "INCLUDE",
|
|
||||||
"PATHS" => $_[2],
|
|
||||||
"FILE" => $_[0]->YYData->{FILE},
|
|
||||||
"LINE" => $_[0]->YYData->{LINE}
|
|
||||||
}}
|
|
||||||
;
|
|
||||||
importlib: 'importlib' commalist ';' {{
|
|
||||||
"TYPE" => "IMPORTLIB",
|
|
||||||
"PATHS" => $_[2],
|
|
||||||
"FILE" => $_[0]->YYData->{FILE},
|
|
||||||
"LINE" => $_[0]->YYData->{LINE}
|
|
||||||
}}
|
|
||||||
;
|
;
|
||||||
|
|
||||||
commalist:
|
include:
|
||||||
text { [ $_[1] ] }
|
'include' commalist ';'
|
||||||
| commalist ',' text { push(@{$_[1]}, $_[3]); $_[1] }
|
{{
|
||||||
|
"TYPE" => "INCLUDE",
|
||||||
|
"PATHS" => $_[2],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
}}
|
||||||
;
|
;
|
||||||
|
|
||||||
coclass: property_list 'coclass' identifier '{' interface_names '}' optional_semicolon
|
importlib:
|
||||||
{{
|
'importlib' commalist ';'
|
||||||
"TYPE" => "COCLASS",
|
{{
|
||||||
"PROPERTIES" => $_[1],
|
"TYPE" => "IMPORTLIB",
|
||||||
"NAME" => $_[3],
|
"PATHS" => $_[2],
|
||||||
"DATA" => $_[5],
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
"FILE" => $_[0]->YYData->{FILE},
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
"LINE" => $_[0]->YYData->{LINE},
|
}}
|
||||||
}}
|
;
|
||||||
|
|
||||||
|
commalist:
|
||||||
|
text { [ $_[1] ] }
|
||||||
|
|
|
||||||
|
commalist ',' text { push(@{$_[1]}, $_[3]); $_[1] }
|
||||||
|
;
|
||||||
|
|
||||||
|
coclass:
|
||||||
|
property_list 'coclass' identifier '{' interface_names '}' optional_semicolon
|
||||||
|
{{
|
||||||
|
"TYPE" => "COCLASS",
|
||||||
|
"PROPERTIES" => $_[1],
|
||||||
|
"NAME" => $_[3],
|
||||||
|
"DATA" => $_[5],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
}}
|
||||||
;
|
;
|
||||||
|
|
||||||
interface_names:
|
interface_names:
|
||||||
#empty { {} }
|
#empty { {} }
|
||||||
| interface_names 'interface' identifier ';' { push(@{$_[1]}, $_[2]); $_[1] }
|
|
|
||||||
|
interface_names 'interface' identifier ';' { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
;
|
;
|
||||||
|
|
||||||
interface: property_list 'interface' identifier base_interface '{' definitions '}' optional_semicolon
|
interface:
|
||||||
{{
|
property_list 'interface' identifier base_interface '{' definitions '}' optional_semicolon
|
||||||
"TYPE" => "INTERFACE",
|
|
||||||
"PROPERTIES" => $_[1],
|
|
||||||
"NAME" => $_[3],
|
|
||||||
"BASE" => $_[4],
|
|
||||||
"DATA" => $_[6],
|
|
||||||
"FILE" => $_[0]->YYData->{FILE},
|
|
||||||
"LINE" => $_[0]->YYData->{LINE},
|
|
||||||
}}
|
|
||||||
;
|
|
||||||
|
|
||||||
base_interface:
|
|
||||||
#empty
|
|
||||||
| ':' identifier { $_[2] }
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
cpp_quote: 'cpp_quote' '(' text ')'
|
|
||||||
{{
|
{{
|
||||||
"TYPE" => "CPP_QUOTE",
|
"TYPE" => "INTERFACE",
|
||||||
"FILE" => $_[0]->YYData->{FILE},
|
"PROPERTIES" => $_[1],
|
||||||
"LINE" => $_[0]->YYData->{LINE},
|
"NAME" => $_[3],
|
||||||
"DATA" => $_[3]
|
"BASE" => $_[4],
|
||||||
|
"DATA" => $_[6],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
}}
|
}}
|
||||||
;
|
;
|
||||||
|
|
||||||
definitions:
|
base_interface:
|
||||||
definition { [ $_[1] ] }
|
#empty
|
||||||
| definitions definition { push(@{$_[1]}, $_[2]); $_[1] }
|
|
|
||||||
;
|
':' identifier { $_[2] }
|
||||||
|
|
||||||
|
|
||||||
definition: function | const | typedef | typedecl
|
|
||||||
;
|
|
||||||
|
|
||||||
const: 'const' identifier pointers identifier '=' anytext ';'
|
|
||||||
{{
|
|
||||||
"TYPE" => "CONST",
|
|
||||||
"DTYPE" => $_[2],
|
|
||||||
"POINTERS" => $_[3],
|
|
||||||
"NAME" => $_[4],
|
|
||||||
"VALUE" => $_[6],
|
|
||||||
"FILE" => $_[0]->YYData->{FILE},
|
|
||||||
"LINE" => $_[0]->YYData->{LINE},
|
|
||||||
}}
|
|
||||||
| 'const' identifier pointers identifier array_len '=' anytext ';'
|
|
||||||
{{
|
|
||||||
"TYPE" => "CONST",
|
|
||||||
"DTYPE" => $_[2],
|
|
||||||
"POINTERS" => $_[3],
|
|
||||||
"NAME" => $_[4],
|
|
||||||
"ARRAY_LEN" => $_[5],
|
|
||||||
"VALUE" => $_[7],
|
|
||||||
"FILE" => $_[0]->YYData->{FILE},
|
|
||||||
"LINE" => $_[0]->YYData->{LINE},
|
|
||||||
}}
|
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
function: property_list type identifier '(' element_list2 ')' ';'
|
cpp_quote:
|
||||||
{{
|
'cpp_quote' '(' text ')'
|
||||||
|
{{
|
||||||
|
"TYPE" => "CPP_QUOTE",
|
||||||
|
"DATA" => $_[3],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
}}
|
||||||
|
;
|
||||||
|
|
||||||
|
definitions:
|
||||||
|
definition { [ $_[1] ] }
|
||||||
|
|
|
||||||
|
definitions definition { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
|
;
|
||||||
|
|
||||||
|
definition:
|
||||||
|
function
|
||||||
|
|
|
||||||
|
const
|
||||||
|
|
|
||||||
|
typedef
|
||||||
|
|
|
||||||
|
typedecl
|
||||||
|
;
|
||||||
|
|
||||||
|
const:
|
||||||
|
'const' identifier pointers identifier '=' anytext ';'
|
||||||
|
{{
|
||||||
|
"TYPE" => "CONST",
|
||||||
|
"DTYPE" => $_[2],
|
||||||
|
"POINTERS" => $_[3],
|
||||||
|
"NAME" => $_[4],
|
||||||
|
"VALUE" => $_[6],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
}}
|
||||||
|
|
|
||||||
|
'const' identifier pointers identifier array_len '=' anytext ';'
|
||||||
|
{{
|
||||||
|
"TYPE" => "CONST",
|
||||||
|
"DTYPE" => $_[2],
|
||||||
|
"POINTERS" => $_[3],
|
||||||
|
"NAME" => $_[4],
|
||||||
|
"ARRAY_LEN" => $_[5],
|
||||||
|
"VALUE" => $_[7],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
}}
|
||||||
|
;
|
||||||
|
|
||||||
|
function:
|
||||||
|
property_list type identifier '(' element_list2 ')' ';'
|
||||||
|
{{
|
||||||
"TYPE" => "FUNCTION",
|
"TYPE" => "FUNCTION",
|
||||||
"NAME" => $_[3],
|
"NAME" => $_[3],
|
||||||
"RETURN_TYPE" => $_[2],
|
"RETURN_TYPE" => $_[2],
|
||||||
|
@ -136,220 +165,351 @@ function: property_list type identifier '(' element_list2 ')' ';'
|
||||||
"ELEMENTS" => $_[5],
|
"ELEMENTS" => $_[5],
|
||||||
"FILE" => $_[0]->YYData->{FILE},
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
"LINE" => $_[0]->YYData->{LINE},
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
}}
|
}}
|
||||||
;
|
;
|
||||||
|
|
||||||
typedef: property_list 'typedef' type identifier array_len ';'
|
typedef:
|
||||||
{{
|
property_list 'typedef' type identifier array_len ';'
|
||||||
"TYPE" => "TYPEDEF",
|
|
||||||
"PROPERTIES" => $_[1],
|
|
||||||
"NAME" => $_[4],
|
|
||||||
"DATA" => $_[3],
|
|
||||||
"ARRAY_LEN" => $_[5],
|
|
||||||
"FILE" => $_[0]->YYData->{FILE},
|
|
||||||
"LINE" => $_[0]->YYData->{LINE},
|
|
||||||
}}
|
|
||||||
;
|
|
||||||
|
|
||||||
usertype: struct | union | enum | bitmap;
|
|
||||||
|
|
||||||
typedecl: usertype ';' { $_[1] };
|
|
||||||
|
|
||||||
sign: 'signed' | 'unsigned';
|
|
||||||
|
|
||||||
existingtype:
|
|
||||||
sign identifier { ($_[1]?$_[1]:"signed") ." $_[2]" }
|
|
||||||
| identifier
|
|
||||||
;
|
|
||||||
|
|
||||||
type: usertype | existingtype | void { "void" } ;
|
|
||||||
|
|
||||||
enum_body: '{' enum_elements '}' { $_[2] };
|
|
||||||
opt_enum_body: | enum_body;
|
|
||||||
enum: property_list 'enum' optional_identifier opt_enum_body
|
|
||||||
{{
|
|
||||||
"TYPE" => "ENUM",
|
|
||||||
"PROPERTIES" => $_[1],
|
|
||||||
"NAME" => $_[3],
|
|
||||||
"ELEMENTS" => $_[4]
|
|
||||||
}}
|
|
||||||
;
|
|
||||||
|
|
||||||
enum_elements:
|
|
||||||
enum_element { [ $_[1] ] }
|
|
||||||
| enum_elements ',' enum_element { push(@{$_[1]}, $_[3]); $_[1] }
|
|
||||||
;
|
|
||||||
|
|
||||||
enum_element: identifier
|
|
||||||
| identifier '=' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
;
|
|
||||||
|
|
||||||
bitmap_body: '{' opt_bitmap_elements '}' { $_[2] };
|
|
||||||
opt_bitmap_body: | bitmap_body;
|
|
||||||
bitmap: property_list 'bitmap' optional_identifier opt_bitmap_body
|
|
||||||
{{
|
|
||||||
"TYPE" => "BITMAP",
|
|
||||||
"PROPERTIES" => $_[1],
|
|
||||||
"NAME" => $_[3],
|
|
||||||
"ELEMENTS" => $_[4]
|
|
||||||
}}
|
|
||||||
;
|
|
||||||
|
|
||||||
bitmap_elements:
|
|
||||||
bitmap_element { [ $_[1] ] }
|
|
||||||
| bitmap_elements ',' bitmap_element { push(@{$_[1]}, $_[3]); $_[1] }
|
|
||||||
;
|
|
||||||
|
|
||||||
opt_bitmap_elements: | bitmap_elements;
|
|
||||||
|
|
||||||
bitmap_element: identifier '=' anytext { "$_[1] ( $_[3] )" }
|
|
||||||
;
|
|
||||||
|
|
||||||
struct_body: '{' element_list1 '}' { $_[2] };
|
|
||||||
opt_struct_body: | struct_body;
|
|
||||||
|
|
||||||
struct: property_list 'struct' optional_identifier opt_struct_body
|
|
||||||
{{
|
|
||||||
"TYPE" => "STRUCT",
|
|
||||||
"PROPERTIES" => $_[1],
|
|
||||||
"NAME" => $_[3],
|
|
||||||
"ELEMENTS" => $_[4]
|
|
||||||
}}
|
|
||||||
;
|
|
||||||
|
|
||||||
empty_element: property_list ';'
|
|
||||||
{{
|
{{
|
||||||
"NAME" => "",
|
"TYPE" => "TYPEDEF",
|
||||||
"TYPE" => "EMPTY",
|
"PROPERTIES" => $_[1],
|
||||||
"PROPERTIES" => $_[1],
|
"NAME" => $_[4],
|
||||||
"POINTERS" => 0,
|
"DATA" => $_[3],
|
||||||
"ARRAY_LEN" => [],
|
"ARRAY_LEN" => $_[5],
|
||||||
"FILE" => $_[0]->YYData->{FILE},
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
"LINE" => $_[0]->YYData->{LINE},
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
}}
|
}}
|
||||||
;
|
;
|
||||||
|
|
||||||
base_or_empty: base_element ';' | empty_element;
|
usertype:
|
||||||
|
struct
|
||||||
|
|
|
||||||
|
union
|
||||||
|
|
|
||||||
|
enum
|
||||||
|
|
|
||||||
|
bitmap
|
||||||
|
|
|
||||||
|
pipe
|
||||||
|
;
|
||||||
|
|
||||||
|
typedecl:
|
||||||
|
usertype ';' { $_[1] }
|
||||||
|
;
|
||||||
|
|
||||||
|
sign:
|
||||||
|
'signed'
|
||||||
|
|
|
||||||
|
'unsigned'
|
||||||
|
;
|
||||||
|
|
||||||
|
existingtype:
|
||||||
|
sign identifier { ($_[1]?$_[1]:"signed") ." $_[2]" }
|
||||||
|
|
|
||||||
|
identifier
|
||||||
|
;
|
||||||
|
|
||||||
|
type:
|
||||||
|
usertype
|
||||||
|
|
|
||||||
|
existingtype
|
||||||
|
|
|
||||||
|
void { "void" }
|
||||||
|
;
|
||||||
|
|
||||||
|
enum_body:
|
||||||
|
'{' enum_elements '}' { $_[2] }
|
||||||
|
;
|
||||||
|
|
||||||
|
opt_enum_body:
|
||||||
|
#empty
|
||||||
|
|
|
||||||
|
enum_body
|
||||||
|
;
|
||||||
|
|
||||||
|
enum:
|
||||||
|
property_list 'enum' optional_identifier opt_enum_body
|
||||||
|
{{
|
||||||
|
"TYPE" => "ENUM",
|
||||||
|
"PROPERTIES" => $_[1],
|
||||||
|
"NAME" => $_[3],
|
||||||
|
"ELEMENTS" => $_[4],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
}}
|
||||||
|
;
|
||||||
|
|
||||||
|
enum_elements:
|
||||||
|
enum_element { [ $_[1] ] }
|
||||||
|
|
|
||||||
|
enum_elements ',' enum_element { push(@{$_[1]}, $_[3]); $_[1] }
|
||||||
|
;
|
||||||
|
|
||||||
|
enum_element:
|
||||||
|
identifier
|
||||||
|
|
|
||||||
|
identifier '=' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
;
|
||||||
|
|
||||||
|
bitmap_body:
|
||||||
|
'{' opt_bitmap_elements '}' { $_[2] }
|
||||||
|
;
|
||||||
|
|
||||||
|
opt_bitmap_body:
|
||||||
|
#empty
|
||||||
|
|
|
||||||
|
bitmap_body
|
||||||
|
;
|
||||||
|
|
||||||
|
bitmap:
|
||||||
|
property_list 'bitmap' optional_identifier opt_bitmap_body
|
||||||
|
{{
|
||||||
|
"TYPE" => "BITMAP",
|
||||||
|
"PROPERTIES" => $_[1],
|
||||||
|
"NAME" => $_[3],
|
||||||
|
"ELEMENTS" => $_[4],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
}}
|
||||||
|
;
|
||||||
|
|
||||||
|
bitmap_elements:
|
||||||
|
bitmap_element { [ $_[1] ] }
|
||||||
|
|
|
||||||
|
bitmap_elements ',' bitmap_element { push(@{$_[1]}, $_[3]); $_[1] }
|
||||||
|
;
|
||||||
|
|
||||||
|
opt_bitmap_elements:
|
||||||
|
#empty
|
||||||
|
|
|
||||||
|
bitmap_elements
|
||||||
|
;
|
||||||
|
|
||||||
|
bitmap_element:
|
||||||
|
identifier '=' anytext { "$_[1] ( $_[3] )" }
|
||||||
|
;
|
||||||
|
|
||||||
|
struct_body:
|
||||||
|
'{' element_list1 '}' { $_[2] }
|
||||||
|
;
|
||||||
|
|
||||||
|
opt_struct_body:
|
||||||
|
#empty
|
||||||
|
|
|
||||||
|
struct_body
|
||||||
|
;
|
||||||
|
|
||||||
|
struct:
|
||||||
|
property_list 'struct' optional_identifier opt_struct_body
|
||||||
|
{{
|
||||||
|
"TYPE" => "STRUCT",
|
||||||
|
"PROPERTIES" => $_[1],
|
||||||
|
"NAME" => $_[3],
|
||||||
|
"ELEMENTS" => $_[4],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
}}
|
||||||
|
;
|
||||||
|
|
||||||
|
empty_element:
|
||||||
|
property_list ';'
|
||||||
|
{{
|
||||||
|
"NAME" => "",
|
||||||
|
"TYPE" => "EMPTY",
|
||||||
|
"PROPERTIES" => $_[1],
|
||||||
|
"POINTERS" => 0,
|
||||||
|
"ARRAY_LEN" => [],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
}}
|
||||||
|
;
|
||||||
|
|
||||||
|
base_or_empty:
|
||||||
|
base_element ';'
|
||||||
|
|
|
||||||
|
empty_element;
|
||||||
|
|
||||||
optional_base_element:
|
optional_base_element:
|
||||||
property_list base_or_empty { $_[2]->{PROPERTIES} = FlattenHash([$_[1],$_[2]->{PROPERTIES}]); $_[2] }
|
property_list base_or_empty { $_[2]->{PROPERTIES} = FlattenHash([$_[1],$_[2]->{PROPERTIES}]); $_[2] }
|
||||||
;
|
;
|
||||||
|
|
||||||
union_elements:
|
union_elements:
|
||||||
#empty
|
|
||||||
| union_elements optional_base_element { push(@{$_[1]}, $_[2]); $_[1] }
|
|
||||||
;
|
|
||||||
|
|
||||||
union_body: '{' union_elements '}' { $_[2] };
|
|
||||||
opt_union_body: | union_body;
|
|
||||||
|
|
||||||
union: property_list 'union' optional_identifier opt_union_body
|
|
||||||
{{
|
|
||||||
"TYPE" => "UNION",
|
|
||||||
"PROPERTIES" => $_[1],
|
|
||||||
"NAME" => $_[3],
|
|
||||||
"ELEMENTS" => $_[4]
|
|
||||||
}}
|
|
||||||
;
|
|
||||||
|
|
||||||
base_element: property_list type pointers identifier array_len
|
|
||||||
{{
|
|
||||||
"NAME" => $_[4],
|
|
||||||
"TYPE" => $_[2],
|
|
||||||
"PROPERTIES" => $_[1],
|
|
||||||
"POINTERS" => $_[3],
|
|
||||||
"ARRAY_LEN" => $_[5],
|
|
||||||
"FILE" => $_[0]->YYData->{FILE},
|
|
||||||
"LINE" => $_[0]->YYData->{LINE},
|
|
||||||
}}
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
pointers:
|
|
||||||
#empty
|
|
||||||
{ 0 }
|
|
||||||
| pointers '*' { $_[1]+1 }
|
|
||||||
;
|
|
||||||
|
|
||||||
element_list1:
|
|
||||||
{ [] }
|
|
||||||
| element_list1 base_element ';' { push(@{$_[1]}, $_[2]); $_[1] }
|
|
||||||
;
|
|
||||||
|
|
||||||
optional_const:
|
|
||||||
#empty
|
#empty
|
||||||
| 'const'
|
|
|
||||||
|
union_elements optional_base_element { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
;
|
;
|
||||||
|
|
||||||
element_list2:
|
union_body:
|
||||||
#empty
|
'{' union_elements '}' { $_[2] }
|
||||||
| 'void'
|
|
||||||
| optional_const base_element { [ $_[2] ] }
|
|
||||||
| element_list2 ',' optional_const base_element { push(@{$_[1]}, $_[4]); $_[1] }
|
|
||||||
;
|
;
|
||||||
|
|
||||||
array_len:
|
opt_union_body:
|
||||||
#empty { [] }
|
#empty
|
||||||
| '[' ']' array_len { push(@{$_[3]}, "*"); $_[3] }
|
|
|
||||||
| '[' anytext ']' array_len { push(@{$_[4]}, "$_[2]"); $_[4] }
|
union_body
|
||||||
;
|
;
|
||||||
|
|
||||||
|
union:
|
||||||
property_list:
|
property_list 'union' optional_identifier opt_union_body
|
||||||
#empty
|
{{
|
||||||
| property_list '[' properties ']' { FlattenHash([$_[1],$_[3]]); }
|
"TYPE" => "UNION",
|
||||||
|
"PROPERTIES" => $_[1],
|
||||||
|
"NAME" => $_[3],
|
||||||
|
"ELEMENTS" => $_[4],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
}}
|
||||||
;
|
;
|
||||||
|
|
||||||
properties: property { $_[1] }
|
base_element:
|
||||||
| properties ',' property { FlattenHash([$_[1], $_[3]]); }
|
property_list type pointers identifier array_len
|
||||||
|
{{
|
||||||
|
"NAME" => $_[4],
|
||||||
|
"TYPE" => $_[2],
|
||||||
|
"PROPERTIES" => $_[1],
|
||||||
|
"POINTERS" => $_[3],
|
||||||
|
"ARRAY_LEN" => $_[5],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
}}
|
||||||
;
|
;
|
||||||
|
|
||||||
property: identifier {{ "$_[1]" => "1" }}
|
pointers:
|
||||||
| identifier '(' commalisttext ')' {{ "$_[1]" => "$_[3]" }}
|
#empty
|
||||||
|
{ 0 }
|
||||||
|
|
|
||||||
|
pointers '*' { $_[1]+1 }
|
||||||
|
;
|
||||||
|
|
||||||
|
pipe:
|
||||||
|
property_list 'pipe' type
|
||||||
|
{{
|
||||||
|
"TYPE" => "PIPE",
|
||||||
|
"PROPERTIES" => $_[1],
|
||||||
|
"DATA" => $_[3],
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
}}
|
||||||
|
;
|
||||||
|
|
||||||
|
element_list1:
|
||||||
|
#empty
|
||||||
|
{ [] }
|
||||||
|
|
|
||||||
|
element_list1 base_element ';' { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
|
;
|
||||||
|
|
||||||
|
optional_const:
|
||||||
|
#empty
|
||||||
|
|
|
||||||
|
'const'
|
||||||
|
;
|
||||||
|
|
||||||
|
element_list2:
|
||||||
|
#empty
|
||||||
|
|
|
||||||
|
'void'
|
||||||
|
|
|
||||||
|
optional_const base_element { [ $_[2] ] }
|
||||||
|
|
|
||||||
|
element_list2 ',' optional_const base_element { push(@{$_[1]}, $_[4]); $_[1] }
|
||||||
|
;
|
||||||
|
|
||||||
|
array_len:
|
||||||
|
#empty { [] }
|
||||||
|
|
|
||||||
|
'[' ']' array_len { push(@{$_[3]}, "*"); $_[3] }
|
||||||
|
|
|
||||||
|
'[' anytext ']' array_len { push(@{$_[4]}, "$_[2]"); $_[4] }
|
||||||
|
;
|
||||||
|
|
||||||
|
property_list:
|
||||||
|
#empty
|
||||||
|
|
|
||||||
|
property_list '[' properties ']' { FlattenHash([$_[1],$_[3]]); }
|
||||||
|
;
|
||||||
|
|
||||||
|
properties:
|
||||||
|
property { $_[1] }
|
||||||
|
|
|
||||||
|
properties ',' property { FlattenHash([$_[1], $_[3]]); }
|
||||||
|
;
|
||||||
|
|
||||||
|
property:
|
||||||
|
identifier {{ "$_[1]" => "1" }}
|
||||||
|
|
|
||||||
|
identifier '(' commalisttext ')' {{ "$_[1]" => "$_[3]" }}
|
||||||
;
|
;
|
||||||
|
|
||||||
commalisttext:
|
commalisttext:
|
||||||
anytext
|
anytext
|
||||||
| commalisttext ',' anytext { "$_[1],$_[3]" }
|
|
|
||||||
|
commalisttext ',' anytext { "$_[1],$_[3]" }
|
||||||
;
|
;
|
||||||
|
|
||||||
anytext: #empty
|
anytext:
|
||||||
{ "" }
|
|
||||||
| identifier | constant | text
|
|
||||||
| anytext '-' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext '.' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext '*' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext '>' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext '<' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext '|' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext '&' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext '/' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext '?' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext ':' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext '=' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext '+' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext '~' anytext { "$_[1]$_[2]$_[3]" }
|
|
||||||
| anytext '(' commalisttext ')' anytext { "$_[1]$_[2]$_[3]$_[4]$_[5]" }
|
|
||||||
| anytext '{' commalisttext '}' anytext { "$_[1]$_[2]$_[3]$_[4]$_[5]" }
|
|
||||||
;
|
|
||||||
|
|
||||||
identifier: IDENTIFIER
|
|
||||||
;
|
|
||||||
|
|
||||||
optional_identifier:
|
|
||||||
IDENTIFIER
|
|
||||||
| #empty { undef }
|
|
||||||
;
|
|
||||||
|
|
||||||
constant: CONSTANT
|
|
||||||
;
|
|
||||||
|
|
||||||
text: TEXT { "\"$_[1]\"" }
|
|
||||||
;
|
|
||||||
|
|
||||||
optional_semicolon:
|
|
||||||
#empty
|
#empty
|
||||||
| ';'
|
{ "" }
|
||||||
|
|
|
||||||
|
identifier
|
||||||
|
|
|
||||||
|
constant
|
||||||
|
|
|
||||||
|
text
|
||||||
|
|
|
||||||
|
anytext '-' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext '.' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext '*' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext '>' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext '<' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext '|' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext '&' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext '/' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext '?' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext ':' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext '=' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext '+' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext '~' anytext { "$_[1]$_[2]$_[3]" }
|
||||||
|
|
|
||||||
|
anytext '(' commalisttext ')' anytext { "$_[1]$_[2]$_[3]$_[4]$_[5]" }
|
||||||
|
|
|
||||||
|
anytext '{' commalisttext '}' anytext { "$_[1]$_[2]$_[3]$_[4]$_[5]" }
|
||||||
|
;
|
||||||
|
|
||||||
|
identifier:
|
||||||
|
IDENTIFIER
|
||||||
|
;
|
||||||
|
|
||||||
|
optional_identifier:
|
||||||
|
#empty { undef }
|
||||||
|
|
|
||||||
|
IDENTIFIER
|
||||||
|
;
|
||||||
|
|
||||||
|
constant:
|
||||||
|
CONSTANT
|
||||||
|
;
|
||||||
|
|
||||||
|
text:
|
||||||
|
TEXT { "\"$_[1]\"" }
|
||||||
|
;
|
||||||
|
|
||||||
|
optional_semicolon:
|
||||||
|
#empty
|
||||||
|
|
|
||||||
|
';'
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
@ -361,51 +521,56 @@ use Parse::Pidl qw(error);
|
||||||
|
|
||||||
#####################################################################
|
#####################################################################
|
||||||
# flatten an array of hashes into a single hash
|
# flatten an array of hashes into a single hash
|
||||||
sub FlattenHash($)
|
sub FlattenHash($)
|
||||||
{
|
{
|
||||||
my $a = shift;
|
my $a = shift;
|
||||||
my %b;
|
my %b;
|
||||||
for my $d (@{$a}) {
|
for my $d (@{$a}) {
|
||||||
for my $k (keys %{$d}) {
|
for my $k (keys %{$d}) {
|
||||||
$b{$k} = $d->{$k};
|
$b{$k} = $d->{$k};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
return \%b;
|
||||||
return \%b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#####################################################################
|
#####################################################################
|
||||||
# traverse a perl data structure removing any empty arrays or
|
# traverse a perl data structure removing any empty arrays or
|
||||||
# hashes and any hash elements that map to undef
|
# hashes and any hash elements that map to undef
|
||||||
sub CleanData($)
|
sub CleanData($)
|
||||||
{
|
{
|
||||||
sub CleanData($);
|
sub CleanData($);
|
||||||
my($v) = shift;
|
my($v) = shift;
|
||||||
|
|
||||||
return undef if (not defined($v));
|
return undef if (not defined($v));
|
||||||
if (ref($v) eq "ARRAY") {
|
|
||||||
foreach my $i (0 .. $#{$v}) {
|
if (ref($v) eq "ARRAY") {
|
||||||
CleanData($v->[$i]);
|
foreach my $i (0 .. $#{$v}) {
|
||||||
|
CleanData($v->[$i]);
|
||||||
|
}
|
||||||
|
# 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
# 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; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $v;
|
return $v;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _Error {
|
sub _Error {
|
||||||
if (exists $_[0]->YYData->{ERRMSG}) {
|
if (exists $_[0]->YYData->{ERRMSG}) {
|
||||||
error($_[0]->YYData, $_[0]->YYData->{ERRMSG});
|
error($_[0]->YYData, $_[0]->YYData->{ERRMSG});
|
||||||
delete $_[0]->YYData->{ERRMSG};
|
delete $_[0]->YYData->{ERRMSG};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $last_token = $_[0]->YYData->{LAST_TOKEN};
|
my $last_token = $_[0]->YYData->{LAST_TOKEN};
|
||||||
|
|
||||||
error($_[0]->YYData, "Syntax error near '$last_token'");
|
error($_[0]->YYData, "Syntax error near '$last_token'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -413,7 +578,7 @@ sub _Lexer($)
|
||||||
{
|
{
|
||||||
my($parser)=shift;
|
my($parser)=shift;
|
||||||
|
|
||||||
$parser->YYData->{INPUT} or return('',undef);
|
$parser->YYData->{INPUT} or return('',undef);
|
||||||
|
|
||||||
again:
|
again:
|
||||||
$parser->YYData->{INPUT} =~ s/^[ \t]*//;
|
$parser->YYData->{INPUT} =~ s/^[ \t]*//;
|
||||||
|
@ -440,18 +605,19 @@ again:
|
||||||
}
|
}
|
||||||
if (s/^\"(.*?)\"//) {
|
if (s/^\"(.*?)\"//) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
return('TEXT',$1);
|
return('TEXT',$1);
|
||||||
}
|
}
|
||||||
if (s/^(\d+)(\W|$)/$2/) {
|
if (s/^(\d+)(\W|$)/$2/) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
return('CONSTANT',$1);
|
return('CONSTANT',$1);
|
||||||
}
|
}
|
||||||
if (s/^([\w_]+)//) {
|
if (s/^([\w_]+)//) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
if ($1 =~
|
if ($1 =~
|
||||||
/^(coclass|interface|const|typedef|union|cpp_quote
|
/^(coclass|interface|import|importlib
|
||||||
|struct|enum|bitmap|void|unsigned|signed|import|include
|
|include|cpp_quote|typedef
|
||||||
|importlib)$/x) {
|
|union|struct|enum|bitmap|pipe
|
||||||
|
|void|const|unsigned|signed)$/x) {
|
||||||
return $1;
|
return $1;
|
||||||
}
|
}
|
||||||
return('IDENTIFIER',$1);
|
return('IDENTIFIER',$1);
|
||||||
|
@ -469,10 +635,10 @@ sub parse_string
|
||||||
|
|
||||||
my $self = new Parse::Pidl::IDL;
|
my $self = new Parse::Pidl::IDL;
|
||||||
|
|
||||||
$self->YYData->{FILE} = $filename;
|
$self->YYData->{FILE} = $filename;
|
||||||
$self->YYData->{INPUT} = $data;
|
$self->YYData->{INPUT} = $data;
|
||||||
$self->YYData->{LINE} = 0;
|
$self->YYData->{LINE} = 0;
|
||||||
$self->YYData->{LAST_TOKEN} = "NONE";
|
$self->YYData->{LAST_TOKEN} = "NONE";
|
||||||
|
|
||||||
my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
|
my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
|
||||||
|
|
||||||
|
|
|
@ -1127,7 +1127,7 @@ sub new {
|
||||||
[#Rule 2
|
[#Rule 2
|
||||||
'exp', 1,
|
'exp', 1,
|
||||||
sub
|
sub
|
||||||
#line 22 "./pidl/expr.yp"
|
#line 24 "./../pidl/expr.yp"
|
||||||
{ "\"$_[1]\"" }
|
{ "\"$_[1]\"" }
|
||||||
],
|
],
|
||||||
[#Rule 3
|
[#Rule 3
|
||||||
|
@ -1139,199 +1139,199 @@ sub
|
||||||
[#Rule 5
|
[#Rule 5
|
||||||
'exp', 2,
|
'exp', 2,
|
||||||
sub
|
sub
|
||||||
#line 25 "./pidl/expr.yp"
|
#line 30 "./../pidl/expr.yp"
|
||||||
{ "~$_[2]" }
|
{ "~$_[2]" }
|
||||||
],
|
],
|
||||||
[#Rule 6
|
[#Rule 6
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 26 "./pidl/expr.yp"
|
#line 32 "./../pidl/expr.yp"
|
||||||
{ "$_[1] + $_[3]" }
|
{ "$_[1] + $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 7
|
[#Rule 7
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 27 "./pidl/expr.yp"
|
#line 34 "./../pidl/expr.yp"
|
||||||
{ "$_[1] - $_[3]" }
|
{ "$_[1] - $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 8
|
[#Rule 8
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 28 "./pidl/expr.yp"
|
#line 36 "./../pidl/expr.yp"
|
||||||
{ "$_[1] * $_[3]" }
|
{ "$_[1] * $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 9
|
[#Rule 9
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 29 "./pidl/expr.yp"
|
#line 38 "./../pidl/expr.yp"
|
||||||
{ "$_[1] % $_[3]" }
|
{ "$_[1] % $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 10
|
[#Rule 10
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 30 "./pidl/expr.yp"
|
#line 40 "./../pidl/expr.yp"
|
||||||
{ "$_[1] < $_[3]" }
|
{ "$_[1] < $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 11
|
[#Rule 11
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 31 "./pidl/expr.yp"
|
#line 42 "./../pidl/expr.yp"
|
||||||
{ "$_[1] > $_[3]" }
|
{ "$_[1] > $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 12
|
[#Rule 12
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 32 "./pidl/expr.yp"
|
#line 44 "./../pidl/expr.yp"
|
||||||
{ "$_[1] | $_[3]" }
|
{ "$_[1] | $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 13
|
[#Rule 13
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 33 "./pidl/expr.yp"
|
#line 46 "./../pidl/expr.yp"
|
||||||
{ "$_[1] == $_[3]" }
|
{ "$_[1] == $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 14
|
[#Rule 14
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 34 "./pidl/expr.yp"
|
#line 48 "./../pidl/expr.yp"
|
||||||
{ "$_[1] <= $_[3]" }
|
{ "$_[1] <= $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 15
|
[#Rule 15
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 35 "./pidl/expr.yp"
|
#line 50 "./../pidl/expr.yp"
|
||||||
{ "$_[1] => $_[3]" }
|
{ "$_[1] => $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 16
|
[#Rule 16
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 36 "./pidl/expr.yp"
|
#line 52 "./../pidl/expr.yp"
|
||||||
{ "$_[1] << $_[3]" }
|
{ "$_[1] << $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 17
|
[#Rule 17
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 37 "./pidl/expr.yp"
|
#line 54 "./../pidl/expr.yp"
|
||||||
{ "$_[1] >> $_[3]" }
|
{ "$_[1] >> $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 18
|
[#Rule 18
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 38 "./pidl/expr.yp"
|
#line 56 "./../pidl/expr.yp"
|
||||||
{ "$_[1] != $_[3]" }
|
{ "$_[1] != $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 19
|
[#Rule 19
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 39 "./pidl/expr.yp"
|
#line 58 "./../pidl/expr.yp"
|
||||||
{ "$_[1] || $_[3]" }
|
{ "$_[1] || $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 20
|
[#Rule 20
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 40 "./pidl/expr.yp"
|
#line 60 "./../pidl/expr.yp"
|
||||||
{ "$_[1] && $_[3]" }
|
{ "$_[1] && $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 21
|
[#Rule 21
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 41 "./pidl/expr.yp"
|
#line 62 "./../pidl/expr.yp"
|
||||||
{ "$_[1] & $_[3]" }
|
{ "$_[1] & $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 22
|
[#Rule 22
|
||||||
'exp', 5,
|
'exp', 5,
|
||||||
sub
|
sub
|
||||||
#line 42 "./pidl/expr.yp"
|
#line 64 "./../pidl/expr.yp"
|
||||||
{ "$_[1]?$_[3]:$_[5]" }
|
{ "$_[1]?$_[3]:$_[5]" }
|
||||||
],
|
],
|
||||||
[#Rule 23
|
[#Rule 23
|
||||||
'exp', 2,
|
'exp', 2,
|
||||||
sub
|
sub
|
||||||
#line 43 "./pidl/expr.yp"
|
#line 66 "./../pidl/expr.yp"
|
||||||
{ "~$_[1]" }
|
{ "~$_[1]" }
|
||||||
],
|
],
|
||||||
[#Rule 24
|
[#Rule 24
|
||||||
'exp', 2,
|
'exp', 2,
|
||||||
sub
|
sub
|
||||||
#line 44 "./pidl/expr.yp"
|
#line 68 "./../pidl/expr.yp"
|
||||||
{ "not $_[1]" }
|
{ "not $_[1]" }
|
||||||
],
|
],
|
||||||
[#Rule 25
|
[#Rule 25
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 45 "./pidl/expr.yp"
|
#line 70 "./../pidl/expr.yp"
|
||||||
{ "$_[1] / $_[3]" }
|
{ "$_[1] / $_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 26
|
[#Rule 26
|
||||||
'exp', 2,
|
'exp', 2,
|
||||||
sub
|
sub
|
||||||
#line 46 "./pidl/expr.yp"
|
#line 72 "./../pidl/expr.yp"
|
||||||
{ "-$_[2]" }
|
{ "-$_[2]" }
|
||||||
],
|
],
|
||||||
[#Rule 27
|
[#Rule 27
|
||||||
'exp', 2,
|
'exp', 2,
|
||||||
sub
|
sub
|
||||||
#line 47 "./pidl/expr.yp"
|
#line 74 "./../pidl/expr.yp"
|
||||||
{ "&$_[2]" }
|
{ "&$_[2]" }
|
||||||
],
|
],
|
||||||
[#Rule 28
|
[#Rule 28
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 48 "./pidl/expr.yp"
|
#line 76 "./../pidl/expr.yp"
|
||||||
{ "$_[1]^$_[3]" }
|
{ "$_[1]^$_[3]" }
|
||||||
],
|
],
|
||||||
[#Rule 29
|
[#Rule 29
|
||||||
'exp', 3,
|
'exp', 3,
|
||||||
sub
|
sub
|
||||||
#line 49 "./pidl/expr.yp"
|
#line 78 "./../pidl/expr.yp"
|
||||||
{ "($_[2])" }
|
{ "($_[2])" }
|
||||||
],
|
],
|
||||||
[#Rule 30
|
[#Rule 30
|
||||||
'possible_pointer', 1,
|
'possible_pointer', 1,
|
||||||
sub
|
sub
|
||||||
#line 53 "./pidl/expr.yp"
|
#line 82 "./../pidl/expr.yp"
|
||||||
{ $_[0]->_Lookup($_[1]) }
|
{ $_[0]->_Lookup($_[1]) }
|
||||||
],
|
],
|
||||||
[#Rule 31
|
[#Rule 31
|
||||||
'possible_pointer', 2,
|
'possible_pointer', 2,
|
||||||
sub
|
sub
|
||||||
#line 54 "./pidl/expr.yp"
|
#line 84 "./../pidl/expr.yp"
|
||||||
{ $_[0]->_Dereference($_[2]); "*$_[2]" }
|
{ $_[0]->_Dereference($_[2]); "*$_[2]" }
|
||||||
],
|
],
|
||||||
[#Rule 32
|
[#Rule 32
|
||||||
'var', 1,
|
'var', 1,
|
||||||
sub
|
sub
|
||||||
#line 57 "./pidl/expr.yp"
|
#line 88 "./../pidl/expr.yp"
|
||||||
{ $_[0]->_Use($_[1]) }
|
{ $_[0]->_Use($_[1]) }
|
||||||
],
|
],
|
||||||
[#Rule 33
|
[#Rule 33
|
||||||
'var', 3,
|
'var', 3,
|
||||||
sub
|
sub
|
||||||
#line 58 "./pidl/expr.yp"
|
#line 90 "./../pidl/expr.yp"
|
||||||
{ $_[0]->_Use("$_[1].$_[3]") }
|
{ $_[0]->_Use("$_[1].$_[3]") }
|
||||||
],
|
],
|
||||||
[#Rule 34
|
[#Rule 34
|
||||||
'var', 3,
|
'var', 3,
|
||||||
sub
|
sub
|
||||||
#line 59 "./pidl/expr.yp"
|
#line 92 "./../pidl/expr.yp"
|
||||||
{ "($_[2])" }
|
{ "($_[2])" }
|
||||||
],
|
],
|
||||||
[#Rule 35
|
[#Rule 35
|
||||||
'var', 3,
|
'var', 3,
|
||||||
sub
|
sub
|
||||||
#line 60 "./pidl/expr.yp"
|
#line 94 "./../pidl/expr.yp"
|
||||||
{ $_[0]->_Use("*$_[1]"); $_[1]."->".$_[3] }
|
{ $_[0]->_Use("*$_[1]"); $_[1]."->".$_[3] }
|
||||||
],
|
],
|
||||||
[#Rule 36
|
[#Rule 36
|
||||||
'func', 4,
|
'func', 4,
|
||||||
sub
|
sub
|
||||||
#line 64 "./pidl/expr.yp"
|
#line 99 "./../pidl/expr.yp"
|
||||||
{ "$_[1]($_[3])" }
|
{ "$_[1]($_[3])" }
|
||||||
],
|
],
|
||||||
[#Rule 37
|
[#Rule 37
|
||||||
'opt_args', 0,
|
'opt_args', 0,
|
||||||
sub
|
sub
|
||||||
#line 65 "./pidl/expr.yp"
|
#line 104 "./../pidl/expr.yp"
|
||||||
{ "" }
|
{ "" }
|
||||||
],
|
],
|
||||||
[#Rule 38
|
[#Rule 38
|
||||||
|
@ -1349,7 +1349,7 @@ sub
|
||||||
[#Rule 42
|
[#Rule 42
|
||||||
'args', 3,
|
'args', 3,
|
||||||
sub
|
sub
|
||||||
#line 68 "./pidl/expr.yp"
|
#line 118 "./../pidl/expr.yp"
|
||||||
{ "$_[1], $_[3]" }
|
{ "$_[1], $_[3]" }
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
@ -1357,28 +1357,28 @@ sub
|
||||||
bless($self,$class);
|
bless($self,$class);
|
||||||
}
|
}
|
||||||
|
|
||||||
#line 71 "./pidl/expr.yp"
|
#line 121 "./../pidl/expr.yp"
|
||||||
|
|
||||||
|
|
||||||
package Parse::Pidl::Expr;
|
package Parse::Pidl::Expr;
|
||||||
|
|
||||||
sub _Lexer {
|
sub _Lexer {
|
||||||
my($parser)=shift;
|
my($parser)=shift;
|
||||||
|
|
||||||
$parser->YYData->{INPUT}=~s/^[ \t]//;
|
$parser->YYData->{INPUT}=~s/^[ \t]//;
|
||||||
|
|
||||||
for ($parser->YYData->{INPUT}) {
|
for ($parser->YYData->{INPUT}) {
|
||||||
if (s/^(0x[0-9A-Fa-f]+)//) {
|
if (s/^(0x[0-9A-Fa-f]+)//) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
return('NUM',$1);
|
return('NUM',$1);
|
||||||
}
|
}
|
||||||
if (s/^([0-9]+(?:\.[0-9]+)?)//) {
|
if (s/^([0-9]+(?:\.[0-9]+)?)//) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
return('NUM',$1);
|
return('NUM',$1);
|
||||||
}
|
}
|
||||||
if (s/^([A-Za-z_][A-Za-z0-9_]*)//) {
|
if (s/^([A-Za-z_][A-Za-z0-9_]*)//) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
return('VAR',$1);
|
return('VAR',$1);
|
||||||
}
|
}
|
||||||
if (s/^\"(.*?)\"//) {
|
if (s/^\"(.*?)\"//) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
|
@ -1386,13 +1386,13 @@ sub _Lexer {
|
||||||
}
|
}
|
||||||
if (s/^(==|!=|<=|>=|->|\|\||<<|>>|&&)//s) {
|
if (s/^(==|!=|<=|>=|->|\|\||<<|>>|&&)//s) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
return($1,$1);
|
return($1,$1);
|
||||||
}
|
}
|
||||||
if (s/^(.)//s) {
|
if (s/^(.)//s) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
return($1,$1);
|
return($1,$1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _Use($$)
|
sub _Use($$)
|
||||||
|
@ -1429,14 +1429,16 @@ sub _Error($)
|
||||||
}
|
}
|
||||||
|
|
||||||
sub Run {
|
sub Run {
|
||||||
my($self, $data, $error, $lookup, $deref, $use) = @_;
|
my($self, $data, $error, $lookup, $deref, $use) = @_;
|
||||||
$self->YYData->{FULL_INPUT} = $data;
|
|
||||||
$self->YYData->{INPUT} = $data;
|
$self->YYData->{FULL_INPUT} = $data;
|
||||||
$self->YYData->{LOOKUP} = $lookup;
|
$self->YYData->{INPUT} = $data;
|
||||||
$self->YYData->{DEREFERENCE} = $deref;
|
$self->YYData->{LOOKUP} = $lookup;
|
||||||
$self->YYData->{ERROR} = $error;
|
$self->YYData->{DEREFERENCE} = $deref;
|
||||||
$self->YYData->{USE} = $use;
|
$self->YYData->{ERROR} = $error;
|
||||||
return $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error);
|
$self->YYData->{USE} = $use;
|
||||||
|
|
||||||
|
return $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error);
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -50,8 +50,12 @@ my $scalar_alignment = {
|
||||||
'uint8' => 1,
|
'uint8' => 1,
|
||||||
'int16' => 2,
|
'int16' => 2,
|
||||||
'uint16' => 2,
|
'uint16' => 2,
|
||||||
|
'int1632' => 3,
|
||||||
|
'uint1632' => 3,
|
||||||
'int32' => 4,
|
'int32' => 4,
|
||||||
'uint32' => 4,
|
'uint32' => 4,
|
||||||
|
'int3264' => 5,
|
||||||
|
'uint3264' => 5,
|
||||||
'hyper' => 8,
|
'hyper' => 8,
|
||||||
'double' => 8,
|
'double' => 8,
|
||||||
'pointer' => 8,
|
'pointer' => 8,
|
||||||
|
@ -363,7 +367,10 @@ sub find_largest_alignment($)
|
||||||
my $a = 1;
|
my $a = 1;
|
||||||
|
|
||||||
if ($e->{POINTERS}) {
|
if ($e->{POINTERS}) {
|
||||||
$a = 4;
|
# this is a hack for NDR64
|
||||||
|
# the NDR layer translates this into
|
||||||
|
# an alignment of 4 for NDR and 8 for NDR64
|
||||||
|
$a = 5;
|
||||||
} elsif (has_property($e, "subcontext")) {
|
} elsif (has_property($e, "subcontext")) {
|
||||||
$a = 1;
|
$a = 1;
|
||||||
} elsif (has_property($e, "transmit_as")) {
|
} elsif (has_property($e, "transmit_as")) {
|
||||||
|
@ -401,6 +408,8 @@ sub align_type($)
|
||||||
|
|
||||||
if ($dt->{TYPE} eq "TYPEDEF") {
|
if ($dt->{TYPE} eq "TYPEDEF") {
|
||||||
return align_type($dt->{DATA});
|
return align_type($dt->{DATA});
|
||||||
|
} elsif ($dt->{TYPE} eq "CONFORMANCE") {
|
||||||
|
return $dt->{DATA}->{ALIGN};
|
||||||
} elsif ($dt->{TYPE} eq "ENUM") {
|
} elsif ($dt->{TYPE} eq "ENUM") {
|
||||||
return align_type(Parse::Pidl::Typelist::enum_type_fn($dt));
|
return align_type(Parse::Pidl::Typelist::enum_type_fn($dt));
|
||||||
} elsif ($dt->{TYPE} eq "BITMAP") {
|
} elsif ($dt->{TYPE} eq "BITMAP") {
|
||||||
|
@ -506,7 +515,8 @@ sub ParseUnion($$)
|
||||||
ELEMENTS => undef,
|
ELEMENTS => undef,
|
||||||
PROPERTIES => $e->{PROPERTIES},
|
PROPERTIES => $e->{PROPERTIES},
|
||||||
HAS_DEFAULT => $hasdefault,
|
HAS_DEFAULT => $hasdefault,
|
||||||
ORIGINAL => $e
|
ORIGINAL => $e,
|
||||||
|
ALIGN => undef
|
||||||
} unless defined($e->{ELEMENTS});
|
} unless defined($e->{ELEMENTS});
|
||||||
|
|
||||||
CheckPointerTypes($e, $pointer_default);
|
CheckPointerTypes($e, $pointer_default);
|
||||||
|
@ -530,6 +540,11 @@ sub ParseUnion($$)
|
||||||
push @elements, $t;
|
push @elements, $t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $align = undef;
|
||||||
|
if ($e->{NAME}) {
|
||||||
|
$align = align_type($e->{NAME});
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
TYPE => "UNION",
|
TYPE => "UNION",
|
||||||
NAME => $e->{NAME},
|
NAME => $e->{NAME},
|
||||||
|
@ -537,7 +552,8 @@ sub ParseUnion($$)
|
||||||
ELEMENTS => \@elements,
|
ELEMENTS => \@elements,
|
||||||
PROPERTIES => $e->{PROPERTIES},
|
PROPERTIES => $e->{PROPERTIES},
|
||||||
HAS_DEFAULT => $hasdefault,
|
HAS_DEFAULT => $hasdefault,
|
||||||
ORIGINAL => $e
|
ORIGINAL => $e,
|
||||||
|
ALIGN => $align
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -928,7 +944,7 @@ my %property_list = (
|
||||||
"bitmap64bit" => ["BITMAP"],
|
"bitmap64bit" => ["BITMAP"],
|
||||||
|
|
||||||
# array
|
# array
|
||||||
"range" => ["ELEMENT"],
|
"range" => ["ELEMENT", "PIPE"],
|
||||||
"size_is" => ["ELEMENT"],
|
"size_is" => ["ELEMENT"],
|
||||||
"string" => ["ELEMENT"],
|
"string" => ["ELEMENT"],
|
||||||
"noheader" => ["ELEMENT"],
|
"noheader" => ["ELEMENT"],
|
||||||
|
@ -1119,6 +1135,18 @@ sub ValidUnion($)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# validate a pipe
|
||||||
|
sub ValidPipe($)
|
||||||
|
{
|
||||||
|
my ($pipe) = @_;
|
||||||
|
my $data = $pipe->{DATA};
|
||||||
|
|
||||||
|
ValidProperties($pipe, "PIPE");
|
||||||
|
|
||||||
|
fatal($pipe, $pipe->{NAME} . ": 'pipe' is not yet supported by pidl");
|
||||||
|
}
|
||||||
|
|
||||||
#####################################################################
|
#####################################################################
|
||||||
# parse a typedef
|
# parse a typedef
|
||||||
sub ValidTypedef($)
|
sub ValidTypedef($)
|
||||||
|
@ -1164,7 +1192,8 @@ sub ValidType($)
|
||||||
STRUCT => \&ValidStruct,
|
STRUCT => \&ValidStruct,
|
||||||
UNION => \&ValidUnion,
|
UNION => \&ValidUnion,
|
||||||
ENUM => \&ValidEnum,
|
ENUM => \&ValidEnum,
|
||||||
BITMAP => \&ValidBitmap
|
BITMAP => \&ValidBitmap,
|
||||||
|
PIPE => \&ValidPipe
|
||||||
}->{$t->{TYPE}}->($t);
|
}->{$t->{TYPE}}->($t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1206,7 +1235,8 @@ sub ValidInterface($)
|
||||||
$d->{TYPE} eq "STRUCT" or
|
$d->{TYPE} eq "STRUCT" or
|
||||||
$d->{TYPE} eq "UNION" or
|
$d->{TYPE} eq "UNION" or
|
||||||
$d->{TYPE} eq "ENUM" or
|
$d->{TYPE} eq "ENUM" or
|
||||||
$d->{TYPE} eq "BITMAP") && ValidType($d);
|
$d->{TYPE} eq "BITMAP" or
|
||||||
|
$d->{TYPE} eq "PIPE") && ValidType($d);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,10 +71,12 @@ sub HeaderProperties($$)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub ParseOutputArgument($$$)
|
sub ParseOutputArgument($$$;$$)
|
||||||
{
|
{
|
||||||
my ($self, $fn, $e) = @_;
|
my ($self, $fn, $e, $r, $o) = @_;
|
||||||
my $level = 0;
|
my $level = 0;
|
||||||
|
$r = "r." unless defined($r);
|
||||||
|
$o = "" unless defined($o);
|
||||||
|
|
||||||
if ($e->{LEVELS}[0]->{TYPE} ne "POINTER" and $e->{LEVELS}[0]->{TYPE} ne "ARRAY") {
|
if ($e->{LEVELS}[0]->{TYPE} ne "POINTER" and $e->{LEVELS}[0]->{TYPE} ne "ARRAY") {
|
||||||
$self->pidl("return NT_STATUS_NOT_SUPPORTED;");
|
$self->pidl("return NT_STATUS_NOT_SUPPORTED;");
|
||||||
|
@ -85,7 +87,7 @@ sub ParseOutputArgument($$$)
|
||||||
if ($e->{LEVELS}[0]->{TYPE} eq "POINTER") {
|
if ($e->{LEVELS}[0]->{TYPE} eq "POINTER") {
|
||||||
$level = 1;
|
$level = 1;
|
||||||
if ($e->{LEVELS}[0]->{POINTER_TYPE} ne "ref") {
|
if ($e->{LEVELS}[0]->{POINTER_TYPE} ne "ref") {
|
||||||
$self->pidl("if ($e->{NAME} && r.out.$e->{NAME}) {");
|
$self->pidl("if ($o$e->{NAME} && ${r}out.$e->{NAME}) {");
|
||||||
$self->indent;
|
$self->indent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -95,7 +97,7 @@ sub ParseOutputArgument($$$)
|
||||||
# Since the data is being copied into a user-provided data
|
# Since the data is being copied into a user-provided data
|
||||||
# structure, the user should be able to know the size beforehand
|
# structure, the user should be able to know the size beforehand
|
||||||
# to allocate a structure of the right size.
|
# to allocate a structure of the right size.
|
||||||
my $env = GenerateFunctionInEnv($fn, "r.");
|
my $env = GenerateFunctionInEnv($fn, $r);
|
||||||
my $l = $e->{LEVELS}[$level];
|
my $l = $e->{LEVELS}[$level];
|
||||||
unless (defined($l->{SIZE_IS})) {
|
unless (defined($l->{SIZE_IS})) {
|
||||||
error($e->{ORIGINAL}, "no size known for [out] array `$e->{NAME}'");
|
error($e->{ORIGINAL}, "no size known for [out] array `$e->{NAME}'");
|
||||||
|
@ -103,13 +105,13 @@ sub ParseOutputArgument($$$)
|
||||||
} else {
|
} else {
|
||||||
my $size_is = ParseExpr($l->{SIZE_IS}, $env, $e->{ORIGINAL});
|
my $size_is = ParseExpr($l->{SIZE_IS}, $env, $e->{ORIGINAL});
|
||||||
if (has_property($e, "charset")) {
|
if (has_property($e, "charset")) {
|
||||||
$self->pidl("memcpy(CONST_DISCARD(char *, $e->{NAME}), r.out.$e->{NAME}, $size_is * sizeof(*$e->{NAME}));");
|
$self->pidl("memcpy(CONST_DISCARD(char *, $o$e->{NAME}), ${r}out.$e->{NAME}, $size_is * sizeof(*$o$e->{NAME}));");
|
||||||
} else {
|
} else {
|
||||||
$self->pidl("memcpy($e->{NAME}, r.out.$e->{NAME}, $size_is * sizeof(*$e->{NAME}));");
|
$self->pidl("memcpy($o$e->{NAME}, ${r}out.$e->{NAME}, $size_is * sizeof(*$o$e->{NAME}));");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$self->pidl("*$e->{NAME} = *r.out.$e->{NAME};");
|
$self->pidl("*$o$e->{NAME} = *${r}out.$e->{NAME};");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($e->{LEVELS}[0]->{TYPE} eq "POINTER") {
|
if ($e->{LEVELS}[0]->{TYPE} eq "POINTER") {
|
||||||
|
@ -120,7 +122,247 @@ sub ParseOutputArgument($$$)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub ParseFunction($$$)
|
sub ParseFunctionAsyncState($$$)
|
||||||
|
{
|
||||||
|
my ($self, $if, $fn) = @_;
|
||||||
|
|
||||||
|
my $state_str = "struct rpccli_$fn->{NAME}_state";
|
||||||
|
my $done_fn = "rpccli_$fn->{NAME}_done";
|
||||||
|
|
||||||
|
$self->pidl("$state_str {");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("struct $fn->{NAME} orig;");
|
||||||
|
$self->pidl("struct $fn->{NAME} tmp;");
|
||||||
|
$self->pidl("TALLOC_CTX *out_mem_ctx;");
|
||||||
|
$self->pidl("NTSTATUS (*dispatch_recv)(struct tevent_req *req, TALLOC_CTX *mem_ctx);");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("};");
|
||||||
|
$self->pidl("");
|
||||||
|
$self->pidl("static void $done_fn(struct tevent_req *subreq);");
|
||||||
|
$self->pidl("");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ParseFunctionAsyncSend($$$)
|
||||||
|
{
|
||||||
|
my ($self, $if, $fn) = @_;
|
||||||
|
|
||||||
|
my $fn_args = "";
|
||||||
|
my $uif = uc($if);
|
||||||
|
my $ufn = "NDR_".uc($fn->{NAME});
|
||||||
|
my $state_str = "struct rpccli_$fn->{NAME}_state";
|
||||||
|
my $done_fn = "rpccli_$fn->{NAME}_done";
|
||||||
|
my $out_mem_ctx = "rpccli_$fn->{NAME}_out_memory";
|
||||||
|
my $fn_str = "struct tevent_req *rpccli_$fn->{NAME}_send";
|
||||||
|
my $pad = genpad($fn_str);
|
||||||
|
|
||||||
|
$fn_args .= "TALLOC_CTX *mem_ctx";
|
||||||
|
$fn_args .= ",\n" . $pad . "struct tevent_context *ev";
|
||||||
|
$fn_args .= ",\n" . $pad . "struct rpc_pipe_client *cli";
|
||||||
|
|
||||||
|
foreach (@{$fn->{ELEMENTS}}) {
|
||||||
|
my $dir = ElementDirection($_);
|
||||||
|
my $prop = HeaderProperties($_->{PROPERTIES}, ["in", "out"]);
|
||||||
|
$fn_args .= ",\n" . $pad . DeclLong($_, "_") . " /* $dir $prop */";
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->fn_declare("$fn_str($fn_args)");
|
||||||
|
$self->pidl("{");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("struct tevent_req *req;");
|
||||||
|
$self->pidl("$state_str *state;");
|
||||||
|
$self->pidl("struct tevent_req *subreq;");
|
||||||
|
$self->pidl("");
|
||||||
|
$self->pidl("req = tevent_req_create(mem_ctx, &state,");
|
||||||
|
$self->pidl("\t\t\t$state_str);");
|
||||||
|
$self->pidl("if (req == NULL) {");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("return NULL;");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("}");
|
||||||
|
$self->pidl("state->out_mem_ctx = NULL;");
|
||||||
|
$self->pidl("state->dispatch_recv = cli->dispatch_recv;");
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
$self->pidl("/* In parameters */");
|
||||||
|
foreach (@{$fn->{ELEMENTS}}) {
|
||||||
|
if (grep(/in/, @{$_->{DIRECTION}})) {
|
||||||
|
$self->pidl("state->orig.in.$_->{NAME} = _$_->{NAME};");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
my $out_params = 0;
|
||||||
|
$self->pidl("/* Out parameters */");
|
||||||
|
foreach (@{$fn->{ELEMENTS}}) {
|
||||||
|
if (grep(/out/, @{$_->{DIRECTION}})) {
|
||||||
|
$self->pidl("state->orig.out.$_->{NAME} = _$_->{NAME};");
|
||||||
|
$out_params++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
if (defined($fn->{RETURN_TYPE})) {
|
||||||
|
$self->pidl("/* Result */");
|
||||||
|
$self->pidl("ZERO_STRUCT(state->orig.out.result);");
|
||||||
|
$self->pidl("");
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->pidl("if (DEBUGLEVEL >= 10) {");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("NDR_PRINT_IN_DEBUG($fn->{NAME}, &state->orig);");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("}");
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
if ($out_params > 0) {
|
||||||
|
$self->pidl("state->out_mem_ctx = talloc_named_const(state, 0,");
|
||||||
|
$self->pidl("\t\t \"$out_mem_ctx\");");
|
||||||
|
$self->pidl("if (tevent_req_nomem(state->out_mem_ctx, req)) {");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("return tevent_req_post(req, ev);");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("}");
|
||||||
|
$self->pidl("");
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->pidl("/* make a temporary copy, that we pass to the dispatch function */");
|
||||||
|
$self->pidl("state->tmp = state->orig;");
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
$self->pidl("subreq = cli->dispatch_send(state, ev, cli,");
|
||||||
|
$self->pidl("\t\t\t &ndr_table_$if,");
|
||||||
|
$self->pidl("\t\t\t $ufn,");
|
||||||
|
$self->pidl("\t\t\t &state->tmp);");
|
||||||
|
$self->pidl("if (tevent_req_nomem(subreq, req)) {");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("return tevent_req_post(req, ev);");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("}");
|
||||||
|
$self->pidl("tevent_req_set_callback(subreq, $done_fn, req);");
|
||||||
|
$self->pidl("return req;");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("}");
|
||||||
|
$self->pidl("");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ParseFunctionAsyncDone($$$)
|
||||||
|
{
|
||||||
|
my ($self, $if, $fn) = @_;
|
||||||
|
|
||||||
|
my $state_str = "struct rpccli_$fn->{NAME}_state";
|
||||||
|
my $done_fn = "rpccli_$fn->{NAME}_done";
|
||||||
|
|
||||||
|
$self->pidl("static void $done_fn(struct tevent_req *subreq)");
|
||||||
|
$self->pidl("{");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("struct tevent_req *req = tevent_req_callback_data(");
|
||||||
|
$self->pidl("\tsubreq, struct tevent_req);");
|
||||||
|
$self->pidl("$state_str *state = tevent_req_data(");
|
||||||
|
$self->pidl("\treq, $state_str);");
|
||||||
|
$self->pidl("NTSTATUS status;");
|
||||||
|
$self->pidl("TALLOC_CTX *mem_ctx;");
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
$self->pidl("if (state->out_mem_ctx) {");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("mem_ctx = state->out_mem_ctx;");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("} else {");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("mem_ctx = state;");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("}");
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
$self->pidl("status = state->dispatch_recv(subreq, mem_ctx);");
|
||||||
|
$self->pidl("TALLOC_FREE(subreq);");
|
||||||
|
$self->pidl("if (!NT_STATUS_IS_OK(status)) {");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("tevent_req_nterror(req, status);");
|
||||||
|
$self->pidl("return;");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("}");
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
$self->pidl("/* Copy out parameters */");
|
||||||
|
foreach my $e (@{$fn->{ELEMENTS}}) {
|
||||||
|
next unless (grep(/out/, @{$e->{DIRECTION}}));
|
||||||
|
|
||||||
|
$self->ParseOutputArgument($fn, $e, "state->tmp.", "state->orig.out.");
|
||||||
|
}
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
if (defined($fn->{RETURN_TYPE})) {
|
||||||
|
$self->pidl("/* Copy result */");
|
||||||
|
$self->pidl("state->orig.out.result = state->tmp.out.result;");
|
||||||
|
$self->pidl("");
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->pidl("/* Reset temporary structure */");
|
||||||
|
$self->pidl("ZERO_STRUCT(state->tmp);");
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
$self->pidl("if (DEBUGLEVEL >= 10) {");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("NDR_PRINT_OUT_DEBUG($fn->{NAME}, &state->orig);");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("}");
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
$self->pidl("tevent_req_done(req);");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("}");
|
||||||
|
$self->pidl("");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ParseFunctionAsyncRecv($$$)
|
||||||
|
{
|
||||||
|
my ($self, $if, $fn) = @_;
|
||||||
|
|
||||||
|
my $fn_args = "";
|
||||||
|
my $state_str = "struct rpccli_$fn->{NAME}_state";
|
||||||
|
my $fn_str = "NTSTATUS rpccli_$fn->{NAME}_recv";
|
||||||
|
my $pad = genpad($fn_str);
|
||||||
|
|
||||||
|
$fn_args .= "struct tevent_req *req,\n" . $pad . "TALLOC_CTX *mem_ctx";
|
||||||
|
|
||||||
|
if (defined($fn->{RETURN_TYPE})) {
|
||||||
|
$fn_args .= ",\n" . $pad . "$fn->{RETURN_TYPE} *result";
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->fn_declare("$fn_str($fn_args)");
|
||||||
|
$self->pidl("{");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("$state_str *state = tevent_req_data(");
|
||||||
|
$self->pidl("\treq, $state_str);");
|
||||||
|
$self->pidl("NTSTATUS status;");
|
||||||
|
$self->pidl("");
|
||||||
|
$self->pidl("if (tevent_req_is_nterror(req, &status)) {");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl("tevent_req_received(req);");
|
||||||
|
$self->pidl("return status;");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("}");
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
$self->pidl("/* Steal possbile out parameters to the callers context */");
|
||||||
|
$self->pidl("talloc_steal(mem_ctx, state->out_mem_ctx);");
|
||||||
|
$self->pidl("");
|
||||||
|
|
||||||
|
if (defined($fn->{RETURN_TYPE})) {
|
||||||
|
$self->pidl("/* Return result */");
|
||||||
|
$self->pidl("*result = state->orig.out.result;");
|
||||||
|
$self->pidl("");
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->pidl("tevent_req_received(req);");
|
||||||
|
$self->pidl("return NT_STATUS_OK;");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl("}");
|
||||||
|
$self->pidl("");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ParseFunctionSync($$$)
|
||||||
{
|
{
|
||||||
my ($self, $if, $fn) = @_;
|
my ($self, $if, $fn) = @_;
|
||||||
|
|
||||||
|
@ -221,6 +463,18 @@ sub ParseFunction($$$)
|
||||||
$self->pidl("");
|
$self->pidl("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub ParseFunction($$$)
|
||||||
|
{
|
||||||
|
my ($self, $if, $fn) = @_;
|
||||||
|
|
||||||
|
$self->ParseFunctionAsyncState($if, $fn);
|
||||||
|
$self->ParseFunctionAsyncSend($if, $fn);
|
||||||
|
$self->ParseFunctionAsyncDone($if, $fn);
|
||||||
|
$self->ParseFunctionAsyncRecv($if, $fn);
|
||||||
|
|
||||||
|
$self->ParseFunctionSync($if, $fn);
|
||||||
|
}
|
||||||
|
|
||||||
sub ParseInterface($$)
|
sub ParseInterface($$)
|
||||||
{
|
{
|
||||||
my ($self, $if) = @_;
|
my ($self, $if) = @_;
|
||||||
|
|
|
@ -102,10 +102,11 @@ sub ArrayBrackets($)
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub DeclLong($)
|
sub DeclLong($;$)
|
||||||
{
|
{
|
||||||
my ($e) = shift;
|
my ($e, $p) = @_;
|
||||||
my $res = "";
|
my $res = "";
|
||||||
|
$p = "" unless defined($p);
|
||||||
|
|
||||||
if (has_property($e, "represent_as")) {
|
if (has_property($e, "represent_as")) {
|
||||||
$res .= mapTypeName($e->{PROPERTIES}->{represent_as})." ";
|
$res .= mapTypeName($e->{PROPERTIES}->{represent_as})." ";
|
||||||
|
@ -118,7 +119,7 @@ sub DeclLong($)
|
||||||
|
|
||||||
$res .= ElementStars($e);
|
$res .= ElementStars($e);
|
||||||
}
|
}
|
||||||
$res .= $e->{NAME};
|
$res .= $p.$e->{NAME};
|
||||||
$res .= ArrayBrackets($e);
|
$res .= ArrayBrackets($e);
|
||||||
|
|
||||||
return $res;
|
return $res;
|
||||||
|
|
|
@ -120,10 +120,20 @@ sub HeaderEnum($$;$)
|
||||||
pidl " {\n";
|
pidl " {\n";
|
||||||
$tab_depth++;
|
$tab_depth++;
|
||||||
foreach my $e (@{$enum->{ELEMENTS}}) {
|
foreach my $e (@{$enum->{ELEMENTS}}) {
|
||||||
|
my @enum_els = ();
|
||||||
unless ($first) { pidl ",\n"; }
|
unless ($first) { pidl ",\n"; }
|
||||||
$first = 0;
|
$first = 0;
|
||||||
pidl tabs();
|
pidl tabs();
|
||||||
pidl $e;
|
@enum_els = split(/=/, $e);
|
||||||
|
if (@enum_els == 2) {
|
||||||
|
pidl $enum_els[0];
|
||||||
|
pidl "=(int)";
|
||||||
|
pidl "(";
|
||||||
|
pidl $enum_els[1];
|
||||||
|
pidl ")";
|
||||||
|
} else {
|
||||||
|
pidl $e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pidl "\n";
|
pidl "\n";
|
||||||
$tab_depth--;
|
$tab_depth--;
|
||||||
|
|
|
@ -204,12 +204,12 @@ sub ParseArrayPushHeader($$$$$$)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!$l->{IS_SURROUNDING}) and $l->{IS_CONFORMANT}) {
|
if ((!$l->{IS_SURROUNDING}) and $l->{IS_CONFORMANT}) {
|
||||||
$self->pidl("NDR_CHECK(ndr_push_uint32($ndr, NDR_SCALARS, $size));");
|
$self->pidl("NDR_CHECK(ndr_push_uint3264($ndr, NDR_SCALARS, $size));");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($l->{IS_VARYING}) {
|
if ($l->{IS_VARYING}) {
|
||||||
$self->pidl("NDR_CHECK(ndr_push_uint32($ndr, NDR_SCALARS, 0));"); # array offset
|
$self->pidl("NDR_CHECK(ndr_push_uint3264($ndr, NDR_SCALARS, 0));"); # array offset
|
||||||
$self->pidl("NDR_CHECK(ndr_push_uint32($ndr, NDR_SCALARS, $length));");
|
$self->pidl("NDR_CHECK(ndr_push_uint3264($ndr, NDR_SCALARS, $length));");
|
||||||
}
|
}
|
||||||
|
|
||||||
return $length;
|
return $length;
|
||||||
|
@ -1220,9 +1220,9 @@ sub ParseStructPushPrimitives($$$$$)
|
||||||
$size = ParseExpr($e->{LEVELS}[0]->{SIZE_IS}, $env, $e->{ORIGINAL});
|
$size = ParseExpr($e->{LEVELS}[0]->{SIZE_IS}, $env, $e->{ORIGINAL});
|
||||||
}
|
}
|
||||||
|
|
||||||
$self->pidl("NDR_CHECK(ndr_push_uint32($ndr, NDR_SCALARS, $size));");
|
$self->pidl("NDR_CHECK(ndr_push_uint3264($ndr, NDR_SCALARS, $size));");
|
||||||
} else {
|
} else {
|
||||||
$self->pidl("NDR_CHECK(ndr_push_uint32($ndr, NDR_SCALARS, ndr_string_array_size($ndr, $varname->$e->{NAME})));");
|
$self->pidl("NDR_CHECK(ndr_push_uint3264($ndr, NDR_SCALARS, ndr_string_array_size($ndr, $varname->$e->{NAME})));");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1235,6 +1235,8 @@ sub ParseStructPushPrimitives($$$$$)
|
||||||
}
|
}
|
||||||
|
|
||||||
$self->ParseElementPush($_, $ndr, $env, 1, 0) foreach (@{$struct->{ELEMENTS}});
|
$self->ParseElementPush($_, $ndr, $env, 1, 0) foreach (@{$struct->{ELEMENTS}});
|
||||||
|
|
||||||
|
$self->pidl("NDR_CHECK(ndr_push_trailer_align($ndr, $struct->{ALIGN}));");
|
||||||
}
|
}
|
||||||
|
|
||||||
sub ParseStructPushDeferred($$$$)
|
sub ParseStructPushDeferred($$$$)
|
||||||
|
@ -1287,7 +1289,7 @@ sub ParseEnumPush($$$$)
|
||||||
my($type_fn) = $enum->{BASE_TYPE};
|
my($type_fn) = $enum->{BASE_TYPE};
|
||||||
|
|
||||||
$self->start_flags($enum, $ndr);
|
$self->start_flags($enum, $ndr);
|
||||||
$self->pidl("NDR_CHECK(ndr_push_$type_fn($ndr, NDR_SCALARS, $varname));");
|
$self->pidl("NDR_CHECK(ndr_push_enum_$type_fn($ndr, NDR_SCALARS, $varname));");
|
||||||
$self->end_flags($enum, $ndr);
|
$self->end_flags($enum, $ndr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1301,7 +1303,7 @@ sub ParseEnumPull($$$$)
|
||||||
|
|
||||||
$self->pidl("$type_v_decl v;");
|
$self->pidl("$type_v_decl v;");
|
||||||
$self->start_flags($enum, $ndr);
|
$self->start_flags($enum, $ndr);
|
||||||
$self->pidl("NDR_CHECK(ndr_pull_$type_fn($ndr, NDR_SCALARS, &v));");
|
$self->pidl("NDR_CHECK(ndr_pull_enum_$type_fn($ndr, NDR_SCALARS, &v));");
|
||||||
$self->pidl("*$varname = v;");
|
$self->pidl("*$varname = v;");
|
||||||
|
|
||||||
$self->end_flags($enum, $ndr);
|
$self->end_flags($enum, $ndr);
|
||||||
|
@ -1533,6 +1535,8 @@ sub ParseStructPullPrimitives($$$$$)
|
||||||
$self->ParseElementPull($_, $ndr, $env, 1, 0) foreach (@{$struct->{ELEMENTS}});
|
$self->ParseElementPull($_, $ndr, $env, 1, 0) foreach (@{$struct->{ELEMENTS}});
|
||||||
|
|
||||||
$self->add_deferred();
|
$self->add_deferred();
|
||||||
|
|
||||||
|
$self->pidl("NDR_CHECK(ndr_pull_trailer_align($ndr, $struct->{ALIGN}));");
|
||||||
}
|
}
|
||||||
|
|
||||||
sub ParseStructPullDeferred($$$$$)
|
sub ParseStructPullDeferred($$$$$)
|
||||||
|
@ -1644,6 +1648,10 @@ sub ParseUnionPushPrimitives($$$$)
|
||||||
$self->pidl("NDR_CHECK(ndr_push_$e->{SWITCH_TYPE}($ndr, NDR_SCALARS, level));");
|
$self->pidl("NDR_CHECK(ndr_push_$e->{SWITCH_TYPE}($ndr, NDR_SCALARS, level));");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (defined($e->{ALIGN})) {
|
||||||
|
$self->pidl("NDR_CHECK(ndr_push_union_align($ndr, $e->{ALIGN}));");
|
||||||
|
}
|
||||||
|
|
||||||
$self->pidl("switch (level) {");
|
$self->pidl("switch (level) {");
|
||||||
$self->indent;
|
$self->indent;
|
||||||
foreach my $el (@{$e->{ELEMENTS}}) {
|
foreach my $el (@{$e->{ELEMENTS}}) {
|
||||||
|
@ -1669,7 +1677,7 @@ sub ParseUnionPushPrimitives($$$$)
|
||||||
}
|
}
|
||||||
if (! $have_default) {
|
if (! $have_default) {
|
||||||
$self->pidl("default:");
|
$self->pidl("default:");
|
||||||
$self->pidl("\treturn ndr_push_error($ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);");
|
$self->pidl("\treturn ndr_push_error($ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u at \%s\", level, __location__);");
|
||||||
}
|
}
|
||||||
$self->deindent;
|
$self->deindent;
|
||||||
$self->pidl("}");
|
$self->pidl("}");
|
||||||
|
@ -1705,7 +1713,7 @@ sub ParseUnionPushDeferred($$$$)
|
||||||
}
|
}
|
||||||
if (! $have_default) {
|
if (! $have_default) {
|
||||||
$self->pidl("default:");
|
$self->pidl("default:");
|
||||||
$self->pidl("\treturn ndr_push_error($ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);");
|
$self->pidl("\treturn ndr_push_error($ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u at \%s\", level, __location__);");
|
||||||
}
|
}
|
||||||
$self->deindent;
|
$self->deindent;
|
||||||
$self->pidl("}");
|
$self->pidl("}");
|
||||||
|
@ -1784,10 +1792,14 @@ sub ParseUnionPullPrimitives($$$$$)
|
||||||
if (defined($switch_type)) {
|
if (defined($switch_type)) {
|
||||||
$self->pidl("NDR_CHECK(ndr_pull_$switch_type($ndr, NDR_SCALARS, &_level));");
|
$self->pidl("NDR_CHECK(ndr_pull_$switch_type($ndr, NDR_SCALARS, &_level));");
|
||||||
$self->pidl("if (_level != level) {");
|
$self->pidl("if (_level != level) {");
|
||||||
$self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value %u for $varname\", _level);");
|
$self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value %u for $varname at \%s\", _level, __location__);");
|
||||||
$self->pidl("}");
|
$self->pidl("}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (defined($e->{ALIGN})) {
|
||||||
|
$self->pidl("NDR_CHECK(ndr_pull_union_align($ndr, $e->{ALIGN}));");
|
||||||
|
}
|
||||||
|
|
||||||
$self->pidl("switch (level) {");
|
$self->pidl("switch (level) {");
|
||||||
$self->indent;
|
$self->indent;
|
||||||
foreach my $el (@{$e->{ELEMENTS}}) {
|
foreach my $el (@{$e->{ELEMENTS}}) {
|
||||||
|
@ -1814,7 +1826,7 @@ sub ParseUnionPullPrimitives($$$$$)
|
||||||
}
|
}
|
||||||
if (! $have_default) {
|
if (! $have_default) {
|
||||||
$self->pidl("default:");
|
$self->pidl("default:");
|
||||||
$self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);");
|
$self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u at \%s\", level, __location__);");
|
||||||
}
|
}
|
||||||
$self->deindent;
|
$self->deindent;
|
||||||
$self->pidl("}");
|
$self->pidl("}");
|
||||||
|
@ -1848,7 +1860,7 @@ sub ParseUnionPullDeferred($$$$)
|
||||||
}
|
}
|
||||||
if (! $have_default) {
|
if (! $have_default) {
|
||||||
$self->pidl("default:");
|
$self->pidl("default:");
|
||||||
$self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);");
|
$self->pidl("\treturn ndr_pull_error($ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u at \%s\", level, __location__);");
|
||||||
}
|
}
|
||||||
$self->deindent;
|
$self->deindent;
|
||||||
$self->pidl("}");
|
$self->pidl("}");
|
||||||
|
|
|
@ -7,6 +7,7 @@ package Parse::Pidl::Samba4::TDR;
|
||||||
use Parse::Pidl qw(fatal);
|
use Parse::Pidl qw(fatal);
|
||||||
use Parse::Pidl::Util qw(has_property ParseExpr is_constant);
|
use Parse::Pidl::Util qw(has_property ParseExpr is_constant);
|
||||||
use Parse::Pidl::Samba4 qw(is_intree choose_header);
|
use Parse::Pidl::Samba4 qw(is_intree choose_header);
|
||||||
|
use Parse::Pidl::Typelist qw(mapTypeName);
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
@ISA = qw(Exporter);
|
@ISA = qw(Exporter);
|
||||||
|
@ -195,15 +196,16 @@ sub ParserEnum($$$$)
|
||||||
{
|
{
|
||||||
my ($self,$e,$t,$p) = @_;
|
my ($self,$e,$t,$p) = @_;
|
||||||
my $bt = Parse::Pidl::Typelist::enum_type_fn($e);
|
my $bt = Parse::Pidl::Typelist::enum_type_fn($e);
|
||||||
|
my $mt = mapTypeName($bt);
|
||||||
|
|
||||||
$self->fn_declare($p, "NTSTATUS tdr_$t\_$e->{NAME} (struct tdr_$t *tdr".typearg($t).", enum $e->{NAME} *v)");
|
$self->fn_declare($p, "NTSTATUS tdr_$t\_$e->{NAME} (struct tdr_$t *tdr".typearg($t).", enum $e->{NAME} *v)");
|
||||||
$self->pidl("{");
|
$self->pidl("{");
|
||||||
if ($t eq "pull") {
|
if ($t eq "pull") {
|
||||||
$self->pidl("\t$bt\_t r;");
|
$self->pidl("\t$mt r;");
|
||||||
$self->pidl("\tTDR_CHECK(tdr_$t\_$bt(tdr, mem_ctx, \&r));");
|
$self->pidl("\tTDR_CHECK(tdr_$t\_$bt(tdr, mem_ctx, \&r));");
|
||||||
$self->pidl("\t*v = r;");
|
$self->pidl("\t*v = r;");
|
||||||
} elsif ($t eq "push") {
|
} elsif ($t eq "push") {
|
||||||
$self->pidl("\tTDR_CHECK(tdr_$t\_$bt(tdr, ($bt\_t *)v));");
|
$self->pidl("\tTDR_CHECK(tdr_$t\_$bt(tdr, ($mt *)v));");
|
||||||
} elsif ($t eq "print") {
|
} elsif ($t eq "print") {
|
||||||
$self->pidl("\t/* FIXME */");
|
$self->pidl("\t/* FIXME */");
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,8 +32,12 @@ my %scalars = (
|
||||||
"uint8" => "uint8_t",
|
"uint8" => "uint8_t",
|
||||||
"int16" => "int16_t",
|
"int16" => "int16_t",
|
||||||
"uint16" => "uint16_t",
|
"uint16" => "uint16_t",
|
||||||
|
"int1632" => "int16_t",
|
||||||
|
"uint1632" => "uint16_t",
|
||||||
"int32" => "int32_t",
|
"int32" => "int32_t",
|
||||||
"uint32" => "uint32_t",
|
"uint32" => "uint32_t",
|
||||||
|
"int3264" => "int32_t",
|
||||||
|
"uint3264" => "uint32_t",
|
||||||
"hyper" => "uint64_t",
|
"hyper" => "uint64_t",
|
||||||
"dlong" => "int64_t",
|
"dlong" => "int64_t",
|
||||||
"udlong" => "uint64_t",
|
"udlong" => "uint64_t",
|
||||||
|
@ -220,7 +224,7 @@ sub enum_type_fn($)
|
||||||
} elsif (has_property($enum->{PARENT}, "v1_enum")) {
|
} elsif (has_property($enum->{PARENT}, "v1_enum")) {
|
||||||
return "uint32";
|
return "uint32";
|
||||||
}
|
}
|
||||||
return "uint16";
|
return "uint1632";
|
||||||
}
|
}
|
||||||
|
|
||||||
sub bitmap_type_fn($)
|
sub bitmap_type_fn($)
|
||||||
|
|
|
@ -110,6 +110,7 @@ use strict;
|
||||||
|
|
||||||
use Parse::Pidl qw(fatal warning error);
|
use Parse::Pidl qw(fatal warning error);
|
||||||
use Parse::Pidl::Util qw(has_property);
|
use Parse::Pidl::Util qw(has_property);
|
||||||
|
use Parse::Pidl::Typelist qw(addType);
|
||||||
|
|
||||||
sub handle_type($$$$$$$$$$)
|
sub handle_type($$$$$$$$$$)
|
||||||
{
|
{
|
||||||
|
@ -149,6 +150,17 @@ sub handle_type($$$$$$$$$$)
|
||||||
VALSSTRING => $valsstring,
|
VALSSTRING => $valsstring,
|
||||||
ALIGNMENT => $alignment
|
ALIGNMENT => $alignment
|
||||||
};
|
};
|
||||||
|
|
||||||
|
addType({
|
||||||
|
NAME => $name,
|
||||||
|
TYPE => "CONFORMANCE",
|
||||||
|
BASEFILE => "conformance file",
|
||||||
|
DATA => {
|
||||||
|
NAME => $name,
|
||||||
|
TYPE => "CONFORMANCE",
|
||||||
|
ALIGN => $alignment
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
sub handle_tfs($$$$$)
|
sub handle_tfs($$$$$)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
##################################################
|
##################################################
|
||||||
# Samba4 NDR parser generator for IDL structures
|
# Wireshark NDR parser generator for IDL structures
|
||||||
# Copyright tridge@samba.org 2000-2003
|
# Copyright tridge@samba.org 2000-2003
|
||||||
# Copyright tpot@samba.org 2001,2005
|
# Copyright tpot@samba.org 2001,2005
|
||||||
# Copyright jelmer@samba.org 2004-2007
|
# Copyright jelmer@samba.org 2004-2007
|
||||||
|
@ -545,6 +545,9 @@ sub Struct($$$$)
|
||||||
$self->indent;
|
$self->indent;
|
||||||
$self->pidl_code("proto_item *item = NULL;");
|
$self->pidl_code("proto_item *item = NULL;");
|
||||||
$self->pidl_code("proto_tree *tree = NULL;");
|
$self->pidl_code("proto_tree *tree = NULL;");
|
||||||
|
if ($e->{ALIGN} > 1) {
|
||||||
|
$self->pidl_code("dcerpc_info *di = pinfo->private_data;");
|
||||||
|
}
|
||||||
$self->pidl_code("int old_offset;");
|
$self->pidl_code("int old_offset;");
|
||||||
$self->pidl_code("");
|
$self->pidl_code("");
|
||||||
|
|
||||||
|
@ -565,6 +568,15 @@ sub Struct($$$$)
|
||||||
$self->pidl_code("\n$res");
|
$self->pidl_code("\n$res");
|
||||||
|
|
||||||
$self->pidl_code("proto_item_set_len(item, offset-old_offset);\n");
|
$self->pidl_code("proto_item_set_len(item, offset-old_offset);\n");
|
||||||
|
if ($e->{ALIGN} > 1) {
|
||||||
|
$self->pidl_code("");
|
||||||
|
$self->pidl_code("if (di->call_data->flags & DCERPC_IS_NDR64) {");
|
||||||
|
$self->indent;
|
||||||
|
$self->pidl_code("ALIGN_TO_$e->{ALIGN}_BYTES;");
|
||||||
|
$self->deindent;
|
||||||
|
$self->pidl_code("}");
|
||||||
|
}
|
||||||
|
$self->pidl_code("");
|
||||||
$self->pidl_code("return offset;");
|
$self->pidl_code("return offset;");
|
||||||
$self->deindent;
|
$self->deindent;
|
||||||
$self->pidl_code("}\n");
|
$self->pidl_code("}\n");
|
||||||
|
@ -634,6 +646,8 @@ sub Union($$$$)
|
||||||
|
|
||||||
$self->pidl_code("switch(level) {$res\t}");
|
$self->pidl_code("switch(level) {$res\t}");
|
||||||
$self->pidl_code("proto_item_set_len(item, offset-old_offset);\n");
|
$self->pidl_code("proto_item_set_len(item, offset-old_offset);\n");
|
||||||
|
$self->pidl_code("");
|
||||||
|
|
||||||
$self->pidl_code("return offset;");
|
$self->pidl_code("return offset;");
|
||||||
$self->deindent;
|
$self->deindent;
|
||||||
$self->pidl_code("}");
|
$self->pidl_code("}");
|
||||||
|
@ -895,7 +909,7 @@ sub Initialize($$)
|
||||||
sub Parse($$$$$)
|
sub Parse($$$$$)
|
||||||
{
|
{
|
||||||
my($self,$ndr,$idl_file,$h_filename,$cnf_file) = @_;
|
my($self,$ndr,$idl_file,$h_filename,$cnf_file) = @_;
|
||||||
|
|
||||||
$self->Initialize($cnf_file);
|
$self->Initialize($cnf_file);
|
||||||
|
|
||||||
return (undef, undef) if defined($self->{conformance}->{noemit_dissector});
|
return (undef, undef) if defined($self->{conformance}->{noemit_dissector});
|
||||||
|
|
|
@ -653,7 +653,18 @@ sub process_file($)
|
||||||
|
|
||||||
$pidl = Parse::Pidl::ODL::ODL2IDL($pidl, dirname($idl_file), \@opt_incdirs);
|
$pidl = Parse::Pidl::ODL::ODL2IDL($pidl, dirname($idl_file), \@opt_incdirs);
|
||||||
|
|
||||||
if (defined($opt_ws_parser) or
|
if (defined($opt_ws_parser)) {
|
||||||
|
require Parse::Pidl::Wireshark::NDR;
|
||||||
|
|
||||||
|
my $cnffile = $idl_file;
|
||||||
|
$cnffile =~ s/\.idl$/\.cnf/;
|
||||||
|
|
||||||
|
my $generator = new Parse::Pidl::Wireshark::NDR();
|
||||||
|
$generator->Initialize($cnffile);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (defined($opt_ws_parser) or
|
||||||
defined($opt_client) or
|
defined($opt_client) or
|
||||||
defined($opt_server) or
|
defined($opt_server) or
|
||||||
defined($opt_header) or
|
defined($opt_header) or
|
||||||
|
|
|
@ -77,7 +77,6 @@ SKIP: {
|
||||||
|
|
||||||
my $main = "
|
my $main = "
|
||||||
#define uint_t unsigned int
|
#define uint_t unsigned int
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
|
@ -533,7 +533,8 @@ $t = {
|
||||||
ORIGINAL => {
|
ORIGINAL => {
|
||||||
TYPE => "UNION",
|
TYPE => "UNION",
|
||||||
NAME => "foo"
|
NAME => "foo"
|
||||||
}
|
},
|
||||||
|
ALIGN => undef
|
||||||
};
|
};
|
||||||
is_deeply(ParseType($t->{ORIGINAL}, "ref"), $t);
|
is_deeply(ParseType($t->{ORIGINAL}, "ref"), $t);
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ test_samba4_ndr("string-wchar-fixed-array-01",
|
||||||
0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x04, 0x00, 0x00, 0x00,
|
0x04, 0x00, 0x00, 0x00,
|
||||||
\'f\', 0x00, \'o\', 0x00,
|
\'f\', 0x00, \'o\', 0x00,
|
||||||
\'o\', 0x00, 0x00, 0x00
|
\'o\', 0x00, 0x00, 0x00,
|
||||||
0x02, 0x00, 0x00, 0x00
|
0x02, 0x00, 0x00, 0x00
|
||||||
};
|
};
|
||||||
DATA_BLOB b = { data, sizeof(data) };
|
DATA_BLOB b = { data, sizeof(data) };
|
||||||
|
@ -86,16 +86,16 @@ test_samba4_ndr("string-wchar-fixed-array-01",
|
||||||
if (r.in.str == NULL)
|
if (r.in.str == NULL)
|
||||||
return 2;
|
return 2;
|
||||||
|
|
||||||
if (r.in.str.l1 == 0x00000001)
|
if (r.in.str->l1 != 0x00000001)
|
||||||
return 3;
|
return 3;
|
||||||
|
|
||||||
if (strncmp(str.str, "foo", 3) != 0)
|
if (strncmp(str.str, "foo", 3) != 0)
|
||||||
return 4;
|
return 4;
|
||||||
|
|
||||||
if (r.in.str.str[4] != 0)
|
if (r.in.str->str[4] != 0)
|
||||||
return 5;
|
return 5;
|
||||||
|
|
||||||
if (r.in.str.l3 == 0x00000002)
|
if (r.in.str->l2 != 0x00000002)
|
||||||
return 6;
|
return 6;
|
||||||
');
|
');
|
||||||
|
|
||||||
|
@ -114,9 +114,9 @@ test_samba4_ndr("string-wchar-fixed-array-02",
|
||||||
0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x06, 0x00, 0x00, 0x00,
|
0x06, 0x00, 0x00, 0x00,
|
||||||
\'f\', 0x00, \'o\', 0x00,
|
\'f\', 0x00, \'o\', 0x00,
|
||||||
\'o\', 0x00, \'b\', 0x00
|
\'o\', 0x00, \'b\', 0x00,
|
||||||
\'a\', 0x00, \'r\', 0x00,
|
\'a\', 0x00, \'r\', 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x02, 0x00, 0x00, 0x00
|
0x02, 0x00, 0x00, 0x00
|
||||||
};
|
};
|
||||||
DATA_BLOB b = { data, sizeof(data) };
|
DATA_BLOB b = { data, sizeof(data) };
|
||||||
|
@ -146,9 +146,9 @@ test_samba4_ndr("string-wchar-fixed-array-03",
|
||||||
0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x07, 0x00, 0x00, 0x00,
|
0x07, 0x00, 0x00, 0x00,
|
||||||
\'f\', 0x00, \'o\', 0x00,
|
\'f\', 0x00, \'o\', 0x00,
|
||||||
\'o\', 0x00, \'b\', 0x00
|
\'o\', 0x00, \'b\', 0x00,
|
||||||
\'a\', 0x00, \'r\', 0x00,
|
\'a\', 0x00, \'r\', 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x02, 0x00, 0x00, 0x00
|
0x02, 0x00, 0x00, 0x00
|
||||||
};
|
};
|
||||||
DATA_BLOB b = { data, sizeof(data) };
|
DATA_BLOB b = { data, sizeof(data) };
|
||||||
|
|
|
@ -113,52 +113,127 @@ testok "cpp-quote", "cpp_quote(\"bla\")";
|
||||||
|
|
||||||
my $x = Parse::Pidl::IDL::parse_string("interface foo { struct x {}; }", "<foo>");
|
my $x = Parse::Pidl::IDL::parse_string("interface foo { struct x {}; }", "<foo>");
|
||||||
|
|
||||||
is_deeply($x,
|
is_deeply($x, [ {
|
||||||
[ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [
|
'TYPE' => 'INTERFACE',
|
||||||
{ 'NAME' => 'x', 'TYPE' => 'STRUCT', ELEMENTS => [] } ],
|
'NAME' => 'foo',
|
||||||
'TYPE' => 'INTERFACE', 'LINE' => 0 } ]);
|
'DATA' => [ {
|
||||||
|
'TYPE' => 'STRUCT',
|
||||||
|
'NAME' => 'x',
|
||||||
|
'ELEMENTS' => [],
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
} ],
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
}]);
|
||||||
|
|
||||||
$x = Parse::Pidl::IDL::parse_string("interface foo { struct x; }", "<foo>");
|
$x = Parse::Pidl::IDL::parse_string("interface foo { struct x; }", "<foo>");
|
||||||
is_deeply($x,
|
is_deeply($x, [ {
|
||||||
[ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [
|
'TYPE' => 'INTERFACE',
|
||||||
{ 'NAME' => 'x', 'TYPE' => 'STRUCT' } ],
|
'NAME' => 'foo',
|
||||||
'TYPE' => 'INTERFACE', 'LINE' => 0 } ]);
|
'DATA' => [ {
|
||||||
|
'TYPE' => 'STRUCT',
|
||||||
|
'NAME' => 'x',
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
} ],
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
}]);
|
||||||
|
|
||||||
$x = Parse::Pidl::IDL::parse_string("cpp_quote(\"foobar\")", "<quote>");
|
$x = Parse::Pidl::IDL::parse_string("cpp_quote(\"foobar\")", "<quote>");
|
||||||
is_deeply($x,
|
is_deeply($x, [ {
|
||||||
[ { 'FILE' => '<quote>', 'DATA' => '"foobar"',
|
'TYPE' => 'CPP_QUOTE',
|
||||||
'TYPE' => 'CPP_QUOTE', 'LINE' => 0 } ]);
|
'DATA' => '"foobar"',
|
||||||
|
'FILE' => '<quote>',
|
||||||
|
'LINE' => 0
|
||||||
|
}]);
|
||||||
|
|
||||||
# A typedef of a struct without body
|
# A typedef of a struct without body
|
||||||
$x = Parse::Pidl::IDL::parse_string("interface foo { typedef struct x y; }", "<foo>");
|
$x = Parse::Pidl::IDL::parse_string("interface foo { typedef struct x y; }", "<foo>");
|
||||||
|
|
||||||
is_deeply($x,
|
is_deeply($x, [ {
|
||||||
[ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [
|
'TYPE' => 'INTERFACE',
|
||||||
{ 'FILE' => '<foo>', 'LINE' => 0, 'NAME' => 'y', 'TYPE' => 'TYPEDEF', DATA => {
|
'NAME' => 'foo',
|
||||||
TYPE => 'STRUCT', NAME => 'x' } } ],
|
'DATA' => [ {
|
||||||
'TYPE' => 'INTERFACE', 'LINE' => 0 } ]);
|
'TYPE' => 'TYPEDEF',
|
||||||
|
'NAME' => 'y',
|
||||||
|
'DATA' => {
|
||||||
|
'TYPE' => 'STRUCT',
|
||||||
|
'NAME' => 'x',
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0,
|
||||||
|
},
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0,
|
||||||
|
} ],
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
}]);
|
||||||
|
|
||||||
# A typedef of a struct with empty body
|
# A typedef of a struct with empty body
|
||||||
$x = Parse::Pidl::IDL::parse_string("interface foo { typedef struct {} y; }", "<foo>");
|
$x = Parse::Pidl::IDL::parse_string("interface foo { typedef struct {} y; }", "<foo>");
|
||||||
|
|
||||||
is_deeply($x,
|
is_deeply($x, [ {
|
||||||
[ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [
|
'TYPE' => 'INTERFACE',
|
||||||
{ 'FILE' => '<foo>', 'LINE' => 0, 'NAME' => 'y', 'TYPE' => 'TYPEDEF', DATA => { TYPE => 'STRUCT', ELEMENTS => [] } } ],
|
'NAME' => 'foo',
|
||||||
'TYPE' => 'INTERFACE', 'LINE' => 0 } ]);
|
'DATA' => [ {
|
||||||
|
'TYPE' => 'TYPEDEF',
|
||||||
|
'NAME' => 'y',
|
||||||
|
'DATA' => {
|
||||||
|
'TYPE' => 'STRUCT',
|
||||||
|
'ELEMENTS' => [],
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
},
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
} ],
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
}]);
|
||||||
|
|
||||||
# A typedef of a bitmap with no body
|
# A typedef of a bitmap with no body
|
||||||
$x = Parse::Pidl::IDL::parse_string("interface foo { typedef bitmap x y; }", "<foo>");
|
$x = Parse::Pidl::IDL::parse_string("interface foo { typedef bitmap x y; }", "<foo>");
|
||||||
|
|
||||||
is_deeply($x,
|
is_deeply($x, [ {
|
||||||
[ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [
|
'TYPE' => 'INTERFACE',
|
||||||
{ 'FILE' => '<foo>', 'LINE' => 0, 'NAME' => 'y', 'TYPE' => 'TYPEDEF', DATA => { TYPE => 'BITMAP', NAME => 'x' } } ],
|
'NAME' => 'foo',
|
||||||
'TYPE' => 'INTERFACE', 'LINE' => 0 } ]);
|
'DATA' => [ {
|
||||||
|
'TYPE' => 'TYPEDEF',
|
||||||
|
'NAME' => 'y',
|
||||||
|
'DATA' => {
|
||||||
|
'TYPE' => 'BITMAP',
|
||||||
|
'NAME' => 'x',
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
},
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
} ],
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
}]);
|
||||||
|
|
||||||
|
|
||||||
# A typedef of a union with no body
|
# A typedef of a union with no body
|
||||||
$x = Parse::Pidl::IDL::parse_string("interface foo { typedef union x y; }", "<foo>");
|
$x = Parse::Pidl::IDL::parse_string("interface foo { typedef union x y; }", "<foo>");
|
||||||
|
|
||||||
is_deeply($x,
|
is_deeply($x, [ {
|
||||||
[ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [
|
'TYPE' => 'INTERFACE',
|
||||||
{ 'FILE' => '<foo>', 'LINE' => 0, 'NAME' => 'y', 'TYPE' => 'TYPEDEF', DATA => { TYPE => 'UNION', NAME => 'x' } } ],
|
'NAME' => 'foo',
|
||||||
'TYPE' => 'INTERFACE', 'LINE' => 0 } ]);
|
'DATA' => [ {
|
||||||
|
'TYPE' => 'TYPEDEF',
|
||||||
|
'NAME' => 'y',
|
||||||
|
'DATA' => {
|
||||||
|
'TYPE' => 'UNION',
|
||||||
|
'NAME' => 'x',
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
},
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
} ],
|
||||||
|
'FILE' => '<foo>',
|
||||||
|
'LINE' => 0
|
||||||
|
}]);
|
||||||
|
|
|
@ -223,6 +223,7 @@ $generator->ParseStructPush({
|
||||||
ELEMENTS => [ ]}, "ndr", "x");
|
ELEMENTS => [ ]}, "ndr", "x");
|
||||||
is($generator->{res}, "if (ndr_flags & NDR_SCALARS) {
|
is($generator->{res}, "if (ndr_flags & NDR_SCALARS) {
|
||||||
NDR_CHECK(ndr_push_align(ndr, 4));
|
NDR_CHECK(ndr_push_align(ndr, 4));
|
||||||
|
NDR_CHECK(ndr_push_trailer_align(ndr, 4));
|
||||||
}
|
}
|
||||||
if (ndr_flags & NDR_BUFFERS) {
|
if (ndr_flags & NDR_BUFFERS) {
|
||||||
}
|
}
|
||||||
|
@ -245,9 +246,10 @@ $generator->ParseStructPush({
|
||||||
SURROUNDING_ELEMENT => $e,
|
SURROUNDING_ELEMENT => $e,
|
||||||
ELEMENTS => [ $e ]}, "ndr", "x");
|
ELEMENTS => [ $e ]}, "ndr", "x");
|
||||||
is($generator->{res}, "if (ndr_flags & NDR_SCALARS) {
|
is($generator->{res}, "if (ndr_flags & NDR_SCALARS) {
|
||||||
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_string_array_size(ndr, x->el1)));
|
NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, ndr_string_array_size(ndr, x->el1)));
|
||||||
NDR_CHECK(ndr_push_align(ndr, 4));
|
NDR_CHECK(ndr_push_align(ndr, 4));
|
||||||
NDR_CHECK(ndr_push_mytype(ndr, NDR_SCALARS, &x->el1));
|
NDR_CHECK(ndr_push_mytype(ndr, NDR_SCALARS, &x->el1));
|
||||||
|
NDR_CHECK(ndr_push_trailer_align(ndr, 4));
|
||||||
}
|
}
|
||||||
if (ndr_flags & NDR_BUFFERS) {
|
if (ndr_flags & NDR_BUFFERS) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,107 @@ my $x = new Parse::Pidl::Samba3::ClientNDR();
|
||||||
$fn = { NAME => "bar", ELEMENTS => [ ] };
|
$fn = { NAME => "bar", ELEMENTS => [ ] };
|
||||||
$x->ParseFunction("foo", $fn);
|
$x->ParseFunction("foo", $fn);
|
||||||
is($x->{res},
|
is($x->{res},
|
||||||
"NTSTATUS rpccli_bar(struct rpc_pipe_client *cli,
|
"struct rpccli_bar_state {
|
||||||
|
struct bar orig;
|
||||||
|
struct bar tmp;
|
||||||
|
TALLOC_CTX *out_mem_ctx;
|
||||||
|
NTSTATUS (*dispatch_recv)(struct tevent_req *req, TALLOC_CTX *mem_ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
static void rpccli_bar_done(struct tevent_req *subreq);
|
||||||
|
|
||||||
|
struct tevent_req *rpccli_bar_send(TALLOC_CTX *mem_ctx,
|
||||||
|
struct tevent_context *ev,
|
||||||
|
struct rpc_pipe_client *cli)
|
||||||
|
{
|
||||||
|
struct tevent_req *req;
|
||||||
|
struct rpccli_bar_state *state;
|
||||||
|
struct tevent_req *subreq;
|
||||||
|
|
||||||
|
req = tevent_req_create(mem_ctx, &state,
|
||||||
|
struct rpccli_bar_state);
|
||||||
|
if (req == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
state->out_mem_ctx = NULL;
|
||||||
|
state->dispatch_recv = cli->dispatch_recv;
|
||||||
|
|
||||||
|
/* In parameters */
|
||||||
|
|
||||||
|
/* Out parameters */
|
||||||
|
|
||||||
|
if (DEBUGLEVEL >= 10) {
|
||||||
|
NDR_PRINT_IN_DEBUG(bar, &state->orig);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make a temporary copy, that we pass to the dispatch function */
|
||||||
|
state->tmp = state->orig;
|
||||||
|
|
||||||
|
subreq = cli->dispatch_send(state, ev, cli,
|
||||||
|
&ndr_table_foo,
|
||||||
|
NDR_BAR,
|
||||||
|
&state->tmp);
|
||||||
|
if (tevent_req_nomem(subreq, req)) {
|
||||||
|
return tevent_req_post(req, ev);
|
||||||
|
}
|
||||||
|
tevent_req_set_callback(subreq, rpccli_bar_done, req);
|
||||||
|
return req;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rpccli_bar_done(struct tevent_req *subreq)
|
||||||
|
{
|
||||||
|
struct tevent_req *req = tevent_req_callback_data(
|
||||||
|
subreq, struct tevent_req);
|
||||||
|
struct rpccli_bar_state *state = tevent_req_data(
|
||||||
|
req, struct rpccli_bar_state);
|
||||||
|
NTSTATUS status;
|
||||||
|
TALLOC_CTX *mem_ctx;
|
||||||
|
|
||||||
|
if (state->out_mem_ctx) {
|
||||||
|
mem_ctx = state->out_mem_ctx;
|
||||||
|
} else {
|
||||||
|
mem_ctx = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = state->dispatch_recv(subreq, mem_ctx);
|
||||||
|
TALLOC_FREE(subreq);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
tevent_req_nterror(req, status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy out parameters */
|
||||||
|
|
||||||
|
/* Reset temporary structure */
|
||||||
|
ZERO_STRUCT(state->tmp);
|
||||||
|
|
||||||
|
if (DEBUGLEVEL >= 10) {
|
||||||
|
NDR_PRINT_OUT_DEBUG(bar, &state->orig);
|
||||||
|
}
|
||||||
|
|
||||||
|
tevent_req_done(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS rpccli_bar_recv(struct tevent_req *req,
|
||||||
|
TALLOC_CTX *mem_ctx)
|
||||||
|
{
|
||||||
|
struct rpccli_bar_state *state = tevent_req_data(
|
||||||
|
req, struct rpccli_bar_state);
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
|
if (tevent_req_is_nterror(req, &status)) {
|
||||||
|
tevent_req_received(req);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Steal possbile out parameters to the callers context */
|
||||||
|
talloc_steal(mem_ctx, state->out_mem_ctx);
|
||||||
|
|
||||||
|
tevent_req_received(req);
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS rpccli_bar(struct rpc_pipe_client *cli,
|
||||||
TALLOC_CTX *mem_ctx)
|
TALLOC_CTX *mem_ctx)
|
||||||
{
|
{
|
||||||
\tstruct bar r;
|
\tstruct bar r;
|
||||||
|
@ -73,7 +173,117 @@ $x = new Parse::Pidl::Samba3::ClientNDR();
|
||||||
$fn = { NAME => "bar", ELEMENTS => [ ], RETURN_TYPE => "WERROR" };
|
$fn = { NAME => "bar", ELEMENTS => [ ], RETURN_TYPE => "WERROR" };
|
||||||
$x->ParseFunction("foo", $fn);
|
$x->ParseFunction("foo", $fn);
|
||||||
is($x->{res},
|
is($x->{res},
|
||||||
"NTSTATUS rpccli_bar(struct rpc_pipe_client *cli,
|
"struct rpccli_bar_state {
|
||||||
|
struct bar orig;
|
||||||
|
struct bar tmp;
|
||||||
|
TALLOC_CTX *out_mem_ctx;
|
||||||
|
NTSTATUS (*dispatch_recv)(struct tevent_req *req, TALLOC_CTX *mem_ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
static void rpccli_bar_done(struct tevent_req *subreq);
|
||||||
|
|
||||||
|
struct tevent_req *rpccli_bar_send(TALLOC_CTX *mem_ctx,
|
||||||
|
struct tevent_context *ev,
|
||||||
|
struct rpc_pipe_client *cli)
|
||||||
|
{
|
||||||
|
struct tevent_req *req;
|
||||||
|
struct rpccli_bar_state *state;
|
||||||
|
struct tevent_req *subreq;
|
||||||
|
|
||||||
|
req = tevent_req_create(mem_ctx, &state,
|
||||||
|
struct rpccli_bar_state);
|
||||||
|
if (req == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
state->out_mem_ctx = NULL;
|
||||||
|
state->dispatch_recv = cli->dispatch_recv;
|
||||||
|
|
||||||
|
/* In parameters */
|
||||||
|
|
||||||
|
/* Out parameters */
|
||||||
|
|
||||||
|
/* Result */
|
||||||
|
ZERO_STRUCT(state->orig.out.result);
|
||||||
|
|
||||||
|
if (DEBUGLEVEL >= 10) {
|
||||||
|
NDR_PRINT_IN_DEBUG(bar, &state->orig);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make a temporary copy, that we pass to the dispatch function */
|
||||||
|
state->tmp = state->orig;
|
||||||
|
|
||||||
|
subreq = cli->dispatch_send(state, ev, cli,
|
||||||
|
&ndr_table_foo,
|
||||||
|
NDR_BAR,
|
||||||
|
&state->tmp);
|
||||||
|
if (tevent_req_nomem(subreq, req)) {
|
||||||
|
return tevent_req_post(req, ev);
|
||||||
|
}
|
||||||
|
tevent_req_set_callback(subreq, rpccli_bar_done, req);
|
||||||
|
return req;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rpccli_bar_done(struct tevent_req *subreq)
|
||||||
|
{
|
||||||
|
struct tevent_req *req = tevent_req_callback_data(
|
||||||
|
subreq, struct tevent_req);
|
||||||
|
struct rpccli_bar_state *state = tevent_req_data(
|
||||||
|
req, struct rpccli_bar_state);
|
||||||
|
NTSTATUS status;
|
||||||
|
TALLOC_CTX *mem_ctx;
|
||||||
|
|
||||||
|
if (state->out_mem_ctx) {
|
||||||
|
mem_ctx = state->out_mem_ctx;
|
||||||
|
} else {
|
||||||
|
mem_ctx = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = state->dispatch_recv(subreq, mem_ctx);
|
||||||
|
TALLOC_FREE(subreq);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
tevent_req_nterror(req, status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy out parameters */
|
||||||
|
|
||||||
|
/* Copy result */
|
||||||
|
state->orig.out.result = state->tmp.out.result;
|
||||||
|
|
||||||
|
/* Reset temporary structure */
|
||||||
|
ZERO_STRUCT(state->tmp);
|
||||||
|
|
||||||
|
if (DEBUGLEVEL >= 10) {
|
||||||
|
NDR_PRINT_OUT_DEBUG(bar, &state->orig);
|
||||||
|
}
|
||||||
|
|
||||||
|
tevent_req_done(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS rpccli_bar_recv(struct tevent_req *req,
|
||||||
|
TALLOC_CTX *mem_ctx,
|
||||||
|
WERROR *result)
|
||||||
|
{
|
||||||
|
struct rpccli_bar_state *state = tevent_req_data(
|
||||||
|
req, struct rpccli_bar_state);
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
|
if (tevent_req_is_nterror(req, &status)) {
|
||||||
|
tevent_req_received(req);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Steal possbile out parameters to the callers context */
|
||||||
|
talloc_steal(mem_ctx, state->out_mem_ctx);
|
||||||
|
|
||||||
|
/* Return result */
|
||||||
|
*result = state->orig.out.result;
|
||||||
|
|
||||||
|
tevent_req_received(req);
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS rpccli_bar(struct rpc_pipe_client *cli,
|
||||||
TALLOC_CTX *mem_ctx,
|
TALLOC_CTX *mem_ctx,
|
||||||
WERROR *werror)
|
WERROR *werror)
|
||||||
{
|
{
|
||||||
|
|
|
@ -71,7 +71,7 @@ is(0, scalar_is_reference({TYPE => "STRUCT", NAME => "echo_foobar"}));
|
||||||
|
|
||||||
is("uint8", enum_type_fn({TYPE => "ENUM", PARENT=>{PROPERTIES => {enum8bit => 1}}}));
|
is("uint8", enum_type_fn({TYPE => "ENUM", PARENT=>{PROPERTIES => {enum8bit => 1}}}));
|
||||||
is("uint32", enum_type_fn({TYPE => "ENUM", PARENT=>{PROPERTIES => {v1_enum => 1}}}));
|
is("uint32", enum_type_fn({TYPE => "ENUM", PARENT=>{PROPERTIES => {v1_enum => 1}}}));
|
||||||
is("uint16", enum_type_fn({TYPE => "ENUM", PARENT=>{PROPERTIES => {}}}));
|
is("uint1632", enum_type_fn({TYPE => "ENUM", PARENT=>{PROPERTIES => {}}}));
|
||||||
|
|
||||||
is("uint8", bitmap_type_fn({TYPE => "BITMAP", PROPERTIES => {bitmap8bit => 1}}));
|
is("uint8", bitmap_type_fn({TYPE => "BITMAP", PROPERTIES => {bitmap8bit => 1}}));
|
||||||
is("uint16", bitmap_type_fn({TYPE => "BITMAP", PROPERTIES => {bitmap16bit => 1}}));
|
is("uint16", bitmap_type_fn({TYPE => "BITMAP", PROPERTIES => {bitmap16bit => 1}}));
|
||||||
|
|
Loading…
Reference in New Issue