Let's try using perl for building proto.h.
authorWayne Davison <wayned@samba.org>
Fri, 9 Nov 2007 17:40:56 +0000 (17:40 +0000)
committerWayne Davison <wayned@samba.org>
Fri, 9 Nov 2007 17:40:56 +0000 (17:40 +0000)
mkproto.pl [new file with mode: 0644]
prepare-source.mak

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;
+}
index ef27e1e..e7ff995 100644 (file)
@@ -9,12 +9,7 @@ config.h.in: configure.in aclocal.m4
        autoheader && touch config.h.in
 
 proto.h: *.c lib/compat.c
-       cat *.c lib/compat.c | awk -f mkproto.awk >proto.h.new
-       if diff proto.h proto.h.new >/dev/null 2>&1; then \
-         rm proto.h.new; \
-       else \
-         mv proto.h.new proto.h; \
-       fi
+       perl mkproto.pl *.c lib/compat.c
 
 man: rsync.1 rsyncd.conf.5