diff options
author | rubidium <rubidium@openttd.org> | 2010-11-13 11:11:02 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2010-11-13 11:11:02 +0000 |
commit | f1959206951a77891664c461cd51c4f4b90db753 (patch) | |
tree | 9d121c0088e4f60d5d6a23c31d111a8d6c8cb7c3 /src | |
parent | 239fcc8ccdd201665bd4aaa76268503fefe94712 (diff) | |
download | openttd-f1959206951a77891664c461cd51c4f4b90db753.tar.xz |
(svn r21160) -Codechange: reuse the strgen LanguageHeader to store some metadata about a language, and keep the language metadata in memory instead of loading it several times from disk
Diffstat (limited to 'src')
-rw-r--r-- | src/language.h (renamed from src/strgen/strgen.h) | 14 | ||||
-rw-r--r-- | src/strgen/strgen.cpp | 2 | ||||
-rw-r--r-- | src/strings.cpp | 45 | ||||
-rw-r--r-- | src/strings_type.h | 10 |
4 files changed, 28 insertions, 43 deletions
diff --git a/src/strgen/strgen.h b/src/language.h index 778c64361..0456c3a43 100644 --- a/src/strgen/strgen.h +++ b/src/language.h @@ -7,10 +7,10 @@ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>. */ -/** @file strgen.h Language pack header for strgen (needs to match). */ +/** @file language.h Information about languages and their files. */ -#ifndef STRGEN_H -#define STRGEN_H +#ifndef LANGUAGE_H +#define LANGUAGE_H /** Header of a language file. */ struct LanguagePackHeader { @@ -49,7 +49,11 @@ struct LanguagePackHeader { */ bool IsValid() const; }; - assert_compile(sizeof(LanguagePackHeader) % 4 == 0); -#endif /* STRGEN_H */ +/** Metadata about a single language. */ +struct LanguageMetadata : public LanguagePackHeader { + char file[MAX_PATH]; ///< Name of the file we read this data from. +}; + +#endif /* LANGUAGE_H */ diff --git a/src/strgen/strgen.cpp b/src/strgen/strgen.cpp index d13291b03..3497e7616 100644 --- a/src/strgen/strgen.cpp +++ b/src/strgen/strgen.cpp @@ -16,7 +16,7 @@ #include "../core/mem_func.hpp" #include "../string_func.h" #include "../strings_type.h" -#include "strgen.h" +#include "../language.h" #include "../table/control_codes.h" #include <stdarg.h> diff --git a/src/strings.cpp b/src/strings.cpp index d1fffe6f6..e9564cfd1 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -30,7 +30,7 @@ #include "date_func.h" #include "vehicle_base.h" #include "engine_base.h" -#include "strgen/strgen.h" +#include "language.h" #include "townname_func.h" #include "string_func.h" #include "company_base.h" @@ -1439,12 +1439,12 @@ int CDECL StringIDSorter(const StringID *a, const StringID *b) /** * Checks whether the given language is already found. - * @param langs languages we've found so fa + * @param langs languages we've found so far * @param max the length of the language list * @param language name of the language to check * @return true if and only if a language file with the same name has not been found */ -static bool UniqueLanguageFile(const Language *langs, uint max, const char *language) +static bool UniqueLanguageFile(const LanguageMetadata *langs, uint max, const char *language) { for (uint i = 0; i < max; i++) { const char *f_name = strrchr(langs[i].file, PATHSEPCHAR) + 1; @@ -1460,7 +1460,7 @@ static bool UniqueLanguageFile(const Language *langs, uint max, const char *lang * @param hdr the place to write the header information to * @return true if and only if the language file is of a compatible version */ -static bool GetLanguageFileHeader(const char *file, LanguagePack *hdr) +static bool GetLanguageFileHeader(const char *file, LanguagePackHeader *hdr) { FILE *f = fopen(file, "rb"); if (f == NULL) return false; @@ -1483,7 +1483,7 @@ static bool GetLanguageFileHeader(const char *file, LanguagePack *hdr) * @param path the base directory to search in * @return the number of added languages */ -static int GetLanguageList(Language *langs, int start, int max, const char *path) +static int GetLanguageList(LanguageMetadata *langs, int start, int max, const char *path) { int i = start; @@ -1500,13 +1500,11 @@ static int GetLanguageList(Language *langs, int start, int max, const char *path /* Filter any duplicate language-files, first-come first-serve */ if (!UniqueLanguageFile(langs, i, d_name)) continue; - langs[i].file = str_fmt("%s%s", path, d_name); + seprintf(langs[i].file, lastof(langs[i].file), "%s%s", path, d_name); /* Check whether the file is of the correct version */ - LanguagePack hdr; - if (!GetLanguageFileHeader(langs[i].file, &hdr)) { + if (!GetLanguageFileHeader(langs[i].file, &langs[i])) { DEBUG(misc, 3, "%s is not a valid language file", langs[i].file); - free(langs[i].file); continue; } @@ -1524,13 +1522,12 @@ static int GetLanguageList(Language *langs, int start, int max, const char *path void InitializeLanguagePacks() { Searchpath sp; - Language files[MAX_LANG]; uint language_count = 0; FOR_ALL_SEARCHPATHS(sp) { char path[MAX_PATH]; FioAppendDirectory(path, lengthof(path), sp, LANG_DIR); - language_count += GetLanguageList(files, language_count, lengthof(files), path); + language_count += GetLanguageList(_dynlang.ent, language_count, lengthof(_dynlang.ent), path); } if (language_count == 0) usererror("No available language packs (invalid versions?)"); @@ -1542,41 +1539,29 @@ void InitializeLanguagePacks() int language_fallback = -1; ///< Using pt_PT for pt_BR locale when pt_BR is not available int en_GB_fallback = 0; ///< Fallback when no locale-matching language has been found - DynamicLanguages *dl = &_dynlang; - dl->num = 0; + _dynlang.num = language_count; /* Fill the dynamic languages structures */ for (uint i = 0; i < language_count; i++) { - /* File read the language header */ - LanguagePack hdr; - if (!GetLanguageFileHeader(files[i].file, &hdr)) continue; - - dl->ent[dl->num].file = files[i].file; - dl->ent[dl->num].name = strdup(hdr.name); - /* We are trying to find a default language. The priority is by * configuration file, local environment and last, if nothing found, * english. If def equals -1, we have not picked a default language */ - const char *lang_file = strrchr(dl->ent[dl->num].file, PATHSEPCHAR) + 1; - if (strcmp(lang_file, dl->curr_file) == 0) chosen_language = dl->num; + const char *lang_file = strrchr(_dynlang.ent[i].file, PATHSEPCHAR) + 1; + if (strcmp(lang_file, _dynlang.curr_file) == 0) chosen_language = i; if (chosen_language == -1) { - if (strcmp (hdr.isocode, "en_GB") == 0) en_GB_fallback = dl->num; - if (strncmp(hdr.isocode, lang, 5) == 0) chosen_language = dl->num; - if (strncmp(hdr.isocode, lang, 2) == 0) language_fallback = dl->num; + if (strcmp (_dynlang.ent[i].isocode, "en_GB") == 0) en_GB_fallback = i; + if (strncmp(_dynlang.ent[i].isocode, lang, 5) == 0) chosen_language = i; + if (strncmp(_dynlang.ent[i].isocode, lang, 2) == 0) language_fallback = i; } - - dl->num++; } - if (dl->num == 0) usererror("Invalid version of language packs"); - /* We haven't found the language in the config nor the one in the locale. * Now we set it to one of the fallback languages */ if (chosen_language == -1) { chosen_language = (language_fallback != -1) ? language_fallback : en_GB_fallback; } - if (!ReadLanguagePack(chosen_language)) usererror("Can't read language pack '%s'", dl->ent[chosen_language].file); + if (!ReadLanguagePack(chosen_language)) usererror("Can't read language pack '%s'", _dynlang.ent[chosen_language].file); } /** diff --git a/src/strings_type.h b/src/strings_type.h index 0987c2e9b..be415f162 100644 --- a/src/strings_type.h +++ b/src/strings_type.h @@ -12,6 +12,8 @@ #ifndef STRINGS_TYPE_H #define STRINGS_TYPE_H +#include "language.h" + /** * Numeric value that represents a string, independent of the selected language. */ @@ -26,18 +28,12 @@ enum TextDirection { TD_RTL, ///< Text is written right-to-left by default }; -/** Information about a language */ -struct Language { - char *name; ///< The internal name of the language - char *file; ///< The name of the language as it appears on disk -}; - /** Used for dynamic language support */ struct DynamicLanguages { int num; ///< Number of languages int curr; ///< Currently selected language index char curr_file[MAX_PATH]; ///< Currently selected language file name without path (needed for saving the filename of the loaded language). - Language ent[MAX_LANG]; ///< Information about the languages + LanguageMetadata ent[MAX_LANG]; ///< Information about the languages }; /** Special string constants */ |