svn commit: samba r14607 - in branches/SAMBA_4_0/source/script: .

jelmer at samba.org jelmer at samba.org
Tue Mar 21 09:25:36 GMT 2006


Author: jelmer
Date: 2006-03-21 09:25:36 +0000 (Tue, 21 Mar 2006)
New Revision: 14607

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=14607

Log:
Update mkproto.pl to only write out new header files if the contents changed.

Modified:
   branches/SAMBA_4_0/source/script/mkproto.pl


Changeset:
Modified: branches/SAMBA_4_0/source/script/mkproto.pl
===================================================================
--- branches/SAMBA_4_0/source/script/mkproto.pl	2006-03-21 08:32:50 UTC (rev 14606)
+++ branches/SAMBA_4_0/source/script/mkproto.pl	2006-03-21 09:25:36 UTC (rev 14607)
@@ -1,20 +1,39 @@
 #!/usr/bin/perl
+# Simple script for generating prototypes for C functions
+# Written by Jelmer Vernooij
+# based on the original mkproto.sh by Andrew Tridgell
 
 use strict;
 
 # don't use warnings module as it is not portable enough
 # use warnings;
 
-
 use Getopt::Long;
 
+#####################################################################
+# read a file into a string
+
 my $public_file = undef;
 my $private_file = undef;
 my $public_define = undef;
 my $private_define = undef;
-my $public_fd = \*STDOUT;
-my $private_fd = \*STDOUT;
+my $_public = "";
+my $_private = "";
+my $public_data = \$_public;
+my $private_data = \$_private;
 
+sub public($)
+{
+	my ($d) = @_;
+	$$public_data .= $d;
+}
+
+sub private($)
+{
+	my ($d) = @_;
+	$$private_data .= $d;
+}
+
 sub usage()
 {
 	print "Usage: mkproto.pl [options] [c files]\n";
@@ -55,34 +74,40 @@
 	$public_define = '_PROTO_H_';
 }
 
-if (defined($public_file)) {
-	open PUBLIC, ">$public_file" or die("Can't open `$public_file': $!"); 
-	$public_fd = \*PUBLIC;
+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;
 }
 
-if ($private_file eq $public_file) {
-	$private_fd = $public_fd;
-} elsif (defined($private_file)) {
-	open PRIVATE, ">$private_file" or die("Can't open `$private_file': $!"); ; 
-	$private_fd = \*PRIVATE;
+sub file_load($)
+{
+    my($filename) = shift;
+    local(*INPUTFILE);
+    open(INPUTFILE, $filename) || return undef;
+    my($saved_delim) = $/;
+    undef $/;
+    my($data) = <INPUTFILE>;
+    close(INPUTFILE);
+    $/ = $saved_delim;
+    return $data;
 }
 
 sub print_header($$)
 {
 	my ($file, $header_name) = @_;
-	print $file "#ifndef $header_name\n";
-	print $file "#define $header_name\n\n";
-	print $file "#undef _PRINTF_ATTRIBUTE\n";
-	print $file "#define _PRINTF_ATTRIBUTE(a1, a2) PRINTF_ATTRIBUTE(a1, a2)\n";
-	print $file "/* This file was automatically generated by mkproto.pl. DO NOT EDIT */\n\n";
+	$file->("#ifndef $header_name\n");
+	$file->("#define $header_name\n\n");
+	$file->("#undef _PRINTF_ATTRIBUTE\n");
+	$file->("#define _PRINTF_ATTRIBUTE(a1, a2) PRINTF_ATTRIBUTE(a1, a2)\n");
+	$file->("/* This file was automatically generated by mkproto.pl. DO NOT EDIT */\n\n");
 }
 
 sub print_footer($$) 
 {
 	my ($file, $header_name) = @_;
-	print $file "#undef _PRINTF_ATTRIBUTE\n";
-	print $file "#define _PRINTF_ATTRIBUTE(a1, a2)\n";
-	print $file "\n#endif /* $header_name */\n\n";
+	$file->("#undef _PRINTF_ATTRIBUTE\n");
+	$file->("#define _PRINTF_ATTRIBUTE(a1, a2)\n");
+	$file->("\n#endif /* $header_name */\n\n");
 }
 
 sub handle_loadparm($$) 
@@ -108,7 +133,7 @@
 			    "LOCAL" => "int "
 			    );
 
