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

This commit is contained in:
rubidium 2010-11-07 18:20:18 +00:00
parent 17695611cb
commit a89fed21c7
1 changed files with 30 additions and 50 deletions

View File

@ -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));
_lang.ident = TO_LE32(0x474E414C); // Big Endian value for 'LANG'
_lang.version = TO_LE32(_hash);
_lang.winlangid = TO_LE16(_lang.winlangid);
fwrite(&hdr, sizeof(hdr), 1, _output_file);
fwrite(&_lang, sizeof(_lang), 1, _output_file);
for (int i = 0; i != 32; i++) {
for (uint j = 0; j != in_use[i]; j++) {