Merge branch 'v4-0-test' of ssh://git.samba.org/data/git/samba into registry
[ira/wip.git] / source4 / script / mkproto.pl
index f09d99243f454f277699c99ee3985042c1665dd4..e1b790d41da216ce04cc8a98bec094607bed2c05 100755 (executable)
@@ -17,14 +17,15 @@ use File::Path;
 
 my $public_file = undef;
 my $private_file = undef;
+my $all_file = undef;
 my $public_define = undef;
 my $private_define = undef;
 my $_public = "";
 my $_private = "";
 my $public_data = \$_public;
 my $private_data = \$_private;
-my $builddir = undef;
-my $srcdir = undef;
+my $builddir = ".";
+my $srcdir = ".";
 
 sub public($)
 {
@@ -55,6 +56,7 @@ sub usage()
 
 GetOptions(
        'public=s' => sub { my ($f,$v) = @_; $public_file = $v; },
+       'all=s' => sub { my ($f,$v) = @_; $public_file = $v; $private_file = $v; },
        'private=s' => sub { my ($f,$v) = @_; $private_file = $v; },
        'define=s' => sub { 
                my ($f,$v) = @_; 
@@ -68,20 +70,24 @@ GetOptions(
        'help' => \&usage
 ) or exit(1);
 
-if (not defined($public_define) and defined($public_file)) {
-       $public_define = ".." . uc($public_file) . "__";
-       $public_define =~ tr{./}{__};
-} elsif (not defined($public_define)) {
-       $public_define = '_PROTO_H_';
-}
+sub normalize_define($$)
+{
+       my ($define, $file) = @_;
+
+       if (not defined($define) and defined($file)) {
+               $define = "__" . uc($file) . "__";
+               $define =~ tr{./}{__};
+               $define =~ tr{\-}{_};
+       } elsif (not defined($define)) {
+               $define = '_PROTO_H_';
+       }
 
-if (not defined($private_define) and defined($private_file)) {
-       $private_define = "__" . uc($private_file) . "__";
-       $private_define =~ tr{./}{__};
-} elsif (not defined($public_define)) {
-       $public_define = '_PROTO_H_';
+       return $define;
 }
 
+$public_define = normalize_define($public_define, $public_file);
+$private_define = normalize_define($private_define, $private_file);
+
 if ((defined($private_file) and defined($public_file) and ($private_file eq $public_file)) or 
        (not defined($private_file) and not defined($public_file))) {
        $private_data = $public_data;
@@ -89,9 +95,9 @@ if ((defined($private_file) and defined($public_file) and ($private_file eq $pub
 
 sub file_load($)
 {
-    my($filename) = shift;
+    my($filename) = @_;
     local(*INPUTFILE);
-    open(INPUTFILE, $filename) || return undef;
+    open(INPUTFILE, $filename) or return undef;
     my($saved_delim) = $/;
     undef $/;
     my($data) = <INPUTFILE>;
@@ -129,7 +135,6 @@ sub handle_loadparm($$)
 
                my %tmap = (
                            "BOOL" => "bool ",
-                               "bool" => "bool ",
                            "CONST_STRING" => "const char *",
                            "STRING" => "const char *",
                            "INTEGER" => "int ",
@@ -138,8 +143,8 @@ sub handle_loadparm($$)
                            );
 
                my %smap = (
-                           "GLOBAL" => "void",
-                           "LOCAL" => "struct loadparm_service *"
+                           "GLOBAL" => "struct loadparm_context *",
+                           "LOCAL" => "struct loadparm_service *, struct loadparm_service *"
                            );
 
                $file->("$tmap{$type}$name($smap{$scope});\n");
@@ -152,7 +157,9 @@ sub process_file($$$)
 
        $filename =~ s/\.o$/\.c/g;
 
-       if (!open(FH, "< $builddir/$filename")) {
+       if ($filename =~ /^\//) {
+               open(FH, "<$filename") or die("Failed to open $filename");
+       } elsif (!open(FH, "< $builddir/$filename")) {
            open(FH, "< $srcdir/$filename") || die "Failed to open $filename";
        }
 
@@ -185,6 +192,7 @@ sub process_file($$$)
 
                if ($line =~ /^_PUBLIC_ FN_/) {
                        handle_loadparm($public_file, $line);
+                       handle_loadparm($private_file, $line);
                        next;
                }
 
@@ -194,8 +202,8 @@ sub process_file($$$)
                }
 
                next unless ( $is_public || $line =~ /
-                             (_DEPRECATED_ |_NORETURN_ |_WARN_UNUSED_RESULT_ |_PURE_ )*^(
-                                 void|BOOL|bool|int|struct|char|const|\w+_[tT]\s|uint|unsigned|long|NTSTATUS|
+                             ^(_DEPRECATED_ |_NORETURN_ |_WARN_UNUSED_RESULT_ |_PURE_ )*(
+                                 void|bool|int|struct|char|const|\w+_[tT]\s|uint|unsigned|long|NTSTATUS|
                                  ADS_STATUS|enum\s.*\(|DATA_BLOB|WERROR|XFILE|FILE|DIR|
                              double|TDB_CONTEXT|TDB_DATA|TALLOC_CTX|NTTIME|FN_|init_module|
                              GtkWidget|GType|smb_ucs2_t|krb5_error_code)
@@ -205,7 +213,6 @@ sub process_file($$$)
 
                $target->("\n$comment") if (defined($comment)); $comment = undef;
 
-               $line =~ s/BOOL /bool /g;
                if ( $line =~ /\(.*\)\s*$/o ) {
                        chomp $line;
                        $target->("$line;\n");
@@ -215,7 +222,6 @@ sub process_file($$$)
                $target->($line);
 
                while ($line = <FH>) {
-                       $line =~ s/BOOL /bool /g;
                        if ($line =~ /\)\s*$/o) {
                                chomp $line;
                                $target->("$line;\n");
@@ -230,7 +236,7 @@ sub process_file($$$)
 
 
 print_header(\&public, $public_define);
-if ($public_file ne $private_file) {
+if (defined($private_file) and defined($public_file) and $public_file ne $private_file) {
        print_header(\&private, $private_define);
 
        private("/* this file contains prototypes for functions that " .
@@ -250,7 +256,7 @@ public("#ifndef _WARN_UNUSED_RESULT_\n#define _WARN_UNUSED_RESULT_\n#endif\n\n")
 
 process_file(\&public, \&private, $_) foreach (@ARGV);
 print_footer(\&public, $public_define);
-if ($public_file ne $private_file) {
+if (defined($private_file) and $public_file ne $private_file) {
        print_footer(\&private, $private_define);
 }
 
@@ -262,15 +268,12 @@ if (not defined($private_file) and defined($public_file)) {
        print STDOUT $$private_data;
 }
 
-my $old_public_data = file_load($public_file);
-my $old_private_data = file_load($private_file);
-
 mkpath(dirname($public_file), 0, 0755);
 open(PUBLIC, ">$public_file") or die("Can't open `$public_file': $!"); 
 print PUBLIC "$$public_data";
 close(PUBLIC);
 
-if ($public_file ne $private_file) {
+if (defined($private_file) and $public_file ne $private_file) {
        mkpath(dirname($private_file), 0, 0755);
        open(PRIVATE, ">$private_file") or die("Can't open `$private_file': $!"); 
        print PRIVATE "$$private_data";