📄 pidl
字号:
=head1 AUTHORpidl was written by Andrew Tridgell, Stefan Metzmacher, Tim Potter and Jelmer Vernooij. The current maintainer is Jelmer Vernooij.This manpage was written by Jelmer Vernooij, partially based on the original pidl README by Andrew Tridgell. =cutuse strict;use FindBin qw($RealBin $Script);use lib "$RealBin/lib";use lib "$RealBin/../share/perl5";use Getopt::Long;use File::Basename;use Parse::Pidl qw ( $VERSION );use Parse::Pidl::Util;###################################################################### save a data structure into a filesub SaveStructure($$){ my($filename,$v) = @_; FileSave($filename, Parse::Pidl::Util::MyDumper($v));}###################################################################### load a data structure from a file (as saved with SaveStructure)sub LoadStructure($){ my $f = shift; my $contents = FileLoad($f); defined $contents || return undef; return eval "$contents";}###################################################################### read a file into a stringsub FileLoad($){ my($filename) = shift; local(*INPUTFILE); open(INPUTFILE, $filename) || return undef; my($saved_delim) = $/; undef $/; my($data) = <INPUTFILE>; close(INPUTFILE); $/ = $saved_delim; return $data;}###################################################################### write a string into a filesub FileSave($$){ my($filename) = shift; my($v) = shift; local(*FILE); open(FILE, ">$filename") || die "can't open $filename"; print FILE $v; close(FILE);}my(@opt_incdirs) = (); my($opt_help) = 0;my($opt_version) = 0;my($opt_parse_idl_tree) = 0;my($opt_dump_idl_tree);my($opt_dump_ndr_tree);my($opt_dump_idl) = 0;my($opt_diff) = 0;my($opt_header);my($opt_samba3_header);my($opt_samba3_parser);my($opt_samba3_server);my($opt_samba3_ndr_client);my($opt_samba3_ndr_server);my($opt_template) = 0;my($opt_client);my($opt_typelib);my($opt_server);my($opt_ndr_parser);my($opt_tdr_parser);my($opt_ws_parser);my($opt_swig);my($opt_ejs);my($opt_python);my($opt_quiet) = 0;my($opt_outputdir) = '.';my($opt_verbose) = 0;my($opt_warn_compat) = 0;########################################## display help textsub ShowHelp(){print "perl IDL parser and code generator\n";ShowVersion();print"Copyright (C) Andrew Tridgell <tridge\@samba.org>Copyright (C) Jelmer Vernooij <jelmer\@samba.org>Usage: $Script [options] [--] <idlfile> [<idlfile>...]Generic Options: --help this help page --version show pidl version --outputdir=OUTDIR put output in OUTDIR/ [.] --warn-compat warn about incompatibility with other compilers --quiet be quiet --verbose be verbose --includedir DIR search DIR for included filesDebugging: --dump-idl-tree[=FILE] dump internal representation to file [BASENAME.pidl] --parse-idl-tree read internal representation instead of IDL --dump-ndr-tree[=FILE] dump internal NDR data tree to file [BASENAME.ndr] --dump-idl regenerate IDL file --diff run diff on original IDL and dumped output --typelib print type informationSamba 4 output: --header[=OUTFILE] create generic header file [BASENAME.h] --ndr-parser[=OUTFILE] create a C NDR parser [ndr_BASENAME.c] --client[=OUTFILE] create a C NDR client [ndr_BASENAME_c.c] --tdr-parser[=OUTFILE] create a C TDR parser [tdr_BASENAME.c] --ejs[=OUTFILE] create ejs wrapper file [BASENAME_ejs.c] --python[=OUTFILE] create python wrapper file [py_BASENAME.c] --swig[=OUTFILE] create swig wrapper file [BASENAME.i] --server[=OUTFILE] create server boilerplate [ndr_BASENAME_s.c] --template print a template for a pipeSamba 3 output: --samba3-ndr-client[=OUTF] create client calls for Samba3 using Samba4's NDR code [cli_BASENAME.c] --samba3-ndr-server[=OUTF] create server call wrapper for Samba3 using Samba4's NDR code [srv_BASENAME.c]Wireshark parsers: --ws-parser[=OUTFILE] create Wireshark parser and header\n"; exit(0);}########################################## Display versionsub ShowVersion(){ print "perl IDL version $VERSION\n";}# main programmy $result = GetOptions ( 'help|h|?' => \$opt_help, 'version' => \$opt_version, 'outputdir=s' => \$opt_outputdir, 'dump-idl' => \$opt_dump_idl, 'dump-idl-tree:s' => \$opt_dump_idl_tree, 'parse-idl-tree' => \$opt_parse_idl_tree, 'dump-ndr-tree:s' => \$opt_dump_ndr_tree, 'samba3-ndr-client:s' => \$opt_samba3_ndr_client, 'samba3-ndr-server:s' => \$opt_samba3_ndr_server, 'header:s' => \$opt_header, 'server:s' => \$opt_server, 'typelib:s' => \$opt_typelib, 'tdr-parser:s' => \$opt_tdr_parser, 'template' => \$opt_template, 'ndr-parser:s' => \$opt_ndr_parser, 'client:s' => \$opt_client, 'ws-parser:s' => \$opt_ws_parser, 'ejs' => \$opt_ejs, 'python' => \$opt_python, 'diff' => \$opt_diff, 'swig:s' => \$opt_swig, 'quiet' => \$opt_quiet, 'verbose' => \$opt_verbose, 'warn-compat' => \$opt_warn_compat, 'includedir=s@' => \@opt_incdirs );if (not $result) { exit(1);}if ($opt_help) { ShowHelp(); exit(0);}if ($opt_version) { ShowVersion(); exit(0);}sub process_file($){ my $idl_file = shift; my $outputdir = $opt_outputdir; my $pidl; my $ndr; my $basename = basename($idl_file, ".idl"); unless ($opt_quiet) { print "Compiling $idl_file\n"; } if ($opt_parse_idl_tree) { $pidl = LoadStructure($idl_file); defined $pidl || die "Failed to load $idl_file"; } else { require Parse::Pidl::IDL; $pidl = Parse::Pidl::IDL::parse_file($idl_file, \@opt_incdirs); defined @$pidl || die "Failed to parse $idl_file"; require Parse::Pidl::Typelist; Parse::Pidl::Typelist::LoadIdl($pidl); } if (defined($opt_dump_idl_tree)) { my($pidl_file) = ($opt_dump_idl_tree or "$outputdir/$basename.pidl"); SaveStructure($pidl_file, $pidl) or die "Failed to save $pidl_file\n"; } if ($opt_dump_idl) { require Parse::Pidl::Dump; print Parse::Pidl::Dump($pidl); } if ($opt_diff) { my($tempfile) = "$outputdir/$basename.tmp"; FileSave($tempfile, IdlDump::Dump($pidl)); system("diff -wu $idl_file $tempfile"); unlink($tempfile); } if ($opt_warn_compat) { require Parse::Pidl::Compat; Parse::Pidl::Compat::Check($pidl); } if (defined($opt_ws_parser) or defined($opt_client) or defined($opt_server) or defined($opt_header) or defined($opt_ndr_parser) or defined($opt_ejs) or defined($opt_python) or defined($opt_dump_ndr_tree) or defined($opt_samba3_header) or defined($opt_samba3_parser) or defined($opt_samba3_server) or defined($opt_swig) or defined($opt_samba3_ndr_client) or defined($opt_samba3_ndr_server)) { require Parse::Pidl::NDR; $ndr = Parse::Pidl::NDR::Parse($pidl); } if (defined($opt_dump_ndr_tree)) { my($ndr_file) = ($opt_dump_ndr_tree or "$outputdir/$basename.ndr"); SaveStructure($ndr_file, $ndr) or die "Failed to save $ndr_file\n"; } my $gen_header = ($opt_header or "$outputdir/$basename.h"); if (defined($opt_header)) { require Parse::Pidl::Samba4::Header; FileSave($gen_header, Parse::Pidl::Samba4::Header::Parse($ndr)); } my $h_filename = "$outputdir/ndr_$basename.h"; if (defined($opt_client)) { require Parse::Pidl::Samba4::NDR::Client; my ($c_client) = ($opt_client or "$outputdir/ndr_$basename\_c.c"); my ($c_header) = $c_client; $c_header =~ s/\.c$/.h/; my ($srcd,$hdrd) = Parse::Pidl::Samba4::NDR::Client::Parse( $ndr,$gen_header,$h_filename,$c_header); FileSave($c_client, $srcd); FileSave($c_header, $hdrd); } if (defined($opt_swig)) { require Parse::Pidl::Samba4::SWIG; my($filename) = ($opt_swig or "$outputdir/$basename.i"); my $code = Parse::Pidl::Samba4::SWIG::Parse($ndr, $basename, "$outputdir/ndr_$basename\_c.h", $gen_header); FileSave($filename, $code); } if (defined($opt_ejs)) { require Parse::Pidl::Samba4::EJS; my $generator = new Parse::Pidl::Samba4::EJS(); my ($hdr,$prsr) = $generator->Parse($ndr, $h_filename); FileSave("$outputdir/ndr_$basename\_ejs.c", $prsr); FileSave("$outputdir/ndr_$basename\_ejs.h", $hdr); } if (defined($opt_python)) { require Parse::Pidl::Samba4::Python; my $generator = new Parse::Pidl::Samba4::Python(); my ($hdr,$prsr) = $generator->Parse($basename, $ndr, "$outputdir/ndr_$basename\_c.h", $h_filename); FileSave("$outputdir/py_$basename.c", $prsr); FileSave("$outputdir/py_$basename.h", $hdr); } if (defined($opt_server)) { require Parse::Pidl::Samba4::NDR::Server; FileSave(($opt_server or "$outputdir/ndr_$basename\_s.c"), Parse::Pidl::Samba4::NDR::Server::Parse($ndr,$h_filename)); } if (defined($opt_ndr_parser)) { my $parser_fname = ($opt_ndr_parser or "$outputdir/ndr_$basename.c"); require Parse::Pidl::Samba4::NDR::Parser; my $generator = new Parse::Pidl::Samba4::NDR::Parser(); my ($header,$parser) = $generator->Parse($ndr, $gen_header, $h_filename); FileSave($parser_fname, $parser); FileSave($h_filename, $header); } if (defined($opt_ws_parser)) { require Parse::Pidl::Wireshark::NDR; my($eparser) = ($opt_ws_parser or "$outputdir/packet-dcerpc-$basename.c"); my $eheader = $eparser; $eheader =~ s/\.c$/\.h/; my $cnffile = $idl_file; $cnffile =~ s/\.idl$/\.cnf/; my $generator = new Parse::Pidl::Wireshark::NDR(); my ($dp, $dh) = $generator->Parse($ndr, $idl_file, $eheader, $cnffile); FileSave($eparser, $dp) if defined($dp); FileSave($eheader, $dh) if defined($dh); } if (defined($opt_tdr_parser)) { my $tdr_parser = ($opt_tdr_parser or "$outputdir/tdr_$basename.c"); my $tdr_header = $tdr_parser; $tdr_header =~ s/\.c$/\.h/; require Parse::Pidl::Samba4::TDR; my $generator = new Parse::Pidl::Samba4::TDR(); my ($hdr,$prsr) = $generator->Parser($pidl, $tdr_header, $gen_header); FileSave($tdr_parser, $prsr); FileSave($tdr_header, $hdr); } if (defined($opt_typelib)) { my $typelib = ($opt_typelib or "$outputdir/$basename.tlb"); require Parse::Pidl::Typelist; FileSave($typelib, Parse::Pidl::Typelist::GenerateTypeLib()); } if ($opt_template) { require Parse::Pidl::Samba4::Template; print Parse::Pidl::Samba4::Template::Parse($pidl); } if (defined($opt_samba3_ndr_client)) { my $client = ($opt_samba3_ndr_client or "$outputdir/cli_$basename.c"); my $header = $client; $header =~ s/\.c$/\.h/; require Parse::Pidl::Samba3::ClientNDR; my $generator = new Parse::Pidl::Samba3::ClientNDR(); my ($c_code,$h_code) = $generator->Parse($ndr, $header, $h_filename); FileSave($client, $c_code); FileSave($header, $h_code); } if (defined($opt_samba3_ndr_server)) { my $server = ($opt_samba3_ndr_server or "$outputdir/srv_$basename.c"); my $header = $server; $header =~ s/\.c$/\.h/; require Parse::Pidl::Samba3::ServerNDR; my ($c_code,$h_code) = Parse::Pidl::Samba3::ServerNDR::Parse($ndr, $header, $h_filename); FileSave($server, $c_code); FileSave($header, $h_code); }}if (scalar(@ARGV) == 0) { print "$Script: no input files\n"; exit(1);}process_file($_) foreach (@ARGV);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -