summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/FileSystemGCWii.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2017-07-04 20:25:53 +0200
committerJosJuice <josjuice@gmail.com>2017-07-04 20:40:08 +0200
commit6a31d2598e1273dc40a0149821345107368f6502 (patch)
treea2f9fc23a1a379e363bb3e6687ac741cdfdbdfab /Source/Core/DiscIO/FileSystemGCWii.cpp
parent60ee0b2913d6da077ce84d3c729aa17d50d4555d (diff)
Support leading slashes in FileSystemGCWii::FindFileInfo
Diffstat (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp')
-rw-r--r--Source/Core/DiscIO/FileSystemGCWii.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp
index bbc89cfc15..6abcc016e0 100644
--- a/Source/Core/DiscIO/FileSystemGCWii.cpp
+++ b/Source/Core/DiscIO/FileSystemGCWii.cpp
@@ -270,21 +270,24 @@ std::unique_ptr<FileInfo> FileSystemGCWii::FindFileInfo(const std::string& path,
// Given a path like "directory1/directory2/fileA.bin", this function will
// find directory1 and then call itself to search for "directory2/fileA.bin".
- if (path.empty() || path == "/")
- return file_info.clone();
+ size_t name_start = 0;
+ while (name_start < path.size() && path[name_start] == '/')
+ ++name_start;
+
+ if (name_start == path.size())
+ return file_info.clone(); // We're done
// It's only possible to search in directories. Searching in a file is an error
if (!file_info.IsDirectory())
return nullptr;
- size_t first_dir_separator = path.find('/');
- const std::string searching_for = path.substr(0, first_dir_separator);
- const std::string rest_of_path =
- (first_dir_separator != std::string::npos) ? path.substr(first_dir_separator + 1) : "";
+ const size_t name_end = path.find('/', name_start);
+ const std::string name = path.substr(name_start, name_end - name_start);
+ const std::string rest_of_path = (name_end != std::string::npos) ? path.substr(name_end + 1) : "";
for (const FileInfo& child : file_info)
{
- if (!strcasecmp(child.GetName().c_str(), searching_for.c_str()))
+ if (!strcasecmp(child.GetName().c_str(), name.c_str()))
{
// A match is found. The rest of the path is passed on to finish the search.
std::unique_ptr<FileInfo> result = FindFileInfo(rest_of_path, child);