1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

r5422: Fix ethereal parser generator.

(This used to be commit f5224d40c0)
This commit is contained in:
Jelmer Vernooij 2005-02-16 21:40:55 +00:00 committed by Gerald (Jerry) Carter
parent 12d4b8a951
commit 01af8299ec
2 changed files with 94 additions and 94 deletions

View File

@ -6,6 +6,7 @@
package IdlEParser;
use ndr;
use strict;
# the list of needed functions
@ -170,7 +171,7 @@ sub NeededFunction($)
$e->{PARENT} = $fn;
$needed{"pull_$e->{TYPE}"} = 1;
if (util::is_scalar_type($e->{TYPE})) {
if (NdrParser::is_scalar_type($e->{TYPE})) {
if (defined($e->{ARRAY_LEN}) or
util::has_property($e, "size_is")) {
@ -232,96 +233,90 @@ sub NeededTypedef($)
if ($t->{DATA}->{TYPE} eq "STRUCT") {
for my $e (@{$t->{DATA}->{ELEMENTS}}) {
$e->{PARENT} = $t->{DATA};
if ($needed{"pull_$t->{NAME}"}) {
$needed{"pull_$e->{TYPE}"} = 1;
}
if (util::is_scalar_type($e->{TYPE})) {
if (defined($e->{ARRAY_LEN}) or
util::has_property($e, "size_is")) {
# Arrays of scalar types are FT_BYTES
$needed{"hf_$t->{NAME}_$e->{NAME}_array"} = {
'name' => field2name($e->{NAME}),
'type' => $e->{TYPE},
'ft' => "FT_BYTES",
'base' => elementbase($e)
};
} else {
$needed{"hf_$t->{NAME}_$e->{NAME}"} = {
'name' => field2name($e->{NAME}),
'type' => $e->{TYPE},
'ft' => type2ft($e->{TYPE}),
'base' => elementbase($e)
};
}
$e->{PARENT} = $t->{DATA};
if ($needed{"pull_$t->{NAME}"}) {
$needed{"pull_$e->{TYPE}"} = 1;
}
} else {
$needed{"ett_$e->{TYPE}"} = 1;
}
}
}
if ($t->{DATA}->{TYPE} eq "UNION") {
for my $e (@{$t->{DATA}->{ELEMENTS}}) {
$e->{PARENT} = $t->{DATA};
if ($e->{TYPE} eq "UNION_ELEMENT") {
if ($needed{"pull_$t->{NAME}"}) {
$needed{"pull_$e->{TYPE}"} = 1;
}
if ($needed{"pull_$t->{NAME}"}) {
$needed{"pull_$e->{ELEMENTS}->{TYPE}"} = 1;
if (NdrParser::is_scalar_type($e->{TYPE})) {
if (defined($e->{ARRAY_LEN}) or
util::has_property($e, "size_is")) {
# Arrays of scalar types are FT_BYTES
$needed{"hf_$t->{NAME}_$e->{NAME}_array"} = {
'name' => field2name($e->{NAME}),
'type' => $e->{TYPE},
'ft' => "FT_BYTES",
'base' => elementbase($e)
};
} else {
$needed{"hf_$t->{NAME}_$e->{NAME}"} = {
'name' => field2name($e->{NAME}),
'type' => $e->{TYPE},
'ft' => type2ft($e->{TYPE}),
'base' => elementbase($e)
};
}
$needed{"ett_$e->{ELEMENTS}{TYPE}"} = 1;
$e->{PARENT} = $t->{DATA};
if ($needed{"pull_$t->{NAME}"}) {
$needed{"pull_$e->{TYPE}"} = 1;
}
} else {
$needed{"ett_$e->{TYPE}"} = 1;
}
}
}
$needed{"ett_$t->{NAME}"} = 1;
if ($t->{DATA}->{TYPE} eq "UNION") {
for my $e (@{$t->{DATA}->{ELEMENTS}}) {
$e->{PARENT} = $t->{DATA};
if ($needed{"pull_$t->{NAME}"}) {
$needed{"pull_$e->{TYPE}"} = 1;
}
$needed{"ett_$e->{TYPE}"} = 1;
}
$needed{"ett_$t->{NAME}"} = 1;
}
if ($t->{DATA}->{TYPE} eq "ENUM") {
$needed{"hf_$t->{NAME}"} = {
'name' => field2name($t->{NAME}),
'ft' => 'FT_UINT16',
'base' => 'BASE_DEC',
'strings' => "VALS($t->{NAME}_vals)"
$needed{"hf_$t->{NAME}"} = {
'name' => field2name($t->{NAME}),
'ft' => 'FT_UINT16',
'base' => 'BASE_DEC',
'strings' => "VALS($t->{NAME}_vals)"
};
}
if ($t->{DATA}->{TYPE} eq "BITMAP") {
$bitmaps{$t->{NAME}} = $t;
$bitmaps{$t->{NAME}} = $t;
foreach my $e (@{$t->{DATA}{ELEMENTS}}) {
$e =~ /^(.*?) \( (.*?) \)$/;
$needed{"hf_$t->{NAME}_$1"} = {
'name' => "$1",
'ft' => "FT_BOOLEAN",
'base' => bitmapbase($t),
'bitmask' => "$2"
};
}
foreach my $e (@{$t->{DATA}{ELEMENTS}}) {
$e =~ /^(.*?) \( (.*?) \)$/;
$needed{"hf_$t->{NAME}_$1"} = {
'name' => "$1",
'ft' => "FT_BOOLEAN",
'base' => bitmapbase($t),
'bitmask' => "$2"
};
}
$needed{"ett_$t->{NAME}"} = 1;
$needed{"ett_$t->{NAME}"} = 1;
}
}
@ -418,6 +413,8 @@ sub RewriteHeader($$$)
my($input) = shift;
my($output) = shift;
NdrParser::Load($idl);
%needed = ();
# Open files
@ -455,7 +452,7 @@ sub RewriteHeader($$$)
# Bitmaps
s/(uint32_t \*r\);)/pidl_tree *tree, int hf, $1/smg;
s/int ndr_flags, (pidl_tree \*tree), (uint32_t \*r\);)/$1, int hf, $2/smg;
pidl $_;
}
@ -471,6 +468,8 @@ sub RewriteC($$$)
my($input) = shift;
my($output) = shift;
NdrParser::Load($idl);
# Open files
open(IN, "<$input") || die "can't open $input for reading";
@ -591,9 +590,9 @@ sub RewriteC($$$)
# of adding a couple of parameters to each function call.
#
# Add proto tree and name argument to ndr_pull_ptr() calls.
# Add proto tree and name argument to ndr_pull_unique_ptr() calls.
s/(ndr_pull_ptr\(ndr,\ (&_ptr_([^\)]*?))\);)
s/(ndr_pull_unique_ptr\(ndr,\ (&_ptr_([^\)]*?))\);)
/ndr_pull_ptr(ndr, tree, "$3", $2);/smgx;
# Wrap ndr_pull_array_size() and ndr_pull_array_length()
@ -620,28 +619,28 @@ sub RewriteC($$$)
(.*?)\);) # Number of elements
/ndr_pull_array_$2( ndr, $3, tree, hf_${cur_fn}_$7_array, $4, $8);/smgx;
# Save ndr_pull_relative{1,2}() calls from being wrapped by the
# Save ndr_pull_relative_ptr{1,2}() calls from being wrapped by the
# proceeding regexp by adding a leading space.
s/ndr_pull_(relative1|relative2)\((.*?)\);/
s/ndr_pull_(relative_ptr1|relative_ptr2)\((.*?)\);/
ndr_pull_$1( $2);/smgx;
# Enums
s/(^static\ NTSTATUS\ ndr_pull_(.+?),\ (enum\ .+?)\))
s/(^static\ NTSTATUS\ ndr_pull_(.+?),\ int\ ndr_flags,\ (enum\ .+?)\))
/static NTSTATUS ndr_pull_$2, pidl_tree *tree, int hf, $3)/smgx;
s/uint(8|16|32) v;/uint$1_t v;/smg;
s/(ndr_pull_([^\(]+?)\(ndr,\ &_level\);)
s/(ndr_pull_([^\(]+?)\(ndr,\ NDR_[^,]*,\ &_level\);)
/ndr_pull_$2(ndr, tree, hf_${cur_fn}_level, &_level);/smgx;
# Bitmaps
s/(^(static\ )?NTSTATUS\ ndr_pull_(.+?),\ uint(8|16|32)\ \*r\))
s/(^(static\ )?NTSTATUS\ ndr_pull_(.+?),\ int\ ndr_flags,\ uint(8|16|32)_t\ \*r\))
/NTSTATUS ndr_pull_$3, pidl_tree *tree, int hf, uint$4_t *r)/smgx;
if (/ndr_pull_([^\)]*?)\(ndr, &v\);/) {
if (/ndr_pull_([^\)]*?)\(ndr,\ NDR_[^,]*,\ &v\);/) {
s/(ndr_pull_([^\)]*?)\(ndr,\ &v\);)
s/(ndr_pull_([^\)]*?)\(ndr,\ (NDR_[^,]*?),\ &v\);)
/ndr_pull_$2(ndr, tree, hf, &v);/smgx;
pidl $_;
@ -665,7 +664,7 @@ sub RewriteC($$$)
# ndr_pull_uint32(ndr, &r->in.access_mask);
# ndr_pull_uint32(ndr, &r->idx);
if (/(ndr_pull_([^\)]*?)\(ndr, (&?r->((in|out)\.)?([^\)]*?))\);)/) {
if (/(ndr_pull_([^\)]*?)\(ndr, NDR_[^,]*?, (&?r->((in|out)\.)?([^\)]*?))\);)/ and NdrParser::is_scalar_type($2)) {
my $pull_type = "${cur_fn}_$6";
@ -673,9 +672,10 @@ sub RewriteC($$$)
$pull_type = "$2";
}
s/(ndr_pull_([^\)]*?)
\(ndr,\
(&?r->((in|out)\.)? # Function args contain leading junk
s/(ndr_pull_([^\)]*?)\(
ndr,\
NDR_[^,]*?,\
(&?r->((in|out)\.)? # Function args contain leading junk
([^\)]*?)) # Element name
\);)
/ndr_pull_$2(ndr, tree, hf_$pull_type, $3);/smgx;
@ -685,7 +685,8 @@ sub RewriteC($$$)
# array sizes, levels, etc.
s/(ndr_pull_(uint32|uint16)\(
ndr,\
ndr,\
NDR_[^,]*?,\
(&_([^\)]*?)) # Internal arg names have leading underscore
\);)
/ndr_pull_$2(ndr, tree, hf_$4, $3);/smgx;
@ -695,11 +696,11 @@ sub RewriteC($$$)
# ndr_pull_string(ndr, NDR_SCALARS|NDR_BUFFERS, &r->command);
# ndr_pull_atsvc_enum_ctr(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.ctr);
# Three argument version is for structures
# Three argument version is for structures
if (/ndr_pull([^\)]*?)\(ndr, (NDR_[^,]*?), ([^,]*?)\);/) {
s/(ndr_pull_([^\)]*?)\(
if (/ndr_pull_([^\)]*?)\(ndr, (NDR_[^,]*?), ([^,]*?)\);/ and
not NdrParser::is_scalar_type($1)) {
s/(ndr_pull_([^\)]*?)\(
ndr,\
(NDR_[^,]*?),\
(&?r->((in|out)\.)?([^\(].*?))\);)
@ -707,9 +708,9 @@ sub RewriteC($$$)
/smgx;
}
# Four argument version if for unions
if (/ndr_pull([^\)]*?)\(ndr, (NDR_[SB][^,]*?), ([^,]*?), ([^,]*?)\);/) {
# Four argument version if for unions
if (/ndr_pull_([^\)]*?)\(ndr, (NDR_[SB][^,]*?), ([^,]*?), ([^,]*?)\);/ and
not NdrParser::is_scalar_type($1)) {
s/(ndr_pull_([^\)]*?)\(
ndr,\
(NDR_[^,]*?),\

View File

@ -43,6 +43,7 @@ sub RegisterPrimitives()
"DATA_BLOB" => 4,
"error_status_t" => 4,
"WERROR" => 4,
"NTSTATUS" => 4,
"boolean32" => 4,
"unsigned32" => 4,
"ipv4address" => 4,
@ -848,7 +849,6 @@ sub ParseElementPrintBuffer($$)
}
}
#####################################################################
# parse buffers in a structure element - pull side
sub ParseElementPullBuffer($$$)
@ -960,7 +960,6 @@ sub ParseStructPush($)
end_flags($struct);
}
#####################################################################
# generate a push function for an enum
sub ParseEnumPush($)