diff --git a/src/Global.cpp b/src/Global.cpp index b7ecb3bf..c3ab2d23 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -41,7 +41,6 @@ TEAKRAND HeadlineRand; //-------------------------------------------------------------------------------------------- // Die Registratur: //-------------------------------------------------------------------------------------------- -// CRegistration Registration; SLONG MissionKeys[] = {142, 372, 814, 1042, 2077, 4525}; SLONG MissionKeys2[] = {111, 172, 472, 1099, 2048, 5055, 6789, 7007, 8192, 9092}; SLONG MissionKeys3[] = {298, 346, 532, 2098, 3331, 3333, 4001, 4098, 4800, 8099}; diff --git a/src/Misc.cpp b/src/Misc.cpp index 6f355003..5016e25c 100644 --- a/src/Misc.cpp +++ b/src/Misc.cpp @@ -627,7 +627,7 @@ SLONG CalculateFlightCostNoTank(SLONG VonCity, SLONG NachCity, SLONG Verbrauch, void InitEinheiten(const CString &Filename) { SLONG c = 0; - ETexte.Open(Filename, TEXTRES_CACHED); + ETexte.Open(Filename); Einheiten.ReSize(14); diff --git a/src/Takeoff.cpp b/src/Takeoff.cpp index 7f3b82ec..f88e018d 100644 --- a/src/Takeoff.cpp +++ b/src/Takeoff.cpp @@ -563,7 +563,7 @@ void CTakeOffApp::InitInstance(int argc, char *argv[]) { LOADING_TEXT("Chargement des textes (1/4)...") else LOADING_TEXT("Loading modded texts..."); - ModdedTexte.Open(FullFilename("modded_ger.res", PatchPath), TEXTRES_CACHED); + ModdedTexte.Open(FullFilename("modded_ger.res", PatchPath)); if (gLanguage == LANGUAGE_N) LOADING_TEXT("Dialoogteksten worden opgestart...") @@ -571,7 +571,7 @@ void CTakeOffApp::InitInstance(int argc, char *argv[]) { LOADING_TEXT("Chargement des textes (2/4)...") else LOADING_TEXT("Loading dialogue texts..."); - DialogTexte.Open(FullFilename("dlg_ger.res", MiscPath), TEXTRES_CACHED); + DialogTexte.Open(FullFilename("dlg_ger.res", MiscPath)); DialogTexte.SetOverrideFile(FullFilename("dlg_ger.patched.res", PatchPath)); if (gLanguage == LANGUAGE_N) @@ -580,7 +580,7 @@ void CTakeOffApp::InitInstance(int argc, char *argv[]) { LOADING_TEXT("Chargement des textes (3/4)...") else LOADING_TEXT("Loading miscellanous texts..."); - StandardTexte.Open(FullFilename("std_ger.res", MiscPath), TEXTRES_CACHED); + StandardTexte.Open(FullFilename("std_ger.res", MiscPath)); StandardTexte.SetOverrideFile(FullFilename("std_ger.patched.res", PatchPath)); if (gLanguage == LANGUAGE_N) diff --git a/src/TeakLibW.h b/src/TeakLibW.h index bee67217..c043f9ae 100644 --- a/src/TeakLibW.h +++ b/src/TeakLibW.h @@ -1,6 +1,5 @@ #pragma once -#include #include extern void memswap(void *, void *, ULONG); @@ -756,18 +755,14 @@ struct TEXTRES_CACHE_ENTRY { // static_assert(sizeof(TEXTRES_CACHE_ENTRY) == 12, "TEXTRES_CACHE_ENTRY size check"); -#define TEXTRES_CACHED (void *)1 - class TEXTRES { public: TEXTRES(); TEXTRES(char const *, void *); ~TEXTRES(void); - void Open(char const *, void *); - BUFFER_V &GetB(ULONG, ULONG); - char *FindP(ULONG, ULONG); - char *FindS(ULONG, ULONG); + void Open(char const *source); + char *FindTranslation(ULONG, ULONG); char *GetP(ULONG, ULONG); char *GetS(ULONG, ULONG); @@ -777,10 +772,9 @@ class TEXTRES { private: char *FindOverridenS(ULONG, ULONG); - std::string FindLanguageInString(const char *Dst, const SLONG wantedLanguageIndex); - void LanguageSpecifyString(char *Dst); + void LanguageSpecifyString(char *Dst, bool fallback = false); - std::vector mLanguageTextPatterns; + CString ResultStr; BUFFER_V Path; BUFFER_V Strings; @@ -791,19 +785,6 @@ class TEXTRES { // static_assert(sizeof(TEXTRES) == 36, "TEXTRES size check"); -class CRegistration { - public: - CRegistration(void); - CRegistration(CString const &, ULONG); - void ReSize(CString const &, ULONG); - CString GetDisplayString(void); - SLONG GetMode(void); - CString GetSomeString(char *); - ULONG CalcChecksum(CString); - SLONG IsMaster(void); - void CheckIfIsMaster(void); -}; - #define VIDRAMBM (void *)1 #define SYSRAMBM (void *)2 diff --git a/src/TeakLibW/TextRes.cpp b/src/TeakLibW/TextRes.cpp index 780859f1..988aa7a3 100644 --- a/src/TeakLibW/TextRes.cpp +++ b/src/TeakLibW/TextRes.cpp @@ -11,173 +11,172 @@ const char *ExcTextResNotFound = "The following translation was not found: %s>>% SLONG gLanguage; -std::string TEXTRES::FindLanguageInString(const char *Dst, const SLONG wantedLanguageIndex) { - std::smatch match; - std::string s(Dst); - if (std::regex_search(s, match, mLanguageTextPatterns[wantedLanguageIndex])) { - return match[1]; +inline bool checkStartAnyLang(char *str) { + bool longEnough = (str && str[0] && str[1] && str[2]); + if (!longEnough) { + return false; } - return {}; -} -void TEXTRES::LanguageSpecifyString(char *Dst) { - SLONG wantedLanguageIndex = gLanguage; - if (wantedLanguageIndex >= mLanguageTextPatterns.size()) { - static bool warned = false; - if (!warned) { - AT_Log("Language %li not found, using fallback english", gLanguage); - warned = true; - } + return (str[1] == ':' && str[2] == ':'); +} - wantedLanguageIndex = 1; +inline bool checkStartSpecificLang(char *str, char langIdent) { + bool longEnough = (str && str[0] && str[1] && str[2]); + if (!longEnough) { + return false; } - std::string foundText = FindLanguageInString(Dst, wantedLanguageIndex); - if (foundText.empty()) { - // If we haven't found the language we want, try English - foundText = FindLanguageInString(Dst, 1/*E - English*/); - } + return (str[0] == langIdent && str[1] == ':' && str[2] == ':'); +} + +void TEXTRES::LanguageSpecifyString(char *Dst, bool fallback) { + const char *langs = "DEFTPNISOBJKLMNQRTUV"; + char lang = fallback ? 'E' : langs[gLanguage]; - // If we still haven't found anything, just return - if (foundText.empty()) { + if (!checkStartAnyLang(Dst)) { return; } - memmove(Dst, foundText.c_str(), foundText.length()); - Dst[foundText.length()] = 0; -} - -TEXTRES::TEXTRES() { - const std::string allLanguageTokens = "DEFTPNISOBJKLMNQRTUV"; - mLanguageTextPatterns.reserve(allLanguageTokens.size()); + for (SLONG i = 0; Dst[i] != 0; ++i) { + if (checkStartSpecificLang(Dst + i, lang)) { + SLONG j = i + 2; + while ((Dst[j] != 0) && !checkStartAnyLang(Dst + j)) { + ++j; + } + memmove(Dst, &Dst[i + 3], j - i - 3); + Dst[j - i - 3] = 0; + if (j - i - 3 > 0 && Dst[j - i - 4] == 32) { + Dst[j - i - 4] = 0; + } + return; + } + } - static char buffer[30]; - for (const char &c : allLanguageTokens) { - snprintf(buffer, sizeof(buffer), "^.*%c::(.*?)(?:[%c]::.*)?$", c, c); - mLanguageTextPatterns.emplace_back(buffer); + /* use english as a fallback */ + if (!fallback) { + LanguageSpecifyString(Dst, true); } } +TEXTRES::TEXTRES() { ResultStr.resize(0xFFF); } + TEXTRES::~TEXTRES() { if (hasOverride) { delete override; } }; -void TEXTRES::Open(char const *source, void *cached) { +void TEXTRES::Open(char const *source) { Strings.Clear(); Path.Clear(); Entries.Clear(); - if (cached != nullptr) { - SLONG Group = -1; - SLONG Identifier = -1; - if (!DoesFileExist(source)) { - AT_Log("TextRes file not found: %s", source); - return; - } + SLONG Group = -1; + SLONG Identifier = -1; - auto FileBuffer = LoadCompleteFile(source); - char *String = new char[0x400U]; - if (String == nullptr) { - TeakLibW_Exception(FNL, ExcOutOfMem); - } + if (!DoesFileExist(source)) { + AT_Log("TextRes file not found: %s", source); + return; + } - SLONG AnzStrings = 0; - SLONG AnzEntries = 0; - for (SLONG i = 0, j = 0; i < FileBuffer.AnzEntries(); i += j) { - if (FileBuffer[i] == '>' && FileBuffer[i + 1] == '>') { - ++AnzEntries; - } - SLONG AnzChars = 0; - SLONG AnzNonSpace = 0; - for (j = 0; j + i < FileBuffer.AnzEntries() && FileBuffer[j + i] != '\r' && FileBuffer[j + i] != '\n' && FileBuffer[j + i] != '\x1A'; ++j) { - if (FileBuffer[j + i] == '/' && FileBuffer[j + i + 1] == '/') { - AnzChars = -1; - } - if (AnzChars >= 0) { - ++AnzChars; - } - if (FileBuffer[j + i] != ' ' && AnzChars >= 0) { - AnzNonSpace = AnzChars; - } + auto FileBuffer = LoadCompleteFile(source); + char *String = new char[0x400U]; + if (String == nullptr) { + TeakLibW_Exception(FNL, ExcOutOfMem); + } + + SLONG AnzStrings = 0; + SLONG AnzEntries = 0; + for (SLONG i = 0, j = 0; i < FileBuffer.AnzEntries(); i += j) { + if (FileBuffer[i] == '>' && FileBuffer[i + 1] == '>') { + ++AnzEntries; + } + SLONG AnzChars = 0; + SLONG AnzNonSpace = 0; + for (j = 0; j + i < FileBuffer.AnzEntries() && FileBuffer[j + i] != '\r' && FileBuffer[j + i] != '\n' && FileBuffer[j + i] != '\x1A'; ++j) { + if (FileBuffer[j + i] == '/' && FileBuffer[j + i + 1] == '/') { + AnzChars = -1; } - if (FileBuffer[i] == ' ' && FileBuffer[i + 1] == ' ' && FileBuffer[i + 2] != ' ') { - AnzStrings += AnzNonSpace + 1; + if (AnzChars >= 0) { + ++AnzChars; } - while (j + i < FileBuffer.AnzEntries() && (FileBuffer[j + i] == '\r' || FileBuffer[j + i] == '\n' || FileBuffer[j + i] == '\x1A')) { - ++j; + if (FileBuffer[j + i] != ' ' && AnzChars >= 0) { + AnzNonSpace = AnzChars; } } - Strings.ReSize(AnzStrings + 5); - Entries.ReSize(AnzEntries); - - for (SLONG i = 0; i < Entries.AnzEntries(); ++i) { - Entries[i].Text = nullptr; + if (FileBuffer[i] == ' ' && FileBuffer[i + 1] == ' ' && FileBuffer[i + 2] != ' ') { + AnzStrings += AnzNonSpace + 1; + } + while (j + i < FileBuffer.AnzEntries() && (FileBuffer[j + i] == '\r' || FileBuffer[j + i] == '\n' || FileBuffer[j + i] == '\x1A')) { + ++j; } + } + Strings.ReSize(AnzStrings + 5); + Entries.ReSize(AnzEntries); - AnzStrings = 0; - AnzEntries = -1; - for (SLONG i = 0, j = 0; i < FileBuffer.AnzEntries(); i += j) { - SLONG Size = 0; - if (FileBuffer.AnzEntries() - i <= 1023) { - Size = FileBuffer.AnzEntries() - i; + for (SLONG i = 0; i < Entries.AnzEntries(); ++i) { + Entries[i].Text = nullptr; + } + + AnzStrings = 0; + AnzEntries = -1; + for (SLONG i = 0, j = 0; i < FileBuffer.AnzEntries(); i += j) { + SLONG Size = 0; + if (FileBuffer.AnzEntries() - i <= 1023) { + Size = FileBuffer.AnzEntries() - i; + } else { + Size = 1023; + } + memcpy(String, FileBuffer.getData() + i, Size); + for (j = 0; i + j < FileBuffer.AnzEntries() && String[j] != '\r' && String[j] != '\n' && String[j] != '\x1A'; ++j) { + ; + } + String[j] = 0; + TeakStrRemoveCppComment(String); + TeakStrRemoveEndingCodes(String, " "); + if (String[0] == '>' && String[1] != '>') { + if (strlen(String + 1) == 4) { + Group = *reinterpret_cast(String + 1); } else { - Size = 1023; - } - memcpy(String, FileBuffer.getData() + i, Size); - for (j = 0; i + j < FileBuffer.AnzEntries() && String[j] != '\r' && String[j] != '\n' && String[j] != '\x1A'; ++j) { - ; + Group = atoi(String + 1); } - String[j] = 0; - TeakStrRemoveCppComment(String); - TeakStrRemoveEndingCodes(String, " "); - if (String[0] == '>' && String[1] != '>') { - if (strlen(String + 1) == 4) { - Group = *reinterpret_cast(String + 1); - } else { - Group = atoi(String + 1); - } + } + if (String[0] == '>' && String[1] == '>') { + if (strlen(String + 2) == 4) { + Identifier = *reinterpret_cast(String + 2); + } else { + Identifier = atoi(String + 2); } - if (String[0] == '>' && String[1] == '>') { - if (strlen(String + 2) == 4) { - Identifier = *reinterpret_cast(String + 2); - } else { - Identifier = atoi(String + 2); + ++AnzEntries; + } + if (String[0] == ' ' && String[1] == ' ' && strlen(String) > 2 && AnzEntries >= 0) { + if (Entries[AnzEntries].Text != nullptr) { + strcat(Entries[AnzEntries].Text, String + 2); + strcat(Entries[AnzEntries].Text, ""); + AnzStrings += strlen(String + 2) + 1; + } else { + if (AnzEntries >= Entries.AnzEntries()) { + TeakLibW_Exception(FNL, ExcImpossible, ""); } - ++AnzEntries; - } - if (String[0] == ' ' && String[1] == ' ' && strlen(String) > 2 && AnzEntries >= 0) { - if (Entries[AnzEntries].Text != nullptr) { - strcat(Entries[AnzEntries].Text, String + 2); - strcat(Entries[AnzEntries].Text, ""); - AnzStrings += strlen(String + 2) + 1; - } else { - if (AnzEntries >= Entries.AnzEntries()) { - TeakLibW_Exception(FNL, ExcImpossible, ""); - } - Entries[AnzEntries].Group = Group; - Entries[AnzEntries].Id = Identifier; - Entries[AnzEntries].Text = Strings.getData() + AnzStrings; - strcpy(Entries[AnzEntries].Text, String + 2); - if (strlen(String + 2) + AnzStrings >= Strings.AnzEntries()) { - TeakLibW_Exception(FNL, ExcImpossible, ""); - } - AnzStrings += strlen(String + 2) + 1; + Entries[AnzEntries].Group = Group; + Entries[AnzEntries].Id = Identifier; + Entries[AnzEntries].Text = Strings.getData() + AnzStrings; + strcpy(Entries[AnzEntries].Text, String + 2); + if (strlen(String + 2) + AnzStrings >= Strings.AnzEntries()) { + TeakLibW_Exception(FNL, ExcImpossible, ""); } + AnzStrings += strlen(String + 2) + 1; } - while (j + i < FileBuffer.AnzEntries() && (FileBuffer[j + i] == '\r' || FileBuffer[j + i] == '\n' || FileBuffer[j + i] == '\x1A')) { - ++j; - } } - { delete[] String; } - } else { - Path.ReSize(strlen(source) + 1); - strcpy(Path.getData(), source); + while (j + i < FileBuffer.AnzEntries() && (FileBuffer[j + i] == '\r' || FileBuffer[j + i] == '\n' || FileBuffer[j + i] == '\x1A')) { + ++j; + } } + + delete[] String; } -char *TEXTRES::FindP(ULONG group, ULONG id) { +char *TEXTRES::FindTranslation(ULONG group, ULONG id) { char *text = FindOverridenS(group, id); if (text != nullptr) { return text; @@ -193,26 +192,18 @@ char *TEXTRES::FindP(ULONG group, ULONG id) { return nullptr; } - char *buffer = new char[strlen(text) + 1]; - strcpy(buffer, text); - LanguageSpecifyString(buffer); - - if (strlen(buffer) > 0x3FF) { - delete[] buffer; + if (strlen(text) > ResultStr.size()) { TeakLibW_Exception(FNL, ExcTextResStaticOverflow, group, id); } - static char result[0x3FF]; - strcpy(result, buffer); - delete[] buffer; - return result; -} -char *TEXTRES::FindS(ULONG group, ULONG id) { - return TEXTRES::FindP(group, id); + strncpy(ResultStr.data(), text, ResultStr.size()); + ResultStr[(int)ResultStr.size()] = '\0'; + LanguageSpecifyString(ResultStr.data()); + return ResultStr.data(); } char *TEXTRES::GetP(ULONG group, ULONG id) { - char *buffer = TEXTRES::FindP(group, id); + char *buffer = FindTranslation(group, id); if (buffer == nullptr) { TeakLibW_Exception(FNL, ExcTextResNotFound, group, id); return nullptr; @@ -221,7 +212,7 @@ char *TEXTRES::GetP(ULONG group, ULONG id) { } char *TEXTRES::GetS(ULONG group, ULONG id) { - char *buffer = TEXTRES::FindS(group, id); + char *buffer = FindTranslation(group, id); if (buffer == nullptr) { long long lGroup = group; AT_Log(ExcTextResNotFound, reinterpret_cast(&lGroup), id); @@ -237,7 +228,7 @@ char *TEXTRES::FindOverridenS(ULONG group, ULONG id) { if (!hasOverride) { return nullptr; } - return override->FindS(group, id); + return override->FindTranslation(group, id); } void TEXTRES::SetOverrideFile(char const *c) { @@ -245,6 +236,6 @@ void TEXTRES::SetOverrideFile(char const *c) { return; } override = new TEXTRES(); - override->Open(c, TEXTRES_CACHED); + override->Open(c); hasOverride = true; } diff --git a/src/global.h b/src/global.h index 1ad03f83..a2a1752b 100644 --- a/src/global.h +++ b/src/global.h @@ -44,7 +44,6 @@ extern TEAKRAND HeadlineRand; // Alles, was die zeitungen Angeht //-------------------------------------------------------------------------------------------- // Die Registratur: //-------------------------------------------------------------------------------------------- -extern CRegistration Registration; extern SLONG MissionKeys[]; // Die Schlüsselwerte für die Registry extern SLONG MissionKeys2[]; // Die Schlüsselwerte für die Registry extern SLONG MissionKeys3[]; // Die Schlüsselwerte für die Registry