2 # Generate loadparm interfaces tables for Samba3/Samba4 integration
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;
35 print "Usage: mks3param.pl [options] [c files]\n";
37 print " --srcdir=path Read files relative to this directory\n";
38 print " --builddir=path Write file relative to this directory\n";
39 print " --help Print this help message\n\n";
44 'file=s' => sub { my ($f,$v) = @_; $file = $v; },
45 'srcdir=s' => sub { my ($f,$v) = @_; $srcdir = $v; },
46 'builddir=s' => sub { my ($f,$v) = @_; $builddir = $v; },
50 sub normalize_define($$)
52 my ($define, $file) = @_;
54 if (not defined($define) and defined($file)) {
55 $define = "__" . uc($file) . "__";
56 $define =~ tr{./}{__};
58 } elsif (not defined($define)) {
59 $define = '_S3_PARAM_H_';
65 $public_define = normalize_define($public_define, $file);
71 open(INPUTFILE, $filename) or return undef;
72 my($saved_delim) = $/;
74 my($data) = <INPUTFILE>;
82 my ($file, $header_name) = @_;
83 $file->("#ifndef $header_name\n");
84 $file->("#define $header_name\n\n");
85 $file->("/* This file was automatically generated by mks3param.pl. DO NOT EDIT */\n\n");
86 $file->("struct loadparm_s3_context\n");
88 $file->("\tconst char * (*get_parametric)(const char *type, const char *option);");
93 my ($file, $header_name) = @_;
95 $file->("\n#endif /* $header_name */\n\n");
98 sub handle_loadparm($$)
100 my ($file,$line) = @_;
102 if ($line =~ /^FN_(GLOBAL|LOCAL)_(CONST_STRING|STRING|BOOL|bool|CHAR|INTEGER|LIST)\((\w+),.*\)/o) {
109 "CONST_STRING" => "const char *",
110 "STRING" => "const char *",
113 "LIST" => "const char **",
116 $file->("\t$tmap{$type} (*$name)(void);\n");
122 my ($file, $filename) = @_;
124 $filename =~ s/\.o$/\.c/g;
126 if ($filename =~ /^\//) {
127 open(FH, "<$filename") or die("Failed to open $filename");
128 } elsif (!open(FH, "< $builddir/$filename")) {
129 open(FH, "< $srcdir/$filename") || die "Failed to open $filename";
134 while (my $line = <FH>) {
135 if ($line =~ /^\/\*\*/) {
142 if ($line =~ /\*\//) {
147 # these are ordered for maximum speed
148 next if ($line =~ /^\s/);
150 next unless ($line =~ /\(/);
152 next if ($line =~ /^\/|[;]/);
154 if ($line =~ /^FN_/) {
155 handle_loadparm($file, $line);
164 print_header(\&public, $public_define);
166 process_file(\&public, $_) foreach (@ARGV);
167 print_footer(\&public, $public_define);
169 if (not defined($file)) {
170 print STDOUT $$public_data;
173 mkpath(dirname($file), 0, 0755);
174 open(PUBLIC, ">$file") or die("Can't open `$file': $!");
175 print PUBLIC "$$public_data";