mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-17 21:25:40 +00:00
(svn r19113) -Change: [strgen] Remove the partially generated language file if compilation fails.
This commit is contained in:
parent
66837b1edd
commit
b1cce3f70f
@ -45,11 +45,13 @@ struct Case {
|
|||||||
Case *next;
|
Case *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool _masterlang;
|
static bool _masterlang; ///< Whether we are loading the master language
|
||||||
static bool _translated;
|
static bool _translated; ///< Whether the current language is not the master language
|
||||||
static bool _translation; ///< Is the current file actually a translation or not
|
static bool _translation; ///< Is the current file actually a translation or not
|
||||||
static const char *_file = "(unknown file)";
|
static const char *_file = "(unknown file)"; ///< The filename of the input, so we can refer to it in errors/warnings
|
||||||
static int _cur_line;
|
static FILE *_output_file = NULL; ///< The file we are currently writing output to
|
||||||
|
static const char *_output_filename = NULL; ///< The filename of the output, so we can delete it if compilation fails
|
||||||
|
static int _cur_line; ///< The current line we're parsing in the input file
|
||||||
static int _errors, _warnings, _show_todo;
|
static int _errors, _warnings, _show_todo;
|
||||||
|
|
||||||
struct LangString {
|
struct LangString {
|
||||||
@ -175,6 +177,11 @@ void NORETURN CDECL error(const char *s, ...)
|
|||||||
vsnprintf(buf, lengthof(buf), s, va);
|
vsnprintf(buf, lengthof(buf), s, va);
|
||||||
va_end(va);
|
va_end(va);
|
||||||
fprintf(stderr, "%s" LINE_NUM_FMT ": FATAL: %s\n", _file, _cur_line, buf);
|
fprintf(stderr, "%s" LINE_NUM_FMT ": FATAL: %s\n", _file, _cur_line, buf);
|
||||||
|
/* We were writing output to a file, remove it. */
|
||||||
|
if (_output_file != NULL) {
|
||||||
|
fclose(_output_file);
|
||||||
|
unlink(_output_filename);
|
||||||
|
}
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -916,44 +923,47 @@ static void WriteStringsH(const char *filename)
|
|||||||
{
|
{
|
||||||
int next = -1;
|
int next = -1;
|
||||||
|
|
||||||
FILE *out = fopen("tmp.xxx", "w");
|
_output_filename = "tmp.xxx";
|
||||||
if (out == NULL) error("can't open tmp.xxx");
|
_output_file = fopen(_output_filename, "w");
|
||||||
|
if (_output_file == NULL) error("can't open tmp.xxx");
|
||||||
|
|
||||||
fprintf(out, "/* This file is automatically generated. Do not modify */\n\n");
|
fprintf(_output_file, "/* This file is automatically generated. Do not modify */\n\n");
|
||||||
fprintf(out, "#ifndef TABLE_STRINGS_H\n");
|
fprintf(_output_file, "#ifndef TABLE_STRINGS_H\n");
|
||||||
fprintf(out, "#define TABLE_STRINGS_H\n");
|
fprintf(_output_file, "#define TABLE_STRINGS_H\n");
|
||||||
|
|
||||||
for (int i = 0; i != lengthof(_strings); i++) {
|
for (int i = 0; i != lengthof(_strings); i++) {
|
||||||
if (_strings[i] != NULL) {
|
if (_strings[i] != NULL) {
|
||||||
if (next != i) fprintf(out, "\n");
|
if (next != i) fprintf(_output_file, "\n");
|
||||||
fprintf(out, "static const StringID %s = 0x%X;\n", _strings[i]->name, i);
|
fprintf(_output_file, "static const StringID %s = 0x%X;\n", _strings[i]->name, i);
|
||||||
next = i + 1;
|
next = i + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(out, "\nstatic const StringID STR_LAST_STRINGID = 0x%X;\n", next - 1);
|
fprintf(_output_file, "\nstatic const StringID STR_LAST_STRINGID = 0x%X;\n", next - 1);
|
||||||
|
|
||||||
fprintf(out,
|
fprintf(_output_file,
|
||||||
"\nenum {\n"
|
"\nenum {\n"
|
||||||
"\tLANGUAGE_PACK_IDENT = 0x474E414C, // Big Endian value for 'LANG' (LE is 0x 4C 41 4E 47)\n"
|
"\tLANGUAGE_PACK_IDENT = 0x474E414C, // Big Endian value for 'LANG' (LE is 0x 4C 41 4E 47)\n"
|
||||||
"\tLANGUAGE_PACK_VERSION = 0x%X,\n"
|
"\tLANGUAGE_PACK_VERSION = 0x%X,\n"
|
||||||
"};\n", (uint)_hash
|
"};\n", (uint)_hash
|
||||||
);
|
);
|
||||||
|
|
||||||
fprintf(out, "\n#endif /* TABLE_STRINGS_H */\n");
|
fprintf(_output_file, "\n#endif /* TABLE_STRINGS_H */\n");
|
||||||
|
|
||||||
fclose(out);
|
fclose(_output_file);
|
||||||
|
_output_file = NULL;
|
||||||
|
|
||||||
if (CompareFiles("tmp.xxx", filename)) {
|
if (CompareFiles(_output_filename, filename)) {
|
||||||
/* files are equal. tmp.xxx is not needed */
|
/* files are equal. tmp.xxx is not needed */
|
||||||
unlink("tmp.xxx");
|
unlink(_output_filename);
|
||||||
} else {
|
} else {
|
||||||
/* else rename tmp.xxx into filename */
|
/* else rename tmp.xxx into filename */
|
||||||
#if defined(WIN32) || defined(WIN64)
|
#if defined(WIN32) || defined(WIN64)
|
||||||
unlink(filename);
|
unlink(filename);
|
||||||
#endif
|
#endif
|
||||||
if (rename("tmp.xxx", filename) == -1) error("rename() failed");
|
if (rename(_output_filename, filename) == -1) error("rename() failed");
|
||||||
}
|
}
|
||||||
|
_output_filename = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int TranslateArgumentIdx(int argidx, int offset)
|
static int TranslateArgumentIdx(int argidx, int offset)
|
||||||
@ -1047,8 +1057,9 @@ static void WriteLangfile(const char *filename)
|
|||||||
uint in_use[32];
|
uint in_use[32];
|
||||||
LanguagePackHeader hdr;
|
LanguagePackHeader hdr;
|
||||||
|
|
||||||
FILE *f = fopen(filename, "wb");
|
_output_filename = filename;
|
||||||
if (f == NULL) error("can't open %s", filename);
|
_output_file = fopen(filename, "wb");
|
||||||
|
if (_output_file == NULL) error("can't open %s", filename);
|
||||||
|
|
||||||
memset(&hdr, 0, sizeof(hdr));
|
memset(&hdr, 0, sizeof(hdr));
|
||||||
for (int i = 0; i != 32; i++) {
|
for (int i = 0; i != 32; i++) {
|
||||||
@ -1072,7 +1083,7 @@ static void WriteLangfile(const char *filename)
|
|||||||
strecpy(hdr.digit_group_separator_currency, _lang_digit_group_separator_currency, lastof(hdr.digit_group_separator_currency));
|
strecpy(hdr.digit_group_separator_currency, _lang_digit_group_separator_currency, lastof(hdr.digit_group_separator_currency));
|
||||||
strecpy(hdr.digit_decimal_separator, _lang_digit_decimal_separator, lastof(hdr.digit_decimal_separator));
|
strecpy(hdr.digit_decimal_separator, _lang_digit_decimal_separator, lastof(hdr.digit_decimal_separator));
|
||||||
|
|
||||||
fwrite(&hdr, sizeof(hdr), 1, f);
|
fwrite(&hdr, sizeof(hdr), 1, _output_file);
|
||||||
|
|
||||||
for (int i = 0; i != 32; i++) {
|
for (int i = 0; i != 32; i++) {
|
||||||
for (uint j = 0; j != in_use[i]; j++) {
|
for (uint j = 0; j != in_use[i]; j++) {
|
||||||
@ -1082,7 +1093,7 @@ static void WriteLangfile(const char *filename)
|
|||||||
|
|
||||||
/* For undefined strings, just set that it's an empty string */
|
/* For undefined strings, just set that it's an empty string */
|
||||||
if (ls == NULL) {
|
if (ls == NULL) {
|
||||||
WriteLength(f, 0);
|
WriteLength(_output_file, 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1146,14 +1157,17 @@ static void WriteLangfile(const char *filename)
|
|||||||
|
|
||||||
if (cmdp != NULL) PutCommandString(cmdp);
|
if (cmdp != NULL) PutCommandString(cmdp);
|
||||||
|
|
||||||
WriteLength(f, _put_pos);
|
WriteLength(_output_file, _put_pos);
|
||||||
fwrite(_put_buf, 1, _put_pos, f);
|
fwrite(_put_buf, 1, _put_pos, _output_file);
|
||||||
_put_pos = 0;
|
_put_pos = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fputc(0, f);
|
fputc(0, _output_file);
|
||||||
fclose(f);
|
fclose(_output_file);
|
||||||
|
|
||||||
|
_output_file = NULL;
|
||||||
|
_output_filename = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Multi-OS mkdirectory function */
|
/** Multi-OS mkdirectory function */
|
||||||
|
Loading…
Reference in New Issue
Block a user