r550: Remove clientfns.pm module - it was a bad idea.
[ira/wip.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-2003
7 # released under the GNU GPL
8
9 use strict;
10
11 use FindBin qw($RealBin);
12 use lib "$RealBin";
13 use lib "$RealBin/lib";
14 use Getopt::Long;
15 use File::Basename;
16 use idl;
17 use dump;
18 use header;
19 use server;
20 use parser;
21 use eparser;
22 use validator;
23 use util;
24 use template;
25
26 my($opt_help) = 0;
27 my($opt_parse) = 0;
28 my($opt_dump) = 0;
29 my($opt_diff) = 0;
30 my($opt_header) = 0;
31 my($opt_template) = 0;
32 my($opt_server) = 0;
33 my($opt_parser) = 0;
34 my($opt_eparser) = 0;
35 my($opt_keep) = 0;
36 my($opt_output);
37
38 my $idl_parser = new idl;
39
40 #####################################################################
41 # parse an IDL file returning a structure containing all the data
42 sub IdlParse($)
43 {
44     my $filename = shift;
45     my $idl = $idl_parser->parse_idl($filename);
46     util::CleanData($idl);
47     return $idl;
48 }
49
50
51 #########################################
52 # display help text
53 sub ShowHelp()
54 {
55     print "
56            perl IDL parser and code generator
57            Copyright (C) tridge\@samba.org
58
59            Usage: pidl.pl [options] <idlfile>
60
61            Options:
62              --help                this help page
63              --output OUTNAME      put output in OUTNAME.*
64              --parse               parse a idl file to a .pidl file
65              --dump                dump a pidl file back to idl
66              --header              create a C header file
67              --parser              create a C parser
68              --server              create server boilterplate
69              --template            print a template for a pipe
70              --eparser             create an ethereal parser
71              --diff                run diff on the idl and dumped output
72              --keep                keep the .pidl file
73            \n";
74     exit(0);
75 }
76
77 # main program
78 GetOptions (
79             'help|h|?' => \$opt_help, 
80             'output=s' => \$opt_output,
81             'parse' => \$opt_parse,
82             'dump' => \$opt_dump,
83             'header' => \$opt_header,
84             'server' => \$opt_server,
85             'template' => \$opt_template,
86             'parser' => \$opt_parser,
87             'eparser' => \$opt_eparser,
88             'diff' => \$opt_diff,
89             'keep' => \$opt_keep
90             );
91
92 if ($opt_help) {
93     ShowHelp();
94     exit(0);
95 }
96
97 sub process_file($)
98 {
99         my $idl_file = shift;
100         my $output;
101         my $pidl;
102
103         my $basename = basename($idl_file, ".idl");
104
105         if (!defined($opt_output)) {
106                 $output = $idl_file;
107         } else {
108                 $output = $opt_output . $basename;
109         }
110
111         my($pidl_file) = util::ChangeExtension($output, ".pidl");
112
113         print "Compiling $idl_file\n";
114
115         if ($opt_parse) {
116                 $pidl = IdlParse($idl_file);
117                 defined $pidl || die "Failed to parse $idl_file";
118                 IdlValidator::Validate($pidl);
119                 if ($opt_keep && !util::SaveStructure($pidl_file, $pidl)) {
120                             die "Failed to save $pidl_file\n";
121                 }               
122         } else {
123                 $pidl = util::LoadStructure($pidl_file);
124                 defined $pidl || die "Failed to load $pidl_file - maybe you need --parse\n";
125         }
126
127         if ($opt_dump) {
128                 print IdlDump::Dump($pidl);
129         }
130         
131         if ($opt_header) {
132                 my($header) = util::ChangeExtension($output, ".h");
133                 util::FileSave($header, IdlHeader::Parse($pidl));
134         }
135
136         if ($opt_server) {
137                 my($server) = util::ChangeExtension($output, "_s.c");
138                 util::FileSave($server, IdlServer::Parse($pidl));
139         }
140         
141         if ($opt_parser) {
142                 my($parser) = util::ChangeExtension($output, ".c");
143                 IdlParser::Parse($pidl, $parser);
144         }
145         
146         if ($opt_eparser) {
147                 my($parser) = util::ChangeExtension($output, "_ethereal.c");
148                 util::FileSave($parser, IdlEParser::Parse($pidl));
149         }
150         
151         if ($opt_diff) {
152                 my($tempfile) = util::ChangeExtension($output, ".tmp");
153                 util::FileSave($tempfile, IdlDump::Dump($pidl));
154                 system("diff -wu $idl_file $tempfile");
155                 unlink($tempfile);
156         }
157
158         if ($opt_template) {
159                 print IdlTemplate::Parse($pidl);
160         }
161 }
162
163
164 foreach my $filename (@ARGV) {
165         process_file($filename);
166 }