mirror of https://github.com/OpenTTD/OpenTTD
(svn r22254) -Codechange: Make settingsgen only update the output file if it actually changed.
parent
f81dd357e8
commit
e7bb220fdd
|
@ -18,6 +18,11 @@
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#if (!defined(WIN32) && !defined(WIN64)) || defined(__CYGWIN__)
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __MORPHOS__
|
#ifdef __MORPHOS__
|
||||||
#ifdef stderr
|
#ifdef stderr
|
||||||
#undef stderr
|
#undef stderr
|
||||||
|
@ -347,6 +352,39 @@ static void CopyFile(const char *fname, FILE *out_fp)
|
||||||
fclose(in_fp);
|
fclose(in_fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare two files for identity.
|
||||||
|
* @param n1 First file.
|
||||||
|
* @param n2 Second file.
|
||||||
|
* @return True if both files are identical.
|
||||||
|
*/
|
||||||
|
static bool CompareFiles(const char *n1, const char *n2)
|
||||||
|
{
|
||||||
|
FILE *f2 = fopen(n2, "rb");
|
||||||
|
if (f2 == NULL) return false;
|
||||||
|
|
||||||
|
FILE *f1 = fopen(n1, "rb");
|
||||||
|
if (f1 == NULL) error("can't open %s", n1);
|
||||||
|
|
||||||
|
size_t l1, l2;
|
||||||
|
do {
|
||||||
|
char b1[4096];
|
||||||
|
char b2[4096];
|
||||||
|
l1 = fread(b1, 1, sizeof(b1), f1);
|
||||||
|
l2 = fread(b2, 1, sizeof(b2), f2);
|
||||||
|
|
||||||
|
if (l1 != l2 || memcmp(b1, b2, l1) != 0) {
|
||||||
|
fclose(f2);
|
||||||
|
fclose(f1);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} while (l1 != 0);
|
||||||
|
|
||||||
|
fclose(f2);
|
||||||
|
fclose(f1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/** Options of settingsgen. */
|
/** Options of settingsgen. */
|
||||||
static const OptionData _opts[] = {
|
static const OptionData _opts[] = {
|
||||||
GETOPT_NOVAL( 'v', "--version"),
|
GETOPT_NOVAL( 'v', "--version"),
|
||||||
|
@ -447,15 +485,28 @@ int CDECL main(int argc, char *argv[])
|
||||||
_stored_output.Write(stdout);
|
_stored_output.Write(stdout);
|
||||||
CopyFile(after_file, stdout);
|
CopyFile(after_file, stdout);
|
||||||
} else {
|
} else {
|
||||||
FILE *fp = fopen(output_file, "w");
|
static const char * const tmp_output = "tmp2.xxx";
|
||||||
|
|
||||||
|
FILE *fp = fopen(tmp_output, "w");
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
fprintf(stderr, "settingsgen: Warning: Cannot open file %s\n", output_file);
|
fprintf(stderr, "settingsgen: Warning: Cannot open file %s\n", tmp_output);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
CopyFile(before_file, fp);
|
CopyFile(before_file, fp);
|
||||||
_stored_output.Write(fp);
|
_stored_output.Write(fp);
|
||||||
CopyFile(after_file, fp);
|
CopyFile(after_file, fp);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
|
if (CompareFiles(tmp_output, output_file)) {
|
||||||
|
/* Files are equal. tmp2.xxx is not needed. */
|
||||||
|
unlink(tmp_output);
|
||||||
|
} else {
|
||||||
|
/* Rename tmp2.xxx to output file. */
|
||||||
|
#if defined(WIN32) || defined(WIN64)
|
||||||
|
unlink(output_file);
|
||||||
|
#endif
|
||||||
|
if (rename(tmp_output, output_file) == -1) error("rename() failed");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue