(svn r21112) -Codechange: reduce the amount (of copying) variables

This commit is contained in:
rubidium 2010-11-07 18:20:18 +00:00
parent 1cb20976e1
commit b75f513a1f

View File

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