summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-11-13 11:11:02 +0000
committerrubidium <rubidium@openttd.org>2010-11-13 11:11:02 +0000
commitf1959206951a77891664c461cd51c4f4b90db753 (patch)
tree9d121c0088e4f60d5d6a23c31d111a8d6c8cb7c3 /src
parent239fcc8ccdd201665bd4aaa76268503fefe94712 (diff)
downloadopenttd-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.cpp2
-rw-r--r--src/strings.cpp45
-rw-r--r--src/strings_type.h10
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 */