-		print $file "$tmap{$type}$name($smap{$scope});\n";
+		$file->("$tmap{$type}$name($smap{$scope});\n");
 	}
 }
 
@@ -120,10 +145,10 @@
 
 	open(FH, "< $filename") || die "Failed to open $filename";
 
-	print $private_file "\n/* The following definitions come from $filename  */\n\n";
+	$private_file->("\n/* The following definitions come from $filename  */\n\n");
 
 	while (my $line = <FH>) {	      
-		my $target = $private_file;
+		my $target = \&private;
 		my $is_public = 0;
 
 		# these are ordered for maximum speed
@@ -139,7 +164,7 @@
 		}
 
 		if ($line =~ /^_PUBLIC_[\t ]/) {
-			$target = $public_file;
+			$target = \&public;
 			$is_public = 1;
 		}
 
@@ -154,42 +179,68 @@
 
 		if ( $line =~ /\(.*\)\s*$/o ) {
 			chomp $line;
-			print $target "$line;\n";
+			$target->("$line;\n");
 			next;
 		}
 
-		print $target $line;
+		$target->($line);
 
 		while ($line = <FH>) {
 			if ($line =~ /\)\s*$/o) {
 				chomp $line;
-				print $target "$line;\n";
+				$target->("$line;\n");
 				last;
 			}
-			print $target $line;
+			$target->($line);
 		}
 	}
 
 	close(FH);
 }
 
-print_header($public_fd, $public_define);
+print_header(\&public, $public_define);
 if ($public_file ne $private_file) {
-	print_header($private_fd, $private_define);
+	print_header(\&private, $private_define);
 
-	print $private_fd "/* this file contains prototypes for functions that " .
+	private("/* this file contains prototypes for functions that " .
 			"are private \n * to this subsystem or library. These functions " .
-			"should not be \n * used outside this particular subsystem! */\n\n";
+			"should not be \n * used outside this particular subsystem! */\n\n");
 
-	print $public_fd "/* this file contains prototypes for functions that " . 
-			"are part of \n * the public API of this subsystem or library. */\n\n";
+	public("/* this file contains prototypes for functions that " . 
+			"are part of \n * the public API of this subsystem or library. */\n\n");
 
 }
 
-print $public_fd "#ifndef _PUBLIC_\n#define _PUBLIC_\n#endif\n\n";
+public("#ifndef _PUBLIC_\n#define _PUBLIC_\n#endif\n\n");
 
-process_file($public_fd, $private_fd, $_) foreach (@ARGV);
-print_footer($public_fd, $public_define);
+process_file(\&public, \&private, $_) foreach (@ARGV);
+print_footer(\&public, $public_define);
 if ($public_file ne $private_file) {
-	print_footer($private_fd, $private_define);
+	print_footer(\&private, $private_define);
 }
+
+if (not defined($public_file)) {
+	print STDOUT $$public_data;
+}
+
+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);
+
+if (not defined($old_public_data) or ($old_public_data ne $$public_data))
+{
+	open(PUBLIC, ">$public_file") or die("Can't open `$public_file': $!"); 
+	print PUBLIC "$$public_data";
+	close(PUBLIC);
+} 
+
+if (($public_file ne $private_file) and (
+	not defined($old_private_data) or ($old_private_data ne $$private_data))) {
+
+	open(PRIVATE, ">$private_file") or die("Can't open `$private_file': $!"); 
+	print PRIVATE "$$private_data";
+	close(PRIVATE);
+}



More information about the samba-cvs mailing list