Let's try using perl for building proto.h.
[rsync/rsync.git] / mkproto.pl
diff --git a/mkproto.pl b/mkproto.pl
new file mode 100644 (file)
index 0000000..f453501
--- /dev/null
@@ -0,0 +1,51 @@
+# generate prototypes for rsync
+use strict;
+
+my $old_protos = '';
+if (open(IN, '<', 'proto.h')) {
+    $old_protos = join('', <IN>);
+    close IN;
+}
+
+my %FN_MAP = (
+    BOOL => 'BOOL ',
+    CHAR => 'char ',
+    INTEGER => 'int ',
+    STRING => 'char *',
+);
+
+my $inheader = 0;
+my $protos = qq|/* This file is automatically generated with "make proto". DO NOT EDIT */\n\n|;
+
+while (<>) {
+    if ($inheader) {
+       if (/[)][ \t]*$/) {
+           $inheader = 0;
+           s/$/;/;
+       }
+       $protos .= $_;
+    }
+
+    if (/^FN_(LOCAL|GLOBAL)_([^(]+)\(([^,()]+)/) {
+       my $ret = $FN_MAP{$2};
+       my $func = $3;
+       my $arg = $1 eq 'LOCAL' ? 'int ' : 'void';
+       $protos .= "$ret$func($arg);\n";
+    } elsif (/^static|^extern/ || /[;]/) {
+       ;
+    } elsif (!/^[A-Za-z][A-Za-z0-9_]* /) {
+       ;
+    } elsif (/[(].*[)][ \t]*$/) {
+       s/$/;/;
+       $protos .= $_;
+    } elsif (/[(]/) {
+       $inheader = 1;
+       $protos .= $_;
+    }
+}
+
+if ($old_protos ne $protos) {
+    open(OUT, '>', 'proto.h') or die $!;
+    print OUT $protos;
+    close OUT;
+}