tools: Re-use the file updating routines from make_makefiles in make_requests.
diff --git a/tools/make_requests b/tools/make_requests
index 227ac27..2c06813 100755
--- a/tools/make_requests
+++ b/tools/make_requests
@@ -258,28 +258,57 @@
return %errors;
}
-### Replace the contents of a file between ### make_requests ### marks
-
-sub REPLACE_IN_FILE($@)
+# update a file if changed
+sub update_file($)
{
- my $name = shift;
- my @data = @_;
- my @lines = ();
- open(FILE,$name) or die "Can't open $name";
- while (<FILE>)
+ my $file = shift;
+ my $ret = !(-f $file) || system "cmp $file $file.new >/dev/null";
+ if (!$ret)
{
- push @lines, $_;
- last if /\#\#\# make_requests begin \#\#\#/;
+ unlink "$file.new";
}
- push @lines, "\n", @data;
- while (<FILE>)
+ else
{
- if (/\#\#\# make_requests end \#\#\#/) { push @lines, "\n", $_; last; }
+ rename "$file.new", "$file";
+ print "$file updated\n";
}
- push @lines, <FILE>;
- open(FILE,">$name") or die "Can't modify $name";
- print FILE @lines;
- close(FILE);
+ return $ret;
+}
+
+# replace some lines in a file between two markers
+sub replace_in_file($$$@)
+{
+ my $file = shift;
+ my $start = shift;
+ my $end = shift;
+
+ open NEW_FILE, ">$file.new" or die "cannot create $file.new";
+
+ if (defined($start))
+ {
+ open OLD_FILE, "$file" or die "cannot open $file";
+ while (<OLD_FILE>)
+ {
+ print NEW_FILE $_;
+ last if /$start/;
+ }
+ }
+
+ print NEW_FILE "\n", @_, "\n";
+
+ if (defined($end))
+ {
+ my $skip=1;
+ while (<OLD_FILE>)
+ {
+ $skip = 0 if /$end/;
+ print NEW_FILE $_ unless $skip;
+ }
+ }
+
+ close OLD_FILE if defined($start);
+ close NEW_FILE;
+ return update_file($file);
}
### Main
@@ -291,7 +320,7 @@
### Create server_protocol.h and print header
-open SERVER_PROT, ">include/wine/server_protocol.h" or die "Cannot create include/wine/server_protocol.h";
+open SERVER_PROT, ">include/wine/server_protocol.h.new" or die "Cannot create include/wine/server_protocol.h.new";
print SERVER_PROT "/*\n * Wine server protocol definitions\n *\n";
print SERVER_PROT " * This file is automatically generated; DO NO EDIT!\n";
print SERVER_PROT " * Edit server/protocol.def instead and re-run tools/make_requests\n";
@@ -324,6 +353,7 @@
printf SERVER_PROT "#define SERVER_PROTOCOL_VERSION %d\n\n", $protocol + 1;
print SERVER_PROT "#endif /* __WINE_WINE_SERVER_PROTOCOL_H */\n";
close SERVER_PROT;
+update_file( "include/wine/server_protocol.h" );
### Output the dumping function tables
@@ -360,7 +390,10 @@
push @trace_lines, " { NULL, 0 }\n";
push @trace_lines, "};\n";
-REPLACE_IN_FILE( "server/trace.c", @trace_lines );
+replace_in_file( "server/trace.c",
+ "### make_requests begin ###",
+ "### make_requests end ###",
+ @trace_lines );
### Output the request handlers list
@@ -376,4 +409,7 @@
}
push @request_lines, "};\n#endif /* WANT_REQUEST_HANDLERS */\n";
-REPLACE_IN_FILE( "server/request.h", @request_lines );
+replace_in_file( "server/request.h",
+ "### make_requests begin ###",
+ "### make_requests end ###",
+ @request_lines );