summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/strgen/strgen.cpp82
1 files changed, 31 insertions, 51 deletions
diff --git a/src/strgen/strgen.cpp b/src/strgen/strgen.cpp
index 121301cdb..e950e5e99 100644
--- a/src/strgen/strgen.cpp
+++ b/src/strgen/strgen.cpp
@@ -13,6 +13,7 @@
#include "../core/alloc_func.hpp"
#include "../core/endian_func.hpp"
#include "../core/math_func.hpp"
+#include "../core/mem_func.hpp"
#include "../string_func.h"
#include "../strings_type.h"
#include "strgen.h"
@@ -67,6 +68,7 @@ struct LangString {
};
static LangString *_strings[65536];
+static LanguagePackHeader _lang; ///< Header information about a language.
#define HASH_SIZE 32767
@@ -77,14 +79,6 @@ static int _put_pos;
static int _next_string_id;
static uint32 _hash;
-static char _lang_name[32], _lang_ownname[32], _lang_isocode[16];
-static char _lang_digit_group_separator[8];
-static char _lang_digit_group_separator_currency[8];
-static char _lang_digit_decimal_separator[8];
-static byte _lang_pluralform;
-static byte _lang_textdir;
-static uint16 _lang_winlangid;
-static uint8 _lang_newgrflangid;
#define MAX_NUM_GENDER 8
static char _genders[MAX_NUM_GENDER][16];
static uint _numgenders;
@@ -352,16 +346,16 @@ static void EmitPlural(char *buf, int value)
error("%s: No plural words", _cur_ident);
}
- if (_plural_forms[_lang_pluralform].plural_count != nw) {
+ if (_plural_forms[_lang.plural_form].plural_count != nw) {
if (_translated) {
error("%s: Invalid number of plural forms. Expecting %d, found %d.", _cur_ident,
- _plural_forms[_lang_pluralform].plural_count, nw);
+ _plural_forms[_lang.plural_form].plural_count, nw);
} else {
if ((_show_todo & 2) != 0) strgen_warning("'%s' is untranslated. Tweaking english string to allow compilation for plural forms", _cur_ident);
- if (nw > _plural_forms[_lang_pluralform].plural_count) {
- nw = _plural_forms[_lang_pluralform].plural_count;
+ if (nw > _plural_forms[_lang.plural_form].plural_count) {
+ nw = _plural_forms[_lang.plural_form].plural_count;
} else {
- for (; nw < _plural_forms[_lang_pluralform].plural_count; nw++) {
+ for (; nw < _plural_forms[_lang.plural_form].plural_count; nw++) {
words[nw] = words[nw - 1];
}
}
@@ -517,47 +511,47 @@ static void HandlePragma(char *str)
if (!memcmp(str, "id ", 3)) {
_next_string_id = strtoul(str + 3, NULL, 0);
} else if (!memcmp(str, "name ", 5)) {
- strecpy(_lang_name, str + 5, lastof(_lang_name));
+ strecpy(_lang.name, str + 5, lastof(_lang.name));
} else if (!memcmp(str, "ownname ", 8)) {
- strecpy(_lang_ownname, str + 8, lastof(_lang_ownname));
+ strecpy(_lang.own_name, str + 8, lastof(_lang.own_name));
} else if (!memcmp(str, "isocode ", 8)) {
- strecpy(_lang_isocode, str + 8, lastof(_lang_isocode));
+ strecpy(_lang.isocode, str + 8, lastof(_lang.isocode));
} else if (!memcmp(str, "plural ", 7)) {
- _lang_pluralform = atoi(str + 7);
- if (_lang_pluralform >= lengthof(_plural_forms)) {
- error("Invalid pluralform %d", _lang_pluralform);
+ _lang.plural_form = atoi(str + 7);
+ if (_lang.plural_form >= lengthof(_plural_forms)) {
+ error("Invalid pluralform %d", _lang.plural_form);
}
} else if (!memcmp(str, "textdir ", 8)) {
if (!memcmp(str + 8, "ltr", 3)) {
- _lang_textdir = TD_LTR;
+ _lang.text_dir = TD_LTR;
} else if (!memcmp(str + 8, "rtl", 3)) {
- _lang_textdir = TD_RTL;
+ _lang.text_dir = TD_RTL;
} else {
error("Invalid textdir %s", str + 8);
}
} else if (!memcmp(str, "digitsep ", 9)) {
str += 9;
- strecpy(_lang_digit_group_separator, strcmp(str, "{NBSP}") == 0 ? NBSP : str, lastof(_lang_digit_group_separator));
+ strecpy(_lang.digit_group_separator, strcmp(str, "{NBSP}") == 0 ? NBSP : str, lastof(_lang.digit_group_separator));
} else if (!memcmp(str, "digitsepcur ", 12)) {
str += 12;
- strecpy(_lang_digit_group_separator_currency, strcmp(str, "{NBSP}") == 0 ? NBSP : str, lastof(_lang_digit_group_separator_currency));
+ strecpy(_lang.digit_group_separator_currency, strcmp(str, "{NBSP}") == 0 ? NBSP : str, lastof(_lang.digit_group_separator_currency));
} else if (!memcmp(str, "decimalsep ", 11)) {
str += 11;
- strecpy(_lang_digit_decimal_separator, strcmp(str, "{NBSP}") == 0 ? NBSP : str, lastof(_lang_digit_decimal_separator));
+ strecpy(_lang.digit_decimal_separator, strcmp(str, "{NBSP}") == 0 ? NBSP : str, lastof(_lang.digit_decimal_separator));
} else if (!memcmp(str, "winlangid ", 10)) {
const char *buf = str + 10;
long langid = strtol(buf, NULL, 16);
if (langid > (long)UINT16_MAX || langid < 0) {
error("Invalid winlangid %s", buf);
}
- _lang_winlangid = (uint16)langid;
+ _lang.winlangid = (uint16)langid;
} else if (!memcmp(str, "grflangid ", 10)) {
const char *buf = str + 10;
long langid = strtol(buf, NULL, 16);
if (langid >= 0x7F || langid < 0) {
error("Invalid grflangid %s", buf);
}
- _lang_newgrflangid = (uint8)langid;
+ _lang.newgrflangid = (uint8)langid;
} else if (!memcmp(str, "gender ", 7)) {
char *buf = str + 7;
@@ -824,14 +818,11 @@ static void ParseFile(const char *file, bool english)
_file = file;
/* For each new file we parse, reset the genders, and language codes */
+ MemSetT(&_lang, 0);
_numgenders = 0;
- _lang_name[0] = _lang_ownname[0] = _lang_isocode[0] = '\0';
- strecpy(_lang_digit_group_separator, ",", lastof(_lang_digit_group_separator));
- strecpy(_lang_digit_group_separator_currency, ",", lastof(_lang_digit_group_separator_currency));
- strecpy(_lang_digit_decimal_separator, ".", lastof(_lang_digit_decimal_separator));
- _lang_textdir = TD_LTR;
- _lang_winlangid = 0x0000; // neutral language code
- _lang_newgrflangid = 0; // standard english
+ strecpy(_lang.digit_group_separator, ",", lastof(_lang.digit_group_separator));
+ strecpy(_lang.digit_group_separator_currency, ",", lastof(_lang.digit_group_separator_currency));
+ strecpy(_lang.digit_decimal_separator, ".", lastof(_lang.digit_decimal_separator));
/* TODO:!! We can't reset the cases. In case the translated strings
* derive some strings from english.... */
@@ -845,7 +836,7 @@ static void ParseFile(const char *file, bool english)
}
fclose(in);
- if (StrEmpty(_lang_name) || StrEmpty(_lang_ownname) || StrEmpty(_lang_isocode)) {
+ if (StrEmpty(_lang.name) || StrEmpty(_lang.own_name) || StrEmpty(_lang.isocode)) {
error("Language must include ##name, ##ownname and ##isocode");
}
}
@@ -1066,35 +1057,24 @@ static void WriteLength(FILE *f, uint length)
static void WriteLangfile(const char *filename)
{
uint in_use[32];
- LanguagePackHeader hdr;
_output_filename = filename;
_output_file = fopen(filename, "wb");
if (_output_file == NULL) error("can't open %s", filename);
- memset(&hdr, 0, sizeof(hdr));
for (int i = 0; i != 32; i++) {
uint n = CountInUse(i);
in_use[i] = n;
- hdr.offsets[i] = TO_LE16(n);
+ _lang.offsets[i] = TO_LE16(n);
}
/* see line 655: fprintf(..."\tLANGUAGE_PACK_IDENT = 0x474E414C,...) */
- hdr.ident = TO_LE32(0x474E414C); // Big Endian value for 'LANG'
- hdr.version = TO_LE32(_hash);
- hdr.plural_form = _lang_pluralform;
- hdr.text_dir = _lang_textdir;
- hdr.winlangid = TO_LE16(_lang_winlangid);
- hdr.newgrflangid = _lang_newgrflangid;
- strecpy(hdr.name, _lang_name, lastof(hdr.name));
- strecpy(hdr.own_name, _lang_ownname, lastof(hdr.own_name));
- strecpy(hdr.isocode, _lang_isocode, lastof(hdr.isocode));
- strecpy(hdr.digit_group_separator, _lang_digit_group_separator, lastof(hdr.digit_group_separator));
- 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));
-
- fwrite(&hdr, sizeof(hdr), 1, _output_file);
+ _lang.ident = TO_LE32(0x474E414C); // Big Endian value for 'LANG'
+ _lang.version = TO_LE32(_hash);
+ _lang.winlangid = TO_LE16(_lang.winlangid);
+
+ fwrite(&_lang, sizeof(_lang), 1, _output_file);
for (int i = 0; i != 32; i++) {
for (uint j = 0; j != in_use[i]; j++) {