aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tools/vmap4_extractor/adtfile.cpp108
-rw-r--r--src/tools/vmap4_extractor/adtfile.h7
-rw-r--r--src/tools/vmap4_extractor/gameobject_extract.cpp18
-rw-r--r--src/tools/vmap4_extractor/model.cpp12
-rw-r--r--src/tools/vmap4_extractor/vmapexport.cpp18
-rw-r--r--src/tools/vmap4_extractor/wdtfile.cpp20
-rw-r--r--src/tools/vmap4_extractor/wmo.cpp17
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);