From 7c50dd84a70286475097d888aee322a2fcd76cf6 Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 31 Dec 2023 13:32:38 +0100 Subject: [PATCH 1/3] Reduced duplicated code between localize asset loaders --- .../Localize/CommonLocalizeEntry.cpp | 9 +++++ src/ObjCommon/Localize/CommonLocalizeEntry.h | 12 ++++++ .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 39 +++++------------- .../AssetLoaders/AssetLoaderLocalizeEntry.h | 1 + .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 39 +++++------------- .../AssetLoaders/AssetLoaderLocalizeEntry.h | 1 + .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 39 +++++------------- .../AssetLoaders/AssetLoaderLocalizeEntry.h | 1 + .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 39 +++++------------- .../Localize/LocalizeCommonAssetLoader.cpp | 40 +++++++++++++++++++ .../Localize/LocalizeCommonAssetLoader.h | 22 ++++++++++ 11 files changed, 130 insertions(+), 112 deletions(-) create mode 100644 src/ObjCommon/Localize/CommonLocalizeEntry.cpp create mode 100644 src/ObjCommon/Localize/CommonLocalizeEntry.h create mode 100644 src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp create mode 100644 src/ObjLoading/Localize/LocalizeCommonAssetLoader.h diff --git a/src/ObjCommon/Localize/CommonLocalizeEntry.cpp b/src/ObjCommon/Localize/CommonLocalizeEntry.cpp new file mode 100644 index 000000000..6d20809c7 --- /dev/null +++ b/src/ObjCommon/Localize/CommonLocalizeEntry.cpp @@ -0,0 +1,9 @@ +#include "CommonLocalizeEntry.h" + +CommonLocalizeEntry::CommonLocalizeEntry() = default; + +CommonLocalizeEntry::CommonLocalizeEntry(std::string key, std::string value) + : m_key(std::move(key)), + m_value(std::move(value)) +{ +} diff --git a/src/ObjCommon/Localize/CommonLocalizeEntry.h b/src/ObjCommon/Localize/CommonLocalizeEntry.h new file mode 100644 index 000000000..811ad33af --- /dev/null +++ b/src/ObjCommon/Localize/CommonLocalizeEntry.h @@ -0,0 +1,12 @@ +#pragma once +#include + +class CommonLocalizeEntry +{ +public: + std::string m_key; + std::string m_value; + + CommonLocalizeEntry(); + CommonLocalizeEntry(std::string key, std::string value); +}; diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp index 6295f5219..a4fd689ca 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp @@ -1,9 +1,6 @@ #include "AssetLoaderLocalizeEntry.h" -#include "Localize/LocalizeCommon.h" -#include "Localize/Parsing/LocalizeFileReader.h" - -#include +#include "Localize/LocalizeCommonAssetLoader.h" using namespace IW4; @@ -25,29 +22,15 @@ bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const bool AssetLoaderLocalizeEntry::LoadFromRaw( const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const { - std::string fileName; - { - std::ostringstream str; - str << LocalizeCommon::GetNameOfLanguage(zone->m_language) << "/localizedstrings/" << assetName << ".str"; - fileName = str.str(); - } - - const auto file = searchPath->Open(fileName); - if (!file.IsOpen()) - return false; - - auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState(); - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); - const auto localizeEntries = reader.ReadLocalizeFile(); - - for (const auto& [key, value] : localizeEntries) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(key.c_str()); - localizeEntry->value = memory->Dup(value.c_str()); - - manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, key, localizeEntry); - } + LocalizeCommonAssetLoader commonLoader( + [memory, manager](const CommonLocalizeEntry& entry) + { + auto* localizeEntry = memory->Create(); + localizeEntry->name = memory->Dup(entry.m_key.c_str()); + localizeEntry->value = memory->Dup(entry.m_value.c_str()); - return true; + manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, entry.m_key, localizeEntry); + }); + + return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); } diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.h b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.h index 9833c10bc..4dbf15218 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.h +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.h @@ -1,4 +1,5 @@ #pragma once + #include "AssetLoading/BasicAssetLoader.h" #include "AssetLoading/IAssetLoadingManager.h" #include "Game/IW4/IW4.h" diff --git a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp index 52c4a53e0..f8c47383b 100644 --- a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp @@ -1,9 +1,6 @@ #include "AssetLoaderLocalizeEntry.h" -#include "Localize/LocalizeCommon.h" -#include "Localize/Parsing/LocalizeFileReader.h" - -#include +#include "Localize/LocalizeCommonAssetLoader.h" using namespace IW5; @@ -25,29 +22,15 @@ bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const bool AssetLoaderLocalizeEntry::LoadFromRaw( const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const { - std::string fileName; - { - std::ostringstream str; - str << LocalizeCommon::GetNameOfLanguage(zone->m_language) << "/localizedstrings/" << assetName << ".str"; - fileName = str.str(); - } - - const auto file = searchPath->Open(fileName); - if (!file.IsOpen()) - return false; - - auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState(); - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); - const auto localizeEntries = reader.ReadLocalizeFile(); - - for (const auto& [key, value] : localizeEntries) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(key.c_str()); - localizeEntry->value = memory->Dup(value.c_str()); - - manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, key, localizeEntry); - } + LocalizeCommonAssetLoader commonLoader( + [memory, manager](const CommonLocalizeEntry& entry) + { + auto* localizeEntry = memory->Create(); + localizeEntry->name = memory->Dup(entry.m_key.c_str()); + localizeEntry->value = memory->Dup(entry.m_value.c_str()); - return true; + manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, entry.m_key, localizeEntry); + }); + + return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); } diff --git a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.h b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.h index d21c80c70..e35c2fd51 100644 --- a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.h +++ b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.h @@ -1,4 +1,5 @@ #pragma once + #include "AssetLoading/BasicAssetLoader.h" #include "AssetLoading/IAssetLoadingManager.h" #include "Game/IW5/IW5.h" diff --git a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp index 05e353a97..6152f8775 100644 --- a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ b/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp @@ -1,9 +1,6 @@ #include "AssetLoaderLocalizeEntry.h" -#include "Localize/LocalizeCommon.h" -#include "Localize/Parsing/LocalizeFileReader.h" - -#include +#include "Localize/LocalizeCommonAssetLoader.h" using namespace T5; @@ -25,29 +22,15 @@ bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const bool AssetLoaderLocalizeEntry::LoadFromRaw( const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const { - std::string fileName; - { - std::ostringstream str; - str << LocalizeCommon::GetNameOfLanguage(zone->m_language) << "/localizedstrings/" << assetName << ".str"; - fileName = str.str(); - } - - const auto file = searchPath->Open(fileName); - if (!file.IsOpen()) - return false; - - auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState(); - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); - const auto localizeEntries = reader.ReadLocalizeFile(); - - for (const auto& [key, value] : localizeEntries) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(key.c_str()); - localizeEntry->value = memory->Dup(value.c_str()); - - manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, key, localizeEntry); - } + LocalizeCommonAssetLoader commonLoader( + [memory, manager](const CommonLocalizeEntry& entry) + { + auto* localizeEntry = memory->Create(); + localizeEntry->name = memory->Dup(entry.m_key.c_str()); + localizeEntry->value = memory->Dup(entry.m_value.c_str()); - return true; + manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, entry.m_key, localizeEntry); + }); + + return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); } diff --git a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.h b/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.h index b311172cc..005f51cc3 100644 --- a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.h +++ b/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.h @@ -1,4 +1,5 @@ #pragma once + #include "AssetLoading/BasicAssetLoader.h" #include "AssetLoading/IAssetLoadingManager.h" #include "Game/T5/T5.h" diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp index 9dda88e42..2aaa13e53 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp @@ -1,9 +1,6 @@ #include "AssetLoaderLocalizeEntry.h" -#include "Localize/LocalizeCommon.h" -#include "Localize/Parsing/LocalizeFileReader.h" - -#include +#include "Localize/LocalizeCommonAssetLoader.h" using namespace T6; @@ -25,29 +22,15 @@ bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const bool AssetLoaderLocalizeEntry::LoadFromRaw( const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const { - std::string fileName; - { - std::ostringstream str; - str << LocalizeCommon::GetNameOfLanguage(zone->m_language) << "/localizedstrings/" << assetName << ".str"; - fileName = str.str(); - } - - const auto file = searchPath->Open(fileName); - if (!file.IsOpen()) - return false; - - auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState(); - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); - const auto localizeEntries = reader.ReadLocalizeFile(); - - for (const auto& [key, value] : localizeEntries) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(key.c_str()); - localizeEntry->value = memory->Dup(value.c_str()); - - manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, key, localizeEntry); - } + LocalizeCommonAssetLoader commonLoader( + [memory, manager](const CommonLocalizeEntry& entry) + { + auto* localizeEntry = memory->Create(); + localizeEntry->name = memory->Dup(entry.m_key.c_str()); + localizeEntry->value = memory->Dup(entry.m_value.c_str()); - return true; + manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, entry.m_key, localizeEntry); + }); + + return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); } diff --git a/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp new file mode 100644 index 000000000..ab39dff55 --- /dev/null +++ b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp @@ -0,0 +1,40 @@ +#include "LocalizeCommonAssetLoader.h" + +#include "Localize/LocalizeCommon.h" +#include "Localize/LocalizeReadingZoneState.h" +#include "Localize/Parsing/LocalizeFileReader.h" + +#include + +LocalizeCommonAssetLoader::LocalizeCommonAssetLoader(std::function entryCallback) + : m_entry_callback(std::move(entryCallback)) +{ +} + +std::string LocalizeCommonAssetLoader::GetFileName(const std::string& assetName, Zone* zone) const +{ + std::ostringstream ss; + ss << LocalizeCommon::GetNameOfLanguage(zone->m_language) << "/localizedstrings/" << assetName << ".str"; + return ss.str(); +} + +bool LocalizeCommonAssetLoader::LoadLocalizeAsset(const std::string& assetName, ISearchPath* searchPath, IAssetLoadingManager* manager, Zone* zone) const +{ + std::string fileName = GetFileName(assetName, zone); + + const auto file = searchPath->Open(fileName); + if (!file.IsOpen()) + return false; + + auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState(); + LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); + const auto localizeEntries = reader.ReadLocalizeFile(); + + for (const auto& [key, value] : localizeEntries) + { + CommonLocalizeEntry entry(key, value); + m_entry_callback(entry); + } + + return true; +} diff --git a/src/ObjLoading/Localize/LocalizeCommonAssetLoader.h b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.h new file mode 100644 index 000000000..0955b6309 --- /dev/null +++ b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.h @@ -0,0 +1,22 @@ +#pragma once + +#include "AssetLoading/IAssetLoadingManager.h" +#include "Localize/CommonLocalizeEntry.h" +#include "SearchPath/ISearchPath.h" +#include "Zone/Zone.h" + +#include +#include + +class LocalizeCommonAssetLoader +{ +public: + explicit LocalizeCommonAssetLoader(std::function entryCallback); + + bool LoadLocalizeAsset(const std::string& assetName, ISearchPath* searchPath, IAssetLoadingManager* manager, Zone* zone) const; + +private: + std::string GetFileName(const std::string& assetName, Zone* zone) const; + + std::function m_entry_callback; +}; From eb065658e6632c51b07a380b26d5c9d27f2a03b1 Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 31 Dec 2023 13:40:51 +0100 Subject: [PATCH 2/3] Use CommonLocalizeEntry in parser --- src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp | 3 +-- src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp | 2 +- src/ObjLoading/Localize/Parsing/LocalizeFileParser.h | 2 +- src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp | 4 ++-- src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h | 5 +++-- src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp | 6 +++--- src/ObjLoading/Localize/Parsing/LocalizeFileReader.h | 3 ++- .../Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp | 2 +- 8 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp index ab39dff55..b4153dd1f 100644 --- a/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp +++ b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp @@ -30,9 +30,8 @@ bool LocalizeCommonAssetLoader::LoadLocalizeAsset(const std::string& assetName, LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); const auto localizeEntries = reader.ReadLocalizeFile(); - for (const auto& [key, value] : localizeEntries) + for (const auto& entry : localizeEntries) { - CommonLocalizeEntry entry(key, value); m_entry_callback(entry); } diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp index 56413ac65..35958c067 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp @@ -32,7 +32,7 @@ const std::vector::se return !m_state->m_end ? tests : noTests; } -std::map LocalizeFileParser::GetParsedValues() +std::vector LocalizeFileParser::GetParsedValues() { return std::move(m_state->m_entries); } diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h index e9072cf2f..20b5b39bc 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h @@ -13,5 +13,5 @@ class LocalizeFileParser final : public AbstractParser GetParsedValues(); + std::vector GetParsedValues(); }; diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp index 35dbc8086..0a52c5f8b 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp @@ -1,6 +1,7 @@ #include "LocalizeFileParserState.h" #include "Localize/LocalizeCommon.h" +#include "Utils/StringUtils.h" LocalizeFileParserState::LocalizeFileParserState(const GameLanguage language, LocalizeReadingZoneState* zoneState) : m_end(false), @@ -8,6 +9,5 @@ LocalizeFileParserState::LocalizeFileParserState(const GameLanguage language, Lo m_zone_state(zoneState) { m_language_name_caps = LocalizeCommon::GetNameOfLanguage(m_language); - for (auto& c : m_language_name_caps) - c = static_cast(toupper(c)); + utils::MakeStringUpperCase(m_language_name_caps); } diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h index ad83741ea..bee910d78 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h @@ -1,17 +1,18 @@ #pragma once #include "Game/GameLanguage.h" +#include "Localize/CommonLocalizeEntry.h" #include "Localize/LocalizeReadingZoneState.h" -#include #include +#include class LocalizeFileParserState { public: bool m_end; - std::map m_entries; + std::vector m_entries; GameLanguage m_language; LocalizeReadingZoneState* m_zone_state; diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp index a2c1a3444..5621bc88e 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp @@ -28,7 +28,7 @@ void LocalizeFileReader::SetupStreamProxies() m_stream = m_open_streams.back().get(); } -std::map LocalizeFileReader::ReadLocalizeFile() +std::vector LocalizeFileReader::ReadLocalizeFile() { SimpleLexer::Config lexerConfig; lexerConfig.m_emit_new_line_tokens = true; @@ -43,6 +43,6 @@ std::map LocalizeFileReader::ReadLocalizeFile() if (parser->Parse()) return parser->GetParsedValues(); - std::cout << "Parsing localization file failed!" << std::endl; - return std::map(); + std::cerr << "Parsing localization file failed!" << std::endl; + return std::vector(); } diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h index cf4572bc8..da0ac2f2d 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h @@ -1,6 +1,7 @@ #pragma once #include "Game/GameLanguage.h" +#include "Localize/CommonLocalizeEntry.h" #include "Localize/LocalizeReadingZoneState.h" #include "Parsing/IParserLineStream.h" @@ -23,5 +24,5 @@ class LocalizeFileReader public: LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language, LocalizeReadingZoneState* zoneState); - std::map ReadLocalizeFile(); + std::vector ReadLocalizeFile(); }; diff --git a/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp b/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp index 064a5fcd6..fbf8110bf 100644 --- a/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp +++ b/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp @@ -38,6 +38,6 @@ void SequenceLocalizeFileLanguageValue::ProcessMatch(LocalizeFileParserState* st std::cout << "Localize: a value for reference \"" << currentReference << "\" was already defined\n"; } - state->m_entries[currentReference] = valueToken.StringValue(); + state->m_entries.emplace_back(currentReference, valueToken.StringValue()); } } From 9d0beaa8fc0056416938865a4a7b91f8bd4b892e Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 31 Dec 2023 13:45:17 +0100 Subject: [PATCH 3/3] Communicate to the asset loader when parsing localize file failed --- src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp | 5 ++++- src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp | 9 ++++++--- src/ObjLoading/Localize/Parsing/LocalizeFileReader.h | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp index b4153dd1f..bbfd8bd35 100644 --- a/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp +++ b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp @@ -28,7 +28,10 @@ bool LocalizeCommonAssetLoader::LoadLocalizeAsset(const std::string& assetName, auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState(); LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); - const auto localizeEntries = reader.ReadLocalizeFile(); + + std::vector localizeEntries; + if (!reader.ReadLocalizeFile(localizeEntries)) + return false; for (const auto& entry : localizeEntries) { diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp index 5621bc88e..fbe1ff23b 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp @@ -28,7 +28,7 @@ void LocalizeFileReader::SetupStreamProxies() m_stream = m_open_streams.back().get(); } -std::vector LocalizeFileReader::ReadLocalizeFile() +bool LocalizeFileReader::ReadLocalizeFile(std::vector& entries) { SimpleLexer::Config lexerConfig; lexerConfig.m_emit_new_line_tokens = true; @@ -41,8 +41,11 @@ std::vector LocalizeFileReader::ReadLocalizeFile() const auto parser = std::make_unique(lexer.get(), m_language, m_zone_state); if (parser->Parse()) - return parser->GetParsedValues(); + { + entries = parser->GetParsedValues(); + return true; + } std::cerr << "Parsing localization file failed!" << std::endl; - return std::vector(); + return false; } diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h index da0ac2f2d..1abb4d600 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h @@ -24,5 +24,5 @@ class LocalizeFileReader public: LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language, LocalizeReadingZoneState* zoneState); - std::vector ReadLocalizeFile(); + bool ReadLocalizeFile(std::vector& entries); };