diff options
Diffstat (limited to 'source4/build/pidl/dump.pm')
-rw-r--r-- | source4/build/pidl/dump.pm | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/source4/build/pidl/dump.pm b/source4/build/pidl/dump.pm new file mode 100644 index 0000000000..4d679c0653 --- /dev/null +++ b/source4/build/pidl/dump.pm @@ -0,0 +1,166 @@ +package IdlDump; + +use Data::Dumper; + +my($res); + +##################################################################### +# dump a properties list +sub DumpProperties($) +{ + my($props) = shift; + foreach my $d (@{$props}) { + if (ref($d) ne "HASH") { + $res .= "[$d] "; + } else { + foreach my $k (keys %{$d}) { + $res .= "[$k($d->{$k})] "; + } + } + } +} + +##################################################################### +# dump a structure element +sub DumpElement($) +{ + my($element) = shift; + (defined $element->{PROPERTIES}) && DumpProperties($element->{PROPERTIES}); + DumpType($element->{TYPE}); + $res .= " "; + if ($element->{POINTERS}) { + for (my($i)=0; $i < $element->{POINTERS}; $i++) { + $res .= "*"; + } + } + $res .= "$element->{NAME}"; + (defined $element->{ARRAY_LEN}) && ($res .= "[$element->{ARRAY_LEN}]"); +} + +##################################################################### +# dump a struct +sub DumpStruct($) +{ + my($struct) = shift; + $res .= "struct {\n"; + if (defined $struct->{ELEMENTS}) { + foreach my $e (@{$struct->{ELEMENTS}}) { + DumpElement($e); + $res .= ";\n"; + } + } + $res .= "}"; +} + + +##################################################################### +# dump a union element +sub DumpUnionElement($) +{ + my($element) = shift; + $res .= "[case($element->{CASE})] "; + DumpElement($element->{DATA}); + $res .= ";\n"; +} + +##################################################################### +# dump a union +sub DumpUnion($) +{ + my($union) = shift; + (defined $union->{PROPERTIES}) && DumpProperties($union->{PROPERTIES}); + $res .= "union {\n"; + foreach my $e (@{$union->{DATA}}) { + DumpUnionElement($e); + } + $res .= "}"; +} + +##################################################################### +# dump a type +sub DumpType($) +{ + my($data) = shift; + if (ref($data) eq "HASH") { + ($data->{TYPE} eq "STRUCT") && + DumpStruct($data); + ($data->{TYPE} eq "UNION") && + DumpUnion($data); + } else { + $res .= "$data"; + } +} + +##################################################################### +# dump a typedef +sub DumpTypedef($) +{ + my($typedef) = shift; + $res .= "typedef "; + DumpType($typedef->{DATA}); + $res .= " $typedef->{NAME};\n\n"; +} + +##################################################################### +# dump a typedef +sub DumpFunction($) +{ + my($function) = shift; + my($first) = 1; + DumpType($function->{RETURN_TYPE}); + $res .= " $function->{NAME}(\n"; + for my $d (@{$function->{DATA}}) { + $first || ($res .= ",\n"); $first = 0; + DumpElement($d); + } + $res .= "\n);\n\n"; +} + +##################################################################### +# dump a module header +sub DumpModuleHeader($) +{ + my($header) = shift; + my($data) = $header->{DATA}; + my($first) = 1; + $res .= "[\n"; + foreach my $k (keys %{$data}) { + $first || ($res .= ",\n"); $first = 0; + $res .= "$k($data->{$k})"; + } + $res .= "\n]\n"; +} + +##################################################################### +# dump the interface definitions +sub DumpInterface($) +{ + my($interface) = shift; + my($data) = $interface->{DATA}; + $res .= "interface $interface->{NAME}\n{\n"; + foreach my $d (@{$data}) { + ($d->{TYPE} eq "TYPEDEF") && + DumpTypedef($d); + ($d->{TYPE} eq "FUNCTION") && + DumpFunction($d); + } + $res .= "}\n"; +} + + +##################################################################### +# dump a parsed IDL structure back into an IDL file +sub Dump($) +{ + my($idl) = shift; + $res = "/* Dumped by pidl */\n\n"; + foreach my $x (@{$idl}) { + ($x->{TYPE} eq "MODULEHEADER") && + DumpModuleHeader($x); + ($x->{TYPE} eq "INTERFACE") && + DumpInterface($x); + } + return $res; +} + +1; |