(svn r1823) Get rid of some ugly cast magic concerning language packs

This commit is contained in:
tron 2005-02-06 14:47:56 +00:00
parent d11cc22536
commit 92d1b6060c
1 changed files with 17 additions and 18 deletions

View File

@ -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];