2 # Generate loadparm tables for loadparm.c
4 # based on mkproto.pl Written by Jelmer Vernooij
5 # based on the original mkproto.sh by Andrew Tridgell
9 # don't use warnings module as it is not portable enough
16 #####################################################################
17 # read a file into a string
20 my $public_define = undef;
23 my $public_data = \
$_public;
26 my $generate_scope = undef;
36 print "Usage: mkparamdefs.pl [options] [c files]\n";
38 print " --srcdir=path Read files relative to this directory\n";
39 print " --builddir=path Write file relative to this directory\n";
40 print " --generate-scope=[GLOBAL|LOCAL] Filter which definitions to generate\n";
41 print " --help Print this help message\n\n";
46 'file=s' => sub { my ($f,$v) = @_; $file = $v; },
47 'srcdir=s' => sub { my ($f,$v) = @_; $srcdir = $v; },
48 'builddir=s' => sub { my ($f,$v) = @_; $builddir = $v; },
49 'generate-scope=s' => sub { my ($f,$v) = @_; $generate_scope = $v; },
53 sub normalize_define
($$)
55 my ($define, $file) = @_;
57 if (not defined($define) and defined($file)) {
58 $define = "__" . uc($file) . "__";
59 $define =~ tr{./}{__};
61 } elsif (not defined($define)) {
62 $define = '_S3_PARAM_H_';
68 $public_define = normalize_define
($public_define, $file);
74 open(INPUTFILE
, $filename) or return undef;
75 my($saved_delim) = $/;
77 my($data) = <INPUTFILE
>;
85 my ($file, $header_name,$generate_scope) = @_;
86 $file->("#ifndef $header_name\n");
87 $file->("#define $header_name\n\n");
88 $file->("/* This file was automatically generated by mkparmdefs.pl. DO NOT EDIT */\n\n");
90 if ($generate_scope eq "GLOBAL") {
91 $file->(" * This structure describes global (ie., server-wide) parameters.\n");
93 $file->("struct loadparm_global \n");
94 } elsif ($generate_scope eq "LOCAL") {
95 $file->(" * This structure describes a single service.\n");
97 $file->("struct loadparm_service \n");
102 sub print_footer
($$$)
104 my ($file, $header_name, $generate_scope) = @_;
105 $file->("LOADPARM_EXTRA_" . $generate_scope . "S\n");
107 $file->("\n#endif /* $header_name */\n\n");
110 sub handle_loadparm
($$$)
112 my ($file,$line,$generate_scope) = @_;
119 if ($line =~ /^FN_(GLOBAL|LOCAL)_(CONST_STRING|STRING|BOOL|bool|CHAR|INTEGER|LIST)\((\w+),(.*)\)/o) {
124 } elsif ($line =~ /^FN_(GLOBAL|LOCAL)_PARM_(CONST_STRING|STRING|BOOL|bool|CHAR|INTEGER|LIST)\((\w+),(.*)\)/o) {
134 "CONST_STRING" => "char *",
135 "STRING" => "char *",
138 "LIST" => "const char **",
141 if ($scope eq $generate_scope) {
142 $file->("\t$tmap{$type} $var;\n");
148 my ($file, $filename) = @_;
150 $filename =~ s/\.o$/\.c/g;
152 if ($filename =~ /^\//) {
153 open(FH
, "<$filename") or die("Failed to open $filename");
154 } elsif (!open(FH
, "< $builddir/$filename")) {
155 open(FH
, "< $srcdir/$filename") || die "Failed to open $filename";
160 while (my $line = <FH
>) {
161 if ($line =~ /^\/\
*\
*/) {
168 if ($line =~ /\*\//) {
173 # these are ordered for maximum speed
174 next if ($line =~ /^\s/);
176 next unless ($line =~ /\(/);
178 next if ($line =~ /^\/|[;]/);
180 if ($line =~ /^static (FN_.*)/) {
181 handle_loadparm
($file, $1, $generate_scope);
182 } elsif ($line =~ /^FN_/) {
183 handle_loadparm
($file, $line, $generate_scope);
192 print_header
(\
&public
, $public_define, $generate_scope);
194 process_file
(\
&public
, $_) foreach (@ARGV);
195 print_footer
(\
&public
, $public_define, $generate_scope);
197 if (not defined($file)) {
198 print STDOUT
$$public_data;
201 mkpath
(dirname
($file), 0, 0755);
202 open(PUBLIC
, ">$file") or die("Can't open `$file': $!");
203 print PUBLIC
"$$public_data";