📄 dump.pm
字号:
#################################################### dump function for IDL structures# Copyright tridge@samba.org 2000# Copyright jelmer@samba.org 2005# released under the GNU GPL=pod=head1 NAMEParse::Pidl::Dump - Dump support=head1 DESCRIPTIONThis module provides functions that can generate IDL code from internal pidl data structures.=cutpackage Parse::Pidl::Dump;use Exporter;use vars qw($VERSION);$VERSION = '0.01';@ISA = qw(Exporter);@EXPORT_OK = qw(DumpType DumpTypedef DumpStruct DumpEnum DumpBitmap DumpUnion DumpFunction);use strict;use Parse::Pidl::Util qw(has_property);my($res);###################################################################### dump a properties listsub DumpProperties($){ my($props) = shift; my $res = ""; foreach my $d ($props) { foreach my $k (keys %{$d}) { if ($k eq "in") { $res .= "[in] "; next; } if ($k eq "out") { $res .= "[out] "; next; } if ($k eq "ref") { $res .= "[ref] "; next; } $res .= "[$k($d->{$k})] "; } } return $res;}###################################################################### dump a structure elementsub DumpElement($){ my($element) = shift; my $res = ""; (defined $element->{PROPERTIES}) && ($res .= DumpProperties($element->{PROPERTIES})); $res .= DumpType($element->{TYPE}); $res .= " "; for my $i (1..$element->{POINTERS}) { $res .= "*"; } $res .= "$element->{NAME}"; foreach (@{$element->{ARRAY_LEN}}) { $res .= "[$_]"; } return $res;}###################################################################### dump a structsub DumpStruct($){ my($struct) = shift; my($res); $res .= "struct "; if ($struct->{NAME}) { $res.="$struct->{NAME} "; } $res.="{\n"; if (defined $struct->{ELEMENTS}) { foreach (@{$struct->{ELEMENTS}}) { $res .= "\t" . DumpElement($_) . ";\n"; } } $res .= "}"; return $res;}###################################################################### dump a structsub DumpEnum($){ my($enum) = shift; my($res); $res .= "enum {\n"; foreach (@{$enum->{ELEMENTS}}) { if (/^([A-Za-z0-9_]+)[ \t]*\((.*)\)$/) { $res .= "\t$1 = $2,\n"; } else { $res .= "\t$_,\n"; } } $res.= "}"; return $res;}###################################################################### dump a structsub DumpBitmap($){ my($bitmap) = shift; my($res); $res .= "bitmap {\n"; foreach (@{$bitmap->{ELEMENTS}}) { if (/^([A-Za-z0-9_]+)[ \t]*\((.*)\)$/) { $res .= "\t$1 = $2,\n"; } else { die ("Bitmap $bitmap->{NAME} has field $_ without proper value"); } } $res.= "}"; return $res;}###################################################################### dump a union elementsub DumpUnionElement($){ my($element) = shift; my($res); if (has_property($element, "default")) { $res .= "[default] ;\n"; } else { $res .= "[case($element->{PROPERTIES}->{case})] "; $res .= DumpElement($element), if defined($element); $res .= ";\n"; } return $res;}###################################################################### dump a unionsub DumpUnion($){ my($union) = shift; my($res); (defined $union->{PROPERTIES}) && ($res .= DumpProperties($union->{PROPERTIES})); $res .= "union {\n"; foreach my $e (@{$union->{ELEMENTS}}) { $res .= DumpUnionElement($e); } $res .= "}"; return $res;}###################################################################### dump a typesub DumpType($){ my($data) = shift; if (ref($data) eq "HASH") { return DumpStruct($data) if ($data->{TYPE} eq "STRUCT"); return DumpUnion($data) if ($data->{TYPE} eq "UNION"); return DumpEnum($data) if ($data->{TYPE} eq "ENUM"); return DumpBitmap($data) if ($data->{TYPE} eq "BITMAP"); } else { return $data; }}###################################################################### dump a typedefsub DumpTypedef($){ my($typedef) = shift; my($res); $res .= "typedef "; $res .= DumpType($typedef->{DATA}); $res .= " $typedef->{NAME};\n\n"; return $res;}###################################################################### dump a typedefsub DumpFunction($){ my($function) = shift; my($first) = 1; my($res); $res .= DumpType($function->{RETURN_TYPE}); $res .= " $function->{NAME}(\n"; for my $d (@{$function->{ELEMENTS}}) { unless ($first) { $res .= ",\n"; } $first = 0; $res .= DumpElement($d); } $res .= "\n);\n\n"; return $res;}###################################################################### dump a module headersub DumpInterfaceProperties($){ my($header) = shift; my($data) = $header->{DATA}; my($first) = 1; my($res); $res .= "[\n"; foreach my $k (keys %{$data}) { $first || ($res .= ",\n"); $first = 0; $res .= "$k($data->{$k})"; } $res .= "\n]\n"; return $res;}###################################################################### dump the interface definitionssub DumpInterface($){ my($interface) = shift; my($data) = $interface->{DATA}; my($res); $res .= DumpInterfaceProperties($interface->{PROPERTIES}); $res .= "interface $interface->{NAME}\n{\n"; foreach my $d (@{$data}) { ($d->{TYPE} eq "TYPEDEF") && ($res .= DumpTypedef($d)); ($d->{TYPE} eq "FUNCTION") && ($res .= DumpFunction($d)); } $res .= "}\n"; return $res;}###################################################################### dump a parsed IDL structure back into an IDL filesub Dump($){ my($idl) = shift; my($res); $res = "/* Dumped by pidl */\n\n"; foreach my $x (@{$idl}) { ($x->{TYPE} eq "INTERFACE") && ($res .= DumpInterface($x)); } return $res;}1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -