From 21acb9d467b8f3406ab5031c8bff8510dc16f591 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 10 Dec 2023 14:54:00 +0100 Subject: [PATCH] simplify lump filter setup and move the Doom special case for 'doom.doom' out of FResourceFile --- src/common/filesystem/include/resourcefile.h | 2 - src/common/filesystem/source/resourcefile.cpp | 51 ++++--------------- src/d_main.cpp | 10 +++- 3 files changed, 20 insertions(+), 43 deletions(-) diff --git a/src/common/filesystem/include/resourcefile.h b/src/common/filesystem/include/resourcefile.h index e2787fd12d..4a7f3255bc 100644 --- a/src/common/filesystem/include/resourcefile.h +++ b/src/common/filesystem/include/resourcefile.h @@ -18,7 +18,6 @@ void strReplace(std::string& str, const char* from, const char* to); struct LumpFilterInfo { std::vector gameTypeFilter; // this can contain multiple entries - std::string dotFilter; // The following are for checking if the root directory of a zip can be removed. std::vector reservedFolders; @@ -194,7 +193,6 @@ private: uint32_t FirstLump; int FilterLumps(const std::string& filtername, void *lumps, size_t lumpsize, uint32_t max); - int FilterLumpsByGameType(LumpFilterInfo *filter, void *lumps, size_t lumpsize, uint32_t max); bool FindPrefixRange(const char* filter, void *lumps, size_t lumpsize, uint32_t max, uint32_t &start, uint32_t &end); void JunkLeftoverFilters(void *lumps, size_t lumpsize, uint32_t max); static FResourceFile *DoOpenResourceFile(const char *filename, FileReader &file, bool containeronly, LumpFilterInfo* filter, FileSystemMessageFunc Printf, StringPool* sp); diff --git a/src/common/filesystem/source/resourcefile.cpp b/src/common/filesystem/source/resourcefile.cpp index 420755a1a0..f8be0f15ae 100644 --- a/src/common/filesystem/source/resourcefile.cpp +++ b/src/common/filesystem/source/resourcefile.cpp @@ -407,21 +407,22 @@ void FResourceFile::PostProcessArchive(void *lumps, size_t lumpsize, LumpFilterI if (!filter) return; // Filter out lumps using the same names as the Autoload.* sections - // in the ini file use. We reduce the maximum lump concidered after + // in the ini file. We reduce the maximum lump concidered after // each one so that we don't risk refiltering already filtered lumps. uint32_t max = NumLumps; - max -= FilterLumpsByGameType(filter, lumps, lumpsize, max); - ptrdiff_t len; - ptrdiff_t lastpos = -1; - std::string file; - std::string& LumpFilter = filter->dotFilter; - while (size_t(len = LumpFilter.find_first_of('.', lastpos+1)) != LumpFilter.npos) + for (auto& LumpFilter : filter->gameTypeFilter) { - max -= FilterLumps(std::string(LumpFilter, 0, len), lumps, lumpsize, max); - lastpos = len; + ptrdiff_t len; + ptrdiff_t lastpos = -1; + std::string file; + while (size_t(len = LumpFilter.find_first_of('.', lastpos + 1)) != LumpFilter.npos) + { + max -= FilterLumps(std::string(LumpFilter, 0, len), lumps, lumpsize, max); + lastpos = len; + } + max -= FilterLumps(LumpFilter, lumps, lumpsize, max); } - max -= FilterLumps(LumpFilter, lumps, lumpsize, max); JunkLeftoverFilters(lumps, lumpsize, max); } @@ -448,13 +449,6 @@ int FResourceFile::FilterLumps(const std::string& filtername, void *lumps, size_ bool found = FindPrefixRange(filter.c_str(), lumps, lumpsize, max, start, end); - // Workaround for old Doom filter names (todo: move out of here.) - if (!found && filtername.find("doom.id.doom") == 0) - { - strReplace(filter, "doom.id.doom", "doom.doom"); - found = FindPrefixRange(filter.c_str(), lumps, lumpsize, max, start, end); - } - if (found) { void *from = (uint8_t *)lumps + start * lumpsize; @@ -491,29 +485,6 @@ int FResourceFile::FilterLumps(const std::string& filtername, void *lumps, size_ return end - start; } -//========================================================================== -// -// FResourceFile :: FilterLumpsByGameType -// -// Matches any lumps that match "filter/game-/*". Includes -// inclusive gametypes like Raven. -// -//========================================================================== - -int FResourceFile::FilterLumpsByGameType(LumpFilterInfo *filter, void *lumps, size_t lumpsize, uint32_t max) -{ - if (filter == nullptr) - { - return 0; - } - int count = 0; - for (auto &fstring : filter->gameTypeFilter) - { - count += FilterLumps(fstring, lumps, lumpsize, max); - } - return count; -} - //========================================================================== // // FResourceFile :: JunkLeftoverFilters diff --git a/src/d_main.cpp b/src/d_main.cpp index 54b1fffa23..22771119c5 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -3145,7 +3145,6 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw if (!batchrun) Printf ("W_Init: Init WADfiles.\n"); LumpFilterInfo lfi; - lfi.dotFilter = LumpFilterIWAD.GetChars(); static const struct { int match; const char* name; } blanket[] = { @@ -3161,6 +3160,15 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw } lfi.gameTypeFilter.push_back(FStringf("game-%s", GameTypeName()).GetChars()); + lfi.gameTypeFilter.push_back(LumpFilterIWAD.GetChars()); + // Workaround for old Doom filter names. + if (LumpFilterIWAD.Compare("doom.id.doom") == 0) + { + lfi.gameTypeFilter.push_back("doom.doom"); + } + + + GetReserved(lfi); lfi.postprocessFunc = [&]()