diff --git a/strings.c b/strings.c index 617c5c9658..ae473dd721 100644 --- a/strings.c +++ b/strings.c @@ -16,20 +16,21 @@ static char *GetSpecialPlayerNameString(char *buff, int ind); static char *DecodeString(char *buff, const char *str); -static char **_langpack_offs; -static char *_langpack; -static uint _langtab_num[32]; // Offset into langpack offs -static uint _langtab_start[32]; // Offset into langpack offs - extern const char _openttd_revision[]; -typedef struct { +typedef struct LanguagePack { uint32 ident; uint32 version; // 32-bits of auto generated version info which is basically a hash of strings.h char name[32]; // the international name of this language char own_name[32]; // the localized name of this language uint16 offsets[32]; // the offsets -} LanguagePackHeader; + char data[VARARRAY_SIZE]; +} LanguagePack; + +static char **_langpack_offs; +static LanguagePack *_langpack; +static uint _langtab_num[32]; // Offset into langpack offs +static uint _langtab_start[32]; // Offset into langpack offs const uint16 _currency_string_list[] = { STR_CURR_GBP, @@ -757,7 +758,7 @@ static char *GetSpecialPlayerNameString(char *buff, int ind) // language name? if (IS_INT_INSIDE(ind, (SPECSTR_LANGUAGE_START - 0x70E4), (SPECSTR_LANGUAGE_END - 0x70E4) + 1)) { int i = ind - (SPECSTR_LANGUAGE_START - 0x70E4); - return str_cat(buff, i == _dynlang.curr ? ((LanguagePackHeader*)_langpack)->own_name : _dynlang.ent[i].name); + return str_cat(buff, i == _dynlang.curr ? _langpack->own_name : _dynlang.ent[i].name); } // resolution size? @@ -793,35 +794,33 @@ StringID RemapOldStringID(StringID s) bool ReadLanguagePack(int lang_index) { int tot_count, i; - char *lang_pack; + LanguagePack *lang_pack; size_t len; char **langpack_offs; char *s; -#define HDR ((LanguagePackHeader*)lang_pack) { char *lang = str_fmt("%s%s", _path.lang_dir, _dynlang.ent[lang_index].file); lang_pack = ReadFileToMem(lang, &len, 100000); free(lang); } if (lang_pack == NULL) return false; - if (len < sizeof(LanguagePackHeader) || - HDR->ident != TO_LE32(LANGUAGE_PACK_IDENT) || - HDR->version != TO_LE32(LANGUAGE_PACK_VERSION)) { + if (len < sizeof(LanguagePack) || + lang_pack->ident != TO_LE32(LANGUAGE_PACK_IDENT) || + lang_pack->version != TO_LE32(LANGUAGE_PACK_VERSION)) { free(lang_pack); return false; } -#undef HDR #if defined(TTD_BIG_ENDIAN) for (i = 0; i != 32; i++) { - ((LanguagePackHeader*)lang_pack)->offsets[i] = READ_LE_UINT16(&((LanguagePackHeader*)lang_pack)->offsets[i]); + lang_pack->offsets[i] = READ_LE_UINT16(&lang_pack->offsets[i]); } #endif tot_count = 0; for (i = 0; i != 32; i++) { - uint num = ((LanguagePackHeader*)lang_pack)->offsets[i]; + uint num = lang_pack->offsets[i]; _langtab_start[i] = tot_count; _langtab_num[i] = num; tot_count += num; @@ -831,7 +830,7 @@ bool ReadLanguagePack(int lang_index) langpack_offs = malloc(tot_count * sizeof(*langpack_offs)); // Fill offsets - s = lang_pack + sizeof(LanguagePackHeader); + s = lang_pack->data; for (i = 0; i != tot_count; i++) { len = (byte)*s; *s++ = '\0'; // zero terminate the string before. @@ -858,7 +857,7 @@ void InitializeLanguagePacks(void) { DynamicLanguages *dl = &_dynlang; int i, j, n, m,def; - LanguagePackHeader hdr; + LanguagePack hdr; FILE *in; char *files[32];