diff --git a/src/Cafe/Filesystem/FSPath.cpp b/src/Cafe/Filesystem/FSPath.cpp new file mode 100644 index 00000000..c762f866 --- /dev/null +++ b/src/Cafe/Filesystem/FSPath.cpp @@ -0,0 +1,62 @@ +#include "FSPath.h" + +#ifndef BOOST_OS_UNIX +FSPath& FSPath::operator/= (const FSPath & other) +{ + *this /= other; + return *this; +} +#else +FSPath& FSPath::operator/= (const FSPath & other) +{ + // todo: implement caching. + + // explore directories recursively and find the matching cases. + fs::path relPath = other.relative_path(); + fs::path correctedPath = empty() ? other.root_path() : *this; + + // helper function to convert a path's alphabet characters to lowercase. + auto static lowercase_path = [](fs::path const & path) + { + std::wstring string = path.wstring(); + for (auto& i : string) + { + i = std::isalpha(i) ? std::tolower(i) : i; + } + return string; + }; + + bool found; + for (auto const &it : relPath) + { + found = false; + std::error_code listErr; + for (auto const& dirEntry : fs::directory_iterator{correctedPath, listErr}) + { + fs::path entryName = dirEntry.path().filename(); + if (lowercase_path(entryName) == lowercase_path(it)) + { + correctedPath /= entryName; + found = true; + break; + } + } + + // if we can't iterate directory, just copy the original case. + if(listErr) + { + correctedPath /= it; + found = true; + } + + if (!found) + break; + } + + if (found) + *this = correctedPath; + + return *this; +} + +#endif diff --git a/src/Cafe/Filesystem/FSPath.h b/src/Cafe/Filesystem/FSPath.h new file mode 100644 index 00000000..6bd8a72a --- /dev/null +++ b/src/Cafe/Filesystem/FSPath.h @@ -0,0 +1,18 @@ +#pragma once +#include "Common/precompiled.h" + +class FSPath : public fs::path { + public: + FSPath() = default; + + template + FSPath(const T & other) : fs::path(other) {}; + + template + static FSPath Convert(const T& input) { + FSPath p; + p /= input; + return p; + } + FSPath& operator/= (const FSPath & other); +}; \ No newline at end of file diff --git a/src/Cafe/Filesystem/fscDeviceHostFS.cpp b/src/Cafe/Filesystem/fscDeviceHostFS.cpp index c24acbc9..68899e84 100644 --- a/src/Cafe/Filesystem/fscDeviceHostFS.cpp +++ b/src/Cafe/Filesystem/fscDeviceHostFS.cpp @@ -224,7 +224,6 @@ class fscDeviceHostFSC : public fscDeviceC { FSCVirtualFile* fscDeviceOpenByPathIgnoreCase(std::wstring_view pathString, FSC_ACCESS_FLAG accessFlags, sint32* fscStatus) { - // todo: implement caching. *fscStatus = FSC_STATUS_OK; FSPath correctedPath = FSPath::Convert(pathString);