diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/tools/vmap4_extractor/adtfile.cpp | 108 | ||||
| -rw-r--r-- | src/tools/vmap4_extractor/adtfile.h | 7 | ||||
| -rw-r--r-- | src/tools/vmap4_extractor/gameobject_extract.cpp | 18 | ||||
| -rw-r--r-- | src/tools/vmap4_extractor/model.cpp | 12 | ||||
| -rw-r--r-- | src/tools/vmap4_extractor/vmapexport.cpp | 18 | ||||
| -rw-r--r-- | src/tools/vmap4_extractor/wdtfile.cpp | 20 | ||||
| -rw-r--r-- | src/tools/vmap4_extractor/wmo.cpp | 17 |
7 files changed, 72 insertions, 128 deletions
diff --git a/src/tools/vmap4_extractor/adtfile.cpp b/src/tools/vmap4_extractor/adtfile.cpp index d34c2a3cfdf..68ad7097cb5 100644 --- a/src/tools/vmap4_extractor/adtfile.cpp +++ b/src/tools/vmap4_extractor/adtfile.cpp @@ -16,72 +16,46 @@ */ #include "adtfile.h" +#include "Common.h" #include "Memory.h" #include "StringFormat.h" +#include "Util.h" #include "vmapexport.h" #include <cstdio> -char const* GetPlainName(char const* FileName) +std::string_view GetPlainName(std::string_view fileName) { - const char * szTemp; + std::size_t lastSeparatorPos = fileName.find_last_of("\\/"sv); - if((szTemp = strrchr(FileName, '\\')) != nullptr) - FileName = szTemp + 1; - return FileName; -} - -char* GetPlainName(char* FileName) -{ - char * szTemp; + if (lastSeparatorPos != std::string_view::npos) + fileName.remove_prefix(lastSeparatorPos + 1); - if((szTemp = strrchr(FileName, '\\')) != nullptr) - FileName = szTemp + 1; - return FileName; + return fileName; } -void FixNameCase(char* name, size_t len) +void NormalizeFileName(std::string& name) { - char* ptr = name + len - 1; + if (name.starts_with("FILE"sv)) // name is FileDataId formatted, do not normalize + return; + + auto ptr = name.begin() + (name.length() - 1); //extension in lowercase - for (; *ptr != '.' && ptr >= name; --ptr) - *ptr |= 0x20; + for (; *ptr != '.' && ptr >= name.begin(); --ptr) + if (*ptr >= 'A' && *ptr <= 'Z') + *ptr |= 0x20; - for (; ptr >= name; --ptr) + for (; ptr >= name.begin(); --ptr) { - if (ptr > name && *ptr >= 'A' && *ptr <= 'Z' && isalpha(*(ptr - 1))) + if (ptr > name.begin() && *ptr >= 'A' && *ptr <= 'Z' && isalpha(*(ptr - 1))) *ptr |= 0x20; - else if ((ptr == name || !isalpha(*(ptr - 1))) && *ptr >= 'a' && *ptr <= 'z') + else if ((ptr == name.begin() || !isalpha(*(ptr - 1))) && *ptr >= 'a' && *ptr <= 'z') *ptr &= ~0x20; + else if (*ptr == ' ') + *ptr = '_'; } } -void FixNameSpaces(char* name, size_t len) -{ - if (len < 3) - return; - - for (size_t i = 0; i < len - 3; i++) - if (name[i] == ' ') - name[i] = '_'; -} - -void NormalizeFileName(char* name, size_t len) -{ - if (len >= 4 && !memcmp(name, "FILE", 4)) // name is FileDataId formatted, do not normalize - return; - - FixNameCase(name, len); - FixNameSpaces(name, len); -} - -char* GetExtension(char* FileName) -{ - if (char* szTemp = strrchr(FileName, '.')) - return szTemp; - return nullptr; -} - extern std::shared_ptr<CASC::Storage> CascStorage; ADTFile::ADTFile(std::string const& filename, bool cache) : _file(CascStorage, filename.c_str(), false) @@ -130,46 +104,32 @@ bool ADTFile::init(uint32 map_num, uint32 originalMapId) { if (size) { - char* buf = new char[size]; - _file.read(buf, size); - char* p = buf; - while (p < buf + size) + char* p = _file.getPointer(); + _file.seekRelative(size); + char* end = _file.getPointer(); + while (p < end) { - std::string path(p); + std::size_t length = std::ranges::distance(p, CStringSentinel.Checked(end)); + ModelInstanceNames.emplace_back(p, length); - char* s = GetPlainName(p); - NormalizeFileName(s, strlen(s)); - - ModelInstanceNames.emplace_back(s); - - ExtractSingleModel(path); - - p += strlen(p) + 1; + p += length + 1; } - delete[] buf; } } else if (!strcmp(fourcc,"MWMO")) { if (size) { - char* buf = new char[size]; - _file.read(buf, size); - char* p = buf; - while (p < buf + size) + char* p = _file.getPointer(); + _file.seekRelative(size); + char* end = _file.getPointer(); + while (p < end) { - std::string path(p); - - char* s = GetPlainName(p); - NormalizeFileName(s, strlen(s)); - - WmoInstanceNames.emplace_back(s); - - ExtractSingleWmo(path); + std::size_t length = std::ranges::distance(p, CStringSentinel.Checked(end)); + WmoInstanceNames.emplace_back(p, length); - p += strlen(p) + 1; + p += length + 1; } - delete[] buf; } } //====================== diff --git a/src/tools/vmap4_extractor/adtfile.h b/src/tools/vmap4_extractor/adtfile.h index 8c03da3b58b..f1c0476d244 100644 --- a/src/tools/vmap4_extractor/adtfile.h +++ b/src/tools/vmap4_extractor/adtfile.h @@ -72,10 +72,7 @@ public: bool initFromCache(uint32 map_num, uint32 originalMapId); }; -char const* GetPlainName(char const* FileName); -char* GetPlainName(char* FileName); -char* GetExtension(char* FileName); -void NormalizeFileName(char* name, size_t len); -//void fixMapNamen(char *name, size_t len); +std::string_view GetPlainName(std::string_view fileName); +void NormalizeFileName(std::string& fileName); #endif diff --git a/src/tools/vmap4_extractor/gameobject_extract.cpp b/src/tools/vmap4_extractor/gameobject_extract.cpp index df9fcb95f16..a7774347212 100644 --- a/src/tools/vmap4_extractor/gameobject_extract.cpp +++ b/src/tools/vmap4_extractor/gameobject_extract.cpp @@ -20,6 +20,7 @@ #include "Errors.h" #include "ExtractorDB2LoadInfo.h" #include "Memory.h" +#include "StringConvert.h" #include "model.h" #include "StringFormat.h" #include "vmapexport.h" @@ -34,19 +35,16 @@ ExtractedModelData const* ExtractSingleModel(std::string& fname) if (fname.length() < 4) return nullptr; - std::string extension = fname.substr(fname.length() - 4, 4); - if (extension == ".mdx" || extension == ".MDX" || extension == ".mdl" || extension == ".MDL") - { - fname.erase(fname.length() - 2, 2); - fname.append("2"); - } + std::string_view extension = std::string_view(fname).substr(fname.length() - 4, 4); + if (StringEqualI(extension, ".mdx"sv) || StringEqualI(extension, ".mdl"sv)) + fname.replace(fname.length() - 2, 2, "2"); std::string originalName = fname; - char* name = GetPlainName((char*)fname.c_str()); - NormalizeFileName(name, strlen(name)); + fname = GetPlainName(fname); + NormalizeFileName(fname); - auto [model, shouldExtract] = BeginModelExtraction(name); + auto [model, shouldExtract] = BeginModelExtraction(fname); if (!shouldExtract) { model->Wait(); @@ -61,7 +59,7 @@ ExtractedModelData const* ExtractSingleModel(std::string& fname) std::string output(szWorkDirWmo); output += "/"; - output += name; + output += fname; if (!mdl.ConvertToVMAPModel(output.c_str())) return nullptr; diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp index fc4aff04902..f5ce45929bb 100644 --- a/src/tools/vmap4_extractor/model.cpp +++ b/src/tools/vmap4_extractor/model.cpp @@ -233,23 +233,17 @@ void Doodad::ExtractSet(WMODoodadData const& doodadData, ADT::MODF const& wmo, b std::string ModelInstName; if (doodadData.Paths) - ModelInstName = GetPlainName(&doodadData.Paths[doodad.NameIndex]); + ModelInstName = &doodadData.Paths[doodad.NameIndex]; else if (doodadData.FileDataIds) ModelInstName = Trinity::StringFormat("FILE{:08X}.xxx", doodadData.FileDataIds[doodad.NameIndex]); else ASSERT(false); - uint32 nlen = ModelInstName.length(); - NormalizeFileName(ModelInstName.data(), nlen); - if (ModelInstName.ends_with(".mdx") || ModelInstName.ends_with(".mdl")) - { - ModelInstName.replace(ModelInstName.length() - 2, 2, "2"); - nlen = ModelInstName.length(); - } - if (!ExtractSingleModel(ModelInstName)) continue; + uint32 nlen = ModelInstName.length(); + ASSERT(doodadId < std::numeric_limits<uint16>::max()); ++doodadId; diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp index 92bb2b087a2..91508b1ca6d 100644 --- a/src/tools/vmap4_extractor/vmapexport.cpp +++ b/src/tools/vmap4_extractor/vmapexport.cpp @@ -202,10 +202,10 @@ ExtractedModelData const* ExtractSingleWmo(std::string& fname) // Copy files from archive std::string originalName = fname; - char* plain_name = GetPlainName(&fname[0]); - NormalizeFileName(plain_name, strlen(plain_name)); + fname = GetPlainName(fname); + NormalizeFileName(fname); - auto [model, shouldExtract] = BeginModelExtraction(plain_name); + auto [model, shouldExtract] = BeginModelExtraction(fname); if (!shouldExtract) { model->Wait(); @@ -223,10 +223,10 @@ ExtractedModelData const* ExtractSingleWmo(std::string& fname) int p = 0; // Select root wmo files - char const* rchr = strrchr(plain_name, '_'); - if (rchr != nullptr) - for (int i = 0; i < 4; ++i) - if (isdigit(rchr[i])) + std::size_t rchr = fname.find_last_of('_'); + if (rchr != std::string::npos) + for (std::size_t i = 0; i < 4 && rchr + i < fname.length(); ++i) + if (isdigit(fname[rchr + i])) p++; if (p == 3) @@ -239,7 +239,7 @@ ExtractedModelData const* ExtractSingleWmo(std::string& fname) printf("Couldn't open RootWmo!!!\n"); return nullptr; } - std::string szLocalFile = Trinity::StringFormat("{}/{}", szWorkDirWmo, plain_name); + std::string szLocalFile = Trinity::StringFormat("{}/{}", szWorkDirWmo, fname); FILE* output = fopen(szLocalFile.c_str(), "wb"); if(!output) { @@ -260,7 +260,7 @@ ExtractedModelData const* ExtractSingleWmo(std::string& fname) WMOGroup& fgroup = groups.emplace_back(s); if (!fgroup.open(&froot)) { - printf("Could not open all Group file for: %s\n", plain_name); + printf("Could not open all Group file for: %s\n", fname.c_str()); file_ok = false; break; } diff --git a/src/tools/vmap4_extractor/wdtfile.cpp b/src/tools/vmap4_extractor/wdtfile.cpp index 58f26bb7b65..d117a87a19e 100644 --- a/src/tools/vmap4_extractor/wdtfile.cpp +++ b/src/tools/vmap4_extractor/wdtfile.cpp @@ -22,6 +22,7 @@ #include "Errors.h" #include "Memory.h" #include "StringFormat.h" +#include "Util.h" #include <cstdio> extern std::shared_ptr<CASC::Storage> CascStorage; @@ -81,21 +82,16 @@ bool WDTFile::init(uint32 mapId) // global map objects if (size) { - char *buf = new char[size]; - _file.read(buf, size); - char *p = buf; - while (p < buf + size) + char* p = _file.getPointer(); + _file.seekRelative(size); + char* end = _file.getPointer(); + while (p < end) { - std::string path(p); + std::size_t length = std::ranges::distance(p, CStringSentinel.Checked(end)); + _wmoNames.emplace_back(p, length); - char* s = GetPlainName(p); - NormalizeFileName(s, strlen(s)); - p = p + strlen(p) + 1; - _wmoNames.emplace_back(s); - - ExtractSingleWmo(path); + p += length + 1; } - delete[] buf; } } else if (!strcmp(fourcc, "MODF")) diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp index 1f1ecb467d2..ae81e376ebd 100644 --- a/src/tools/vmap4_extractor/wmo.cpp +++ b/src/tools/vmap4_extractor/wmo.cpp @@ -23,6 +23,7 @@ #include "vec3d.h" #include "VMapDefinitions.h" #include "wmo.h" +#include "Util.h" #include <algorithm> #include <fstream> #include <map> @@ -86,19 +87,17 @@ bool WMORoot::open() { ASSERT(!DoodadData.FileDataIds); - char* ptr = f.getPointer(); - char* end = ptr + size; DoodadData.Paths = std::make_unique<char[]>(size); - memcpy(DoodadData.Paths.get(), ptr, size); + f.read(DoodadData.Paths.get(), size); + char* ptr = DoodadData.Paths.get(); + char* end = ptr + size; while (ptr < end) { - std::string path = ptr; - - char* s = GetPlainName(ptr); - NormalizeFileName(s, strlen(s)); + std::size_t length = std::ranges::distance(ptr, CStringSentinel.Checked(end)); + std::string path(ptr, length); - uint32 doodadNameIndex = ptr - f.getPointer(); - ptr += path.length() + 1; + uint32 doodadNameIndex = ptr - DoodadData.Paths.get(); + ptr += length + 1; if (ExtractSingleModel(path)) ValidDoodadNames.insert(doodadNameIndex); |
