(svn r1823) Get rid of some ugly cast magic concerning language packs
authortron
Sun, 06 Feb 2005 14:47:56 +0000
changeset 1319 cd302ee91e27
parent 1318 0cfb27523b44
child 1320 bf9623526d71
(svn r1823) Get rid of some ugly cast magic concerning language packs
strings.c
--- a/strings.c	Sun Feb 06 14:27:50 2005 +0000
+++ b/strings.c	Sun Feb 06 14:47:56 2005 +0000
@@ -16,20 +16,21 @@
 
 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 @@
 	// 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 @@
 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 @@
 	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 @@
 {
 	DynamicLanguages *dl = &_dynlang;
 	int i, j, n, m,def;
-	LanguagePackHeader hdr;
+	LanguagePack hdr;
 	FILE *in;
 	char *files[32];