1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-11 16:58:40 +03:00

r9199: Another go at recursive flattening of structs.

This commit is contained in:
Tim Potter 2005-08-07 21:10:32 +00:00 committed by Gerald (Jerry) Carter
parent 07e39bd94c
commit a6541a0702

View File

@ -16,54 +16,47 @@ my $parser = new smb_interfaces;
$header = $parser->parse($file);
#
# Make second pass over tree to make it easier to process. Ugh - this
# is all done in place as the parser generates references.
# Make second pass over tree to make it easier to process.
#
my $newheader = [];
my @structs;
sub flatten_names($) {
sub flatten_structs($) {
my $obj = shift;
my $s = { %$obj };
# Map NAME, STRUCT_NAME and UNION_NAME elements into a more likeable
# property.
if ($obj->{TYPE} eq "struct" or $obj->{TYPE} eq "union") {
if (defined($obj->{STRUCT_NAME}) or defined($obj->{UNION_NAME})) {
# struct foo {};
# struct {} bar;
# struct foo {} bar;
$obj->{TYPE_NAME} = defined($obj->{STRUCT_NAME}) ? $obj->{STRUCT_NAME}
$s->{TYPE_DEFINED} = defined($obj->{STRUCT_NAME}) ? $obj->{STRUCT_NAME}
: $obj->{UNION_NAME};
delete $obj->{STRUCT_NAME};
delete $obj->{UNION_NAME};
delete $s->{STRUCT_NAME};
delete $s->{UNION_NAME};
}
# Convert DATA array to a hash by field name
foreach my $elt (@{$obj->{DATA}}) {
foreach my $name (@{$elt->{NAME}}) {
$obj->{FIELDS}{$name} = $elt;
$obj->{FIELDS}{$name}{NAME} = $name;
$obj->{FIELDS}{$name}{PARENT} = $obj;
my $new_elt = { %$elt };
$new_elt->{NAME} = $name;
push(@{$s->{FIELDS}}, flatten_structs($new_elt));
}
}
# Recurse down into substructures
delete $s->{DATA};
foreach my $elt (@{$obj->{DATA}}) {
flatten_names($elt);
}
delete $obj->{DATA};
return $s;
}
foreach my $s (@{$header}) { # For each parsed structure
flatten_names($s);
print Dumper(flatten_structs($s));
}
print Dumper(@structs);
exit;
#
# Generate header
#
@ -111,7 +104,7 @@ exit;
sub struct_name($)
{
my $obj = shift;
return defined($obj->{STRUCT_NAME}) ? $obj->{STRUCT_NAME} : $obj->{UNION_NAME};
return defined($obj->{STRUCT_NAE}) ? $obj->{STRUCT_NAME} : $obj->{UNION_NAME};
}
sub prototypes_for($)