From 52728b7d416f7837fc3460a9e131355094649b15 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 23 Dec 2005 12:29:13 +0000 Subject: r12446: Merge mkproto.sh's functionality into mkproto.pl Allow specifying the _PUBLIC_ keyword on functions to indicate a function is public. Public prototypes can now be written to a seperate header, although this functionality is not used yet. (This used to be commit e3466df6dfb62bbf8bee3acfa92996945054c2dd) --- source4/script/mkproto.pl | 112 +++++++++++++++++++++++++++++++++------------- 1 file changed, 82 insertions(+), 30 deletions(-) (limited to 'source4/script/mkproto.pl') diff --git a/source4/script/mkproto.pl b/source4/script/mkproto.pl index 227c7c0dce..5db9424cd8 100755 --- a/source4/script/mkproto.pl +++ b/source4/script/mkproto.pl @@ -5,26 +5,71 @@ use strict; # don't use warnings module as it is not portable enough # use warnings; -my $header_name = '_PROTO_H_'; -if ($ARGV[0] eq '-h') { - shift @ARGV; - $header_name = shift @ARGV; +use Getopt::Long; + +my $public_file = undef; +my $private_file = undef; +my $public_define = undef; +my $private_define = undef; +my $public_fd = \*STDOUT; +my $private_fd = \*STDOUT; + +GetOptions( + 'public=s' => sub { my ($f,$v) = @_; $public_file = $v; }, + 'private=s' => sub { my ($f,$v) = @_; $private_file = $v; }, + 'define=s' => sub { + my ($f,$v) = @_; + $public_define = $v; + $private_define = "$v\_PRIVATE"; + }, + 'public-define=s' => \$public_define, + 'private-define=s' => \$private_define +); + +if ($public_define eq undef and $public_file ne undef) { + $public_define = $public_file; + $public_define =~ tr{./}{__}; +} elsif ($public_define eq undef) { + $public_define = '_PROTO_H_'; } -sub print_header { - print "#ifndef $header_name\n"; - print "#define $header_name\n\n"; - print "/* This file is automatically generated with \"make proto\". DO NOT EDIT */\n\n"; +if ($private_define eq undef and $private_file ne undef) { + $private_define = $private_file; + $private_define =~ tr{./}{__}; +} elsif ($public_define eq undef) { + $public_define = '_PROTO_H_'; } -sub print_footer { - printf "\n#endif /* %s */\n", $header_name; +if ($public_file ne undef) { + open PUBLIC, ">$public_file"; + $public_fd = \*PUBLIC; } +if ($private_file eq $public_file) { + $private_fd = $public_fd; +} elsif ($private_file ne undef) { + open PRIVATE, ">$private_file"; + $private_fd = \*PRIVATE; +} + +sub print_header($$) +{ + my ($file, $header_name) = @_; + print $file "#ifndef $header_name\n"; + print $file "#define $header_name\n\n"; + print $file "/* This file is automatically generated with \"make proto\". DO NOT EDIT */\n\n"; +} -sub handle_loadparm { - my $line = shift; +sub print_footer($$) +{ + my ($file, $header_name) = @_; + printf $file "\n#endif /* %s */\n", $header_name; +} + +sub handle_loadparm($$) +{ + my ($file,$line) = @_; if ($line =~ /^FN_(GLOBAL|LOCAL)_(CONST_STRING|STRING|BOOL|CHAR|INTEGER|LIST)\((\w+),.*\)/o) { my $scope = $1; @@ -45,20 +90,23 @@ sub handle_loadparm { "LOCAL" => "int " ); - print "$tmap{$type}$name($smap{$scope});\n"; + print $file "$tmap{$type}$name($smap{$scope});\n"; } } - -sub process_file($) +sub process_file($$$) { - my $filename = shift; + my ($public_file, $private_file, $filename) = @_; + + $filename =~ s/\.o$/\.c/g; open(FH, "< $filename") || die "Failed to open $filename"; - print "\n/* The following definitions come from $filename */\n\n"; + print $private_file "\n/* The following definitions come from $filename */\n\n"; while (my $line = ) { + my $target = $private_file; + # these are ordered for maximum speed next if ($line =~ /^\s/); @@ -76,37 +124,41 @@ sub process_file($) next if ($line =~ /^int\s*main/); if ($line =~ /^FN_/) { - handle_loadparm($line); + handle_loadparm($public_file, $line); next; } + if ($line =~ s/_PUBLIC_//xo) { + $target = $public_file; + } + if ( $line =~ /\(.*\)\s*$/o ) { chomp $line; - print "$line;\n"; + print $target "$line;\n"; next; } - print $line; + print $target $line; while ($line = ) { if ($line =~ /\)\s*$/o) { chomp $line; - print "$line;\n"; + print $target "$line;\n"; last; } - print $line; + print $target $line; } } close(FH); } -sub process_files { - foreach my $filename (@ARGV) { - process_file($filename); - } +if ($public_file != $private_file) { + print_header($private_fd, $private_define); +} +print_header($public_fd, $public_define); +process_file($public_fd, $private_fd, $_) foreach (@ARGV); +print_footer($public_fd, $public_define); +if ($public_file != $private_file) { + print_footer($private_fd, $private_define); } - -print_header(); -process_files(); -print_footer(); -- cgit