summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Parlane <parlane@gmail.com>2017-01-27 18:23:14 +1300
committerGitHub <noreply@github.com>2017-01-27 18:23:14 +1300
commit017e8050b64ca86ce6ca91092b07bc078bb0ba75 (patch)
treef444d7b7152c14abeb818ad53b5fa7bdbba91a3c
parent3d5821a9a7587428b9dd7c9921f46101bfef8f31 (diff)
parent104faa9fb3f9416e7e18d66bab10122a1e0ad0ad (diff)
Merge pull request #4746 from JosJuice/volumedirectory-sort-case-insensitive
VolumeDirectory: Use case-insensitive comparison when sorting
-rw-r--r--Source/Core/DiscIO/VolumeDirectory.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/Source/Core/DiscIO/VolumeDirectory.cpp b/Source/Core/DiscIO/VolumeDirectory.cpp
index 40dda01d0d..9f93aa0331 100644
--- a/Source/Core/DiscIO/VolumeDirectory.cpp
+++ b/Source/Core/DiscIO/VolumeDirectory.cpp
@@ -5,6 +5,7 @@
#include <algorithm>
#include <cstddef>
#include <cstring>
+#include <locale>
#include <map>
#include <memory>
#include <string>
@@ -25,6 +26,7 @@
namespace DiscIO
{
static u32 ComputeNameSize(const File::FSTEntry& parent_entry);
+static std::string ASCIIToLowercase(std::string str);
const size_t CVolumeDirectory::MAX_NAME_LENGTH;
const size_t CVolumeDirectory::MAX_ID_LENGTH;
@@ -452,10 +454,16 @@ void CVolumeDirectory::WriteDirectory(const File::FSTEntry& parent_entry, u32* f
{
std::vector<File::FSTEntry> sorted_entries = parent_entry.children;
- std::sort(sorted_entries.begin(), sorted_entries.end(),
- [](const File::FSTEntry& one, const File::FSTEntry& two) {
- return one.virtualName < two.virtualName;
- });
+ // Sort for determinism
+ std::sort(sorted_entries.begin(), sorted_entries.end(), [](const File::FSTEntry& one,
+ const File::FSTEntry& two) {
+ // For some reason, sorting by lowest ASCII value first prevents many games from
+ // fully booting. We make the comparison case insensitive to solve the problem.
+ // (Highest ASCII value first seems to work regardless of case sensitivity.)
+ const std::string one_lower = ASCIIToLowercase(one.virtualName);
+ const std::string two_lower = ASCIIToLowercase(two.virtualName);
+ return one_lower == two_lower ? one.virtualName < two.virtualName : one_lower < two_lower;
+ });
for (const File::FSTEntry& entry : sorted_entries)
{
@@ -497,4 +505,11 @@ static u32 ComputeNameSize(const File::FSTEntry& parent_entry)
return name_size;
}
+static std::string ASCIIToLowercase(std::string str)
+{
+ std::transform(str.begin(), str.end(), str.begin(),
+ [](char c) { return std::tolower(c, std::locale::classic()); });
+ return str;
+}
+
} // namespace