From 196e2edd8a509cbec53666cb8d0a370bf0b7171e Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 31 Dec 2023 12:28:13 +0100 Subject: [PATCH] Use ZoneState to check whether localize key is duplicated --- .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 3 ++- .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 3 ++- .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 3 ++- .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 3 ++- .../Localize/LocalizeReadingZoneState.cpp | 11 ++++++++++ .../Localize/LocalizeReadingZoneState.h | 22 +++++++++++++++++++ .../Localize/Parsing/LocalizeFileParser.cpp | 4 ++-- .../Localize/Parsing/LocalizeFileParser.h | 2 +- .../Parsing/LocalizeFileParserState.cpp | 5 +++-- .../Parsing/LocalizeFileParserState.h | 5 ++++- .../Localize/Parsing/LocalizeFileReader.cpp | 7 +++--- .../Localize/Parsing/LocalizeFileReader.h | 4 +++- .../SequenceLocalizeFileLanguageValue.cpp | 2 +- 13 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 src/ObjLoading/Localize/LocalizeReadingZoneState.cpp create mode 100644 src/ObjLoading/Localize/LocalizeReadingZoneState.h diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp index 426458686..6295f5219 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp @@ -36,7 +36,8 @@ bool AssetLoaderLocalizeEntry::LoadFromRaw( if (!file.IsOpen()) return false; - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language); + 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) diff --git a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp index ca010b45a..52c4a53e0 100644 --- a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp @@ -36,7 +36,8 @@ bool AssetLoaderLocalizeEntry::LoadFromRaw( if (!file.IsOpen()) return false; - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language); + 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) diff --git a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp index 407c42778..05e353a97 100644 --- a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ b/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp @@ -36,7 +36,8 @@ bool AssetLoaderLocalizeEntry::LoadFromRaw( if (!file.IsOpen()) return false; - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language); + 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) diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp index c24e6c05a..9dda88e42 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp @@ -36,7 +36,8 @@ bool AssetLoaderLocalizeEntry::LoadFromRaw( if (!file.IsOpen()) return false; - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language); + 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) diff --git a/src/ObjLoading/Localize/LocalizeReadingZoneState.cpp b/src/ObjLoading/Localize/LocalizeReadingZoneState.cpp new file mode 100644 index 000000000..652c5ba9f --- /dev/null +++ b/src/ObjLoading/Localize/LocalizeReadingZoneState.cpp @@ -0,0 +1,11 @@ +#include "LocalizeReadingZoneState.h" + +bool LocalizeReadingZoneState::DoLocalizeEntryDuplicateCheck(const std::string& key) +{ + const auto existingEntry = m_keys.find(key); + if (existingEntry != m_keys.end()) + return false; + + m_keys.emplace(key); + return true; +} diff --git a/src/ObjLoading/Localize/LocalizeReadingZoneState.h b/src/ObjLoading/Localize/LocalizeReadingZoneState.h new file mode 100644 index 000000000..6350e138b --- /dev/null +++ b/src/ObjLoading/Localize/LocalizeReadingZoneState.h @@ -0,0 +1,22 @@ +#pragma once + +#include "AssetLoading/IZoneAssetLoaderState.h" + +#include +#include + +class LocalizeReadingZoneState final : public IZoneAssetLoaderState +{ +public: + /** + * Checks whether a localize key was already added. + * Inserts key if it was not added yet. + * + * \param key The key to check + * \returns \c true if key was not duplicated yet, \c false otherwise + */ + bool DoLocalizeEntryDuplicateCheck(const std::string& key); + +private: + std::unordered_set m_keys; +}; diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp index 796f3dd57..56413ac65 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp @@ -8,8 +8,8 @@ #include "Sequence/SequenceLocalizeFileReference.h" #include "Sequence/SequenceLocalizeFileVersion.h" -LocalizeFileParser::LocalizeFileParser(SimpleLexer* lexer, GameLanguage language) - : AbstractParser(lexer, std::make_unique(language)) +LocalizeFileParser::LocalizeFileParser(SimpleLexer* lexer, GameLanguage language, LocalizeReadingZoneState* zoneState) + : AbstractParser(lexer, std::make_unique(language, zoneState)) { } diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h index 4740a8b7c..e9072cf2f 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h @@ -12,6 +12,6 @@ class LocalizeFileParser final : public AbstractParser& GetTestsForState() override; public: - LocalizeFileParser(SimpleLexer* lexer, GameLanguage language); + LocalizeFileParser(SimpleLexer* lexer, GameLanguage language, LocalizeReadingZoneState* zoneState); std::map GetParsedValues(); }; diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp index 803081ec6..35dbc8086 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp @@ -2,9 +2,10 @@ #include "Localize/LocalizeCommon.h" -LocalizeFileParserState::LocalizeFileParserState(const GameLanguage language) +LocalizeFileParserState::LocalizeFileParserState(const GameLanguage language, LocalizeReadingZoneState* zoneState) : m_end(false), - m_language(language) + m_language(language), + m_zone_state(zoneState) { m_language_name_caps = LocalizeCommon::GetNameOfLanguage(m_language); for (auto& c : m_language_name_caps) diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h index d34d5d096..ad83741ea 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h @@ -1,5 +1,7 @@ #pragma once + #include "Game/GameLanguage.h" +#include "Localize/LocalizeReadingZoneState.h" #include #include @@ -12,10 +14,11 @@ class LocalizeFileParserState std::map m_entries; GameLanguage m_language; + LocalizeReadingZoneState* m_zone_state; std::string m_language_name_caps; std::string m_current_reference; std::unordered_set m_current_reference_languages; - explicit LocalizeFileParserState(GameLanguage language); + LocalizeFileParserState(GameLanguage language, LocalizeReadingZoneState* zoneState); }; diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp index 3297a8f27..a2c1a3444 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp @@ -4,10 +4,11 @@ #include "Parsing/Impl/CommentRemovingStreamProxy.h" #include "Parsing/Impl/ParserSingleInputStream.h" -LocalizeFileReader::LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language) +LocalizeFileReader::LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language, LocalizeReadingZoneState* zoneState) : m_file_name(std::move(fileName)), m_stream(nullptr), - m_language(language) + m_language(language), + m_zone_state(zoneState) { OpenBaseStream(stream); SetupStreamProxies(); @@ -37,7 +38,7 @@ std::map LocalizeFileReader::ReadLocalizeFile() lexerConfig.m_read_floating_point_numbers = false; const auto lexer = std::make_unique(m_stream, std::move(lexerConfig)); - const auto parser = std::make_unique(lexer.get(), m_language); + const auto parser = std::make_unique(lexer.get(), m_language, m_zone_state); if (parser->Parse()) return parser->GetParsedValues(); diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h index 79bd59d28..cf4572bc8 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/LocalizeReadingZoneState.h" #include "Parsing/IParserLineStream.h" #include @@ -14,12 +15,13 @@ class LocalizeFileReader IParserLineStream* m_stream; std::vector> m_open_streams; GameLanguage m_language; + LocalizeReadingZoneState* m_zone_state; bool OpenBaseStream(std::istream& stream); void SetupStreamProxies(); public: - LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language); + LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language, LocalizeReadingZoneState* zoneState); std::map ReadLocalizeFile(); }; diff --git a/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp b/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp index e858e94ec..064a5fcd6 100644 --- a/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp +++ b/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp @@ -33,7 +33,7 @@ void SequenceLocalizeFileLanguageValue::ProcessMatch(LocalizeFileParserState* st if (langName == state->m_language_name_caps) { const auto& currentReference = state->m_current_reference; - if (const auto i = state->m_entries.find(currentReference); i != state->m_entries.end()) + if (!state->m_zone_state->DoLocalizeEntryDuplicateCheck(currentReference)) { std::cout << "Localize: a value for reference \"" << currentReference << "\" was already defined\n"; }