Added --eparser to call ethereal parser generator.
[samba.git] / source4 / build / pidl / pidl.pl
1 #!/usr/bin/perl -w
2
3 ###################################################
4 # package to parse IDL files and generate code for 
5 # rpc functions in Samba
6 # Copyright tridge@samba.org 2000
7 # released under the GNU GPL
8
9 use strict;
10 use Getopt::Long;
11 use Data::Dumper;
12 use Parse::RecDescent;
13 use dump;
14 use header;
15 use parser;
16 use eparser;
17 use util;
18
19 my($opt_help) = 0;
20 my($opt_parse) = 0;
21 my($opt_dump) = 0;
22 my($opt_diff) = 0;
23 my($opt_header) = 0;
24 my($opt_parser) = 0;
25 my($opt_eparser) = 0;
26
27 #####################################################################
28 # parse an IDL file returning a structure containing all the data
29 sub IdlParse($)
30 {
31     # this autoaction allows us to handle simple nodes without an action
32 #    $::RD_TRACE = 1;
33     $::RD_AUTOACTION = q { 
34                           $#item==1 && ref($item[1]) eq "" ? 
35                           $item[1] : 
36                           "XX_" . $item[0] . "_XX[$#item]"  };
37     my($filename) = shift;
38     my($grammer) = util::FileLoad("idl.gram");    
39     my($parser) = Parse::RecDescent->new($grammer);
40     my($saved_sep) = $/;
41     undef $/;
42     my($idl) = $parser->idl(`cpp $filename`);
43     $/ = $saved_sep;
44     util::CleanData($idl);
45     return $idl;
46 }
47
48
49 #########################################
50 # display help text
51 sub ShowHelp()
52 {
53     print "
54            perl IDL parser and code generator
55            Copyright tridge\@samba.org
56
57            Usage: pidl.pl [options] <idlfile>
58
59            Options:
60              --help                this help page
61              --parse               parse a idl file to a .pidl file
62              --dump                dump a pidl file back to idl
63              --header              create a C header file
64              --parser              create a C parser
65              --eparser             create an ethereal parser
66              --diff                run diff on the idl and dumped output
67            \n";
68     exit(0);
69 }
70
71 # main program
72 GetOptions (
73             'help|h|?' => \$opt_help, 
74             'parse' => \$opt_parse,
75             'dump' => \$opt_dump,
76             'header' => \$opt_header,
77             'parser' => \$opt_parser,
78             'eparser' => \$opt_eparser,
79             'diff' => \$opt_diff
80             );
81
82 if ($opt_help) {
83     ShowHelp();
84     exit(0);
85 }
86
87 my($idl_file) = shift;
88 die "ERROR: You must specify an idl file to process" unless ($idl_file);
89
90 my($pidl_file) = util::ChangeExtension($idl_file, "pidl");
91
92 if ($opt_parse) {
93     print "Generating $pidl_file\n";
94     my($idl) = IdlParse($idl_file);
95     util::SaveStructure($pidl_file, $idl) || die "Failed to save $pidl_file";
96 }
97
98 if ($opt_dump) {
99     my($idl) = util::LoadStructure($pidl_file);
100     print IdlDump::Dump($idl);
101 }
102
103 if ($opt_header) {
104     my($idl) = util::LoadStructure($pidl_file);
105     my($header) = util::ChangeExtension($idl_file, "h");
106     print "Generating $header\n";
107     util::FileSave($header, IdlHeader::Dump($idl));
108 }
109
110 if ($opt_parser) {
111     my($idl) = util::LoadStructure($pidl_file);
112     my($parser) = util::ChangeExtension($idl_file, "c");
113     print "Generating $parser\n";
114     util::FileSave($parser, IdlParser::Parse($idl));
115 }
116
117 if ($opt_eparser) {
118     my($idl) = util::LoadStructure($pidl_file);
119     my($parser) = util::ChangeExtension($idl_file, "c");
120     print "Generating $parser for ethereal\n";
121     util::FileSave($parser, IdlEParser::Parse($idl));
122 }
123
124 if ($opt_diff) {
125     my($idl) = util::LoadStructure($pidl_file);
126     my($tempfile) = util::ChangeExtension($idl_file, "tmp");
127     util::FileSave($tempfile, IdlDump::Dump($idl));
128     system("diff -wu $idl_file $tempfile");
129     unlink($tempfile);
130 }