diff --git a/Common/File/VFS/DirectoryReader.cpp b/Common/File/VFS/DirectoryReader.cpp index 60e2940390..b820a45196 100644 --- a/Common/File/VFS/DirectoryReader.cpp +++ b/Common/File/VFS/DirectoryReader.cpp @@ -8,12 +8,12 @@ DirectoryReader::DirectoryReader(const Path &path) { path_ = path; } -uint8_t *DirectoryReader::ReadFile(const char *path, size_t *size) { +uint8_t *DirectoryReader::ReadFile(std::string_view path, size_t *size) { Path new_path = Path(path).StartsWith(path_) ? Path(path) : path_ / path; return File::ReadLocalFile(new_path, size); } -bool DirectoryReader::GetFileListing(const char *path, std::vector *listing, const char *filter = nullptr) { +bool DirectoryReader::GetFileListing(std::string_view path, std::vector *listing, const char *filter = nullptr) { Path new_path = Path(path).StartsWith(path_) ? Path(path) : path_ / path; File::FileInfo info; @@ -27,12 +27,12 @@ bool DirectoryReader::GetFileListing(const char *path, std::vector *listing, const char *filter) override; - bool GetFileInfo(const char *path, File::FileInfo *info) override; - bool Exists(const char *path) override; + bool GetFileListing(std::string_view path, std::vector *listing, const char *filter) override; + bool GetFileInfo(std::string_view path, File::FileInfo *info) override; + bool Exists(std::string_view path) override; std::string toString() const override { return path_.ToString(); } diff --git a/Common/File/VFS/VFS.cpp b/Common/File/VFS/VFS.cpp index 616b9c26c3..c35079286a 100644 --- a/Common/File/VFS/VFS.cpp +++ b/Common/File/VFS/VFS.cpp @@ -1,5 +1,6 @@ #include +#include "Common/Common.h" #include "Common/Log.h" #include "Common/File/VFS/VFS.h" #include "Common/File/FileUtil.h" @@ -8,12 +9,12 @@ VFS g_VFS; -void VFS::Register(const char *prefix, VFSBackend *reader) { +void VFS::Register(std::string_view prefix, VFSBackend *reader) { if (reader) { entries_.push_back(VFSEntry{ prefix, reader }); - DEBUG_LOG(Log::IO, "Registered VFS for prefix %s: %s", prefix, reader->toString().c_str()); + DEBUG_LOG(Log::IO, "Registered VFS for prefix %.*s: %s", STR_VIEW(prefix), reader->toString().c_str()); } else { - ERROR_LOG(Log::IO, "Trying to register null VFS backend for prefix %s", prefix); + ERROR_LOG(Log::IO, "Trying to register null VFS backend for prefix %.*s", STR_VIEW(prefix)); } } @@ -37,22 +38,22 @@ static bool IsLocalAbsolutePath(std::string_view path) { } // The returned data should be free'd with delete[]. -uint8_t *VFS::ReadFile(const char *filename, size_t *size) { +uint8_t *VFS::ReadFile(std::string_view filename, size_t *size) { if (IsLocalAbsolutePath(filename)) { // Local path, not VFS. // INFO_LOG(Log::IO, "Not a VFS path: %s . Reading local file.", filename); return File::ReadLocalFile(Path(filename), size); } - int fn_len = (int)strlen(filename); + const int fn_len = (int)filename.length(); bool fileSystemFound = false; for (const auto &entry : entries_) { - int prefix_len = (int)strlen(entry.prefix); + int prefix_len = (int)entry.prefix.length(); if (prefix_len >= fn_len) continue; - if (0 == memcmp(filename, entry.prefix, prefix_len)) { + if (0 == memcmp(filename.data(), entry.prefix.data(), prefix_len)) { fileSystemFound = true; // INFO_LOG(Log::IO, "Prefix match: %s (%s) -> %s", entries[i].prefix, filename, filename + prefix_len); - uint8_t *data = entry.reader->ReadFile(filename + prefix_len, size); + uint8_t *data = entry.reader->ReadFile(filename.substr(prefix_len), size); if (data) return data; else @@ -66,7 +67,7 @@ uint8_t *VFS::ReadFile(const char *filename, size_t *size) { return nullptr; } -bool VFS::GetFileListing(const char *path, std::vector *listing, const char *filter) { +bool VFS::GetFileListing(std::string_view path, std::vector *listing, const char *filter) { if (IsLocalAbsolutePath(path)) { // Local path, not VFS. // INFO_LOG(Log::IO, "Not a VFS path: %s . Reading local directory.", path); @@ -74,14 +75,14 @@ bool VFS::GetFileListing(const char *path, std::vector *listing, return true; } - int fn_len = (int)strlen(path); + int fn_len = (int)path.length(); bool fileSystemFound = false; for (const auto &entry : entries_) { - int prefix_len = (int)strlen(entry.prefix); + int prefix_len = (int)entry.prefix.length(); if (prefix_len >= fn_len) continue; - if (0 == memcmp(path, entry.prefix, prefix_len)) { + if (0 == memcmp(path.data(), entry.prefix.data(), prefix_len)) { fileSystemFound = true; - if (entry.reader->GetFileListing(path + prefix_len, listing, filter)) { + if (entry.reader->GetFileListing(path.substr(prefix_len), listing, filter)) { return true; } } @@ -93,7 +94,7 @@ bool VFS::GetFileListing(const char *path, std::vector *listing, return false; } -bool VFS::GetFileInfo(const char *path, File::FileInfo *info) { +bool VFS::GetFileInfo(std::string_view path, File::FileInfo *info) { if (IsLocalAbsolutePath(path)) { // Local path, not VFS. // INFO_LOG(Log::IO, "Not a VFS path: %s . Getting local file info.", path); @@ -101,13 +102,13 @@ bool VFS::GetFileInfo(const char *path, File::FileInfo *info) { } bool fileSystemFound = false; - int fn_len = (int)strlen(path); + int fn_len = (int)path.length(); for (const auto &entry : entries_) { - int prefix_len = (int)strlen(entry.prefix); + int prefix_len = (int)entry.prefix.length(); if (prefix_len >= fn_len) continue; - if (0 == memcmp(path, entry.prefix, prefix_len)) { + if (0 == memcmp(path.data(), entry.prefix.data(), prefix_len)) { fileSystemFound = true; - if (entry.reader->GetFileInfo(path + prefix_len, info)) + if (entry.reader->GetFileInfo(path.substr(prefix_len), info)) return true; else continue; @@ -119,7 +120,7 @@ bool VFS::GetFileInfo(const char *path, File::FileInfo *info) { return false; } -bool VFS::Exists(const char *path) { +bool VFS::Exists(std::string_view path) { if (IsLocalAbsolutePath(path)) { // Local path, not VFS. // INFO_LOG(Log::IO, "Not a VFS path: %s . Getting local file info.", path); @@ -127,13 +128,13 @@ bool VFS::Exists(const char *path) { } bool fileSystemFound = false; - int fn_len = (int)strlen(path); + int fn_len = (int)path.length(); for (const auto &entry : entries_) { - int prefix_len = (int)strlen(entry.prefix); + int prefix_len = (int)entry.prefix.length(); if (prefix_len >= fn_len) continue; - if (0 == memcmp(path, entry.prefix, prefix_len)) { + if (0 == memcmp(path.data(), entry.prefix.data(), prefix_len)) { fileSystemFound = true; - if (entry.reader->Exists(path + prefix_len)) + if (entry.reader->Exists(path.substr(prefix_len))) return true; else continue; diff --git a/Common/File/VFS/VFS.h b/Common/File/VFS/VFS.h index 24a738d3e6..c339328356 100644 --- a/Common/File/VFS/VFS.h +++ b/Common/File/VFS/VFS.h @@ -2,6 +2,7 @@ #include #include +#include #include "Common/File/DirListing.h" @@ -36,14 +37,14 @@ public: class VFSInterface { public: virtual ~VFSInterface() {} - virtual uint8_t *ReadFile(const char *path, size_t *size) = 0; + virtual uint8_t *ReadFile(std::string_view path, size_t *size) = 0; // If listing already contains files, it'll be cleared. - virtual bool GetFileListing(const char *path, std::vector *listing, const char *filter = nullptr) = 0; + virtual bool GetFileListing(std::string_view path, std::vector *listing, const char *filter = nullptr) = 0; }; class VFSBackend : public VFSInterface { public: - virtual VFSFileReference *GetFile(const char *path) = 0; + virtual VFSFileReference *GetFile(std::string_view path) = 0; virtual bool GetFileInfo(VFSFileReference *vfsReference, File::FileInfo *fileInfo) = 0; virtual void ReleaseFile(VFSFileReference *vfsReference) = 0; @@ -55,8 +56,8 @@ public: virtual void CloseFile(VFSOpenFile *vfsOpenFile) = 0; // Filter support is optional but nice to have - virtual bool GetFileInfo(const char *path, File::FileInfo *info) = 0; - virtual bool Exists(const char *path) { + virtual bool GetFileInfo(std::string_view path, File::FileInfo *info) = 0; + virtual bool Exists(std::string_view path) { File::FileInfo info{}; return GetFileInfo(path, &info) && info.exists; } @@ -67,21 +68,21 @@ public: class VFS : public VFSInterface { public: ~VFS() { Clear(); } - void Register(const char *prefix, VFSBackend *reader); + void Register(std::string_view prefix, VFSBackend *reader); void Clear(); // Use delete [] to release the returned memory. // Always allocates an extra zero byte at the end, so that it // can be used for text like shader sources. - uint8_t *ReadFile(const char *filename, size_t *size) override; - bool GetFileListing(const char *path, std::vector *listing, const char *filter = nullptr) override; + uint8_t *ReadFile(std::string_view filename, size_t *size) override; + bool GetFileListing(std::string_view path, std::vector *listing, const char *filter = nullptr) override; - bool GetFileInfo(const char *filename, File::FileInfo *fileInfo); - bool Exists(const char *path); + bool GetFileInfo(std::string_view filename, File::FileInfo *fileInfo); + bool Exists(std::string_view path); private: struct VFSEntry { - const char *prefix; + std::string_view prefix; VFSBackend *reader; }; std::vector entries_; diff --git a/Common/File/VFS/ZipFileReader.cpp b/Common/File/VFS/ZipFileReader.cpp index d6b2751b6a..6f4968a388 100644 --- a/Common/File/VFS/ZipFileReader.cpp +++ b/Common/File/VFS/ZipFileReader.cpp @@ -160,8 +160,8 @@ ZipFileReader::~ZipFileReader() { zip_file_.close(); } -uint8_t *ZipFileReader::ReadFile(const char *path, size_t *size) { - std::string temp_path = inZipPath_ + path; +uint8_t *ZipFileReader::ReadFile(std::string_view path, size_t *size) { + std::string temp_path = join(inZipPath_, path); std::lock_guard guard(lock_); // Figure out the file size first. TODO: Can this part be done without locking the mutex? @@ -185,8 +185,8 @@ uint8_t *ZipFileReader::ReadFile(const char *path, size_t *size) { return contents; } -bool ZipFileReader::GetFileListing(const char *orig_path, std::vector *listing, const char *filter = 0) { - std::string path = std::string(inZipPath_) + orig_path; +bool ZipFileReader::GetFileListing(std::string_view orig_path, std::vector *listing, const char *filter = 0) { + std::string path = join(inZipPath_, orig_path); if (!path.empty() && path.back() != '/') { path.push_back('/'); } @@ -293,9 +293,9 @@ bool ZipFileReader::GetZipListings(const std::string &path, std::setisDirectory = false; @@ -340,8 +340,9 @@ public: zip_file_t *zf = nullptr; }; -VFSFileReference *ZipFileReader::GetFile(const char *path) { - int zi = zip_name_locate(zip_file_, path, ZIP_FL_NOCASE); // this is EXPENSIVE +VFSFileReference *ZipFileReader::GetFile(std::string_view path) { + std::string p(path); + int zi = zip_name_locate(zip_file_, p.c_str(), ZIP_FL_NOCASE); // this is EXPENSIVE if (zi < 0) { // Not found. return nullptr; diff --git a/Common/File/VFS/ZipFileReader.h b/Common/File/VFS/ZipFileReader.h index b2d7d3121c..4c4e5b48fc 100644 --- a/Common/File/VFS/ZipFileReader.h +++ b/Common/File/VFS/ZipFileReader.h @@ -45,9 +45,9 @@ public: bool IsValid() const { return zip_file_ != nullptr; } // use delete[] on the returned value. - uint8_t *ReadFile(const char *path, size_t *size) override; + uint8_t *ReadFile(std::string_view path, size_t *size) override; - VFSFileReference *GetFile(const char *path) override; + VFSFileReference *GetFile(std::string_view path) override; bool GetFileInfo(VFSFileReference *vfsReference, File::FileInfo *fileInfo) override; void ReleaseFile(VFSFileReference *vfsReference) override; @@ -56,8 +56,8 @@ public: size_t Read(VFSOpenFile *vfsOpenFile, void *buffer, size_t length) override; void CloseFile(VFSOpenFile *vfsOpenFile) override; - bool GetFileListing(const char *path, std::vector *listing, const char *filter) override; - bool GetFileInfo(const char *path, File::FileInfo *info) override; + bool GetFileListing(std::string_view path, std::vector *listing, const char *filter) override; + bool GetFileInfo(std::string_view path, File::FileInfo *info) override; std::string toString() const override { std::string retval = zipPath_.ToVisualString(); if (!inZipPath_.empty()) {