Skip to content

Commit

Permalink
Merge pull request #4746 from JosJuice/volumedirectory-sort-case-inse…
Browse files Browse the repository at this point in the history
…nsitive

VolumeDirectory: Use case-insensitive comparison when sorting
  • Loading branch information
Parlane committed Jan 27, 2017
2 parents 3d5821a + 104faa9 commit 017e805
Showing 1 changed file with 19 additions and 4 deletions.
23 changes: 19 additions & 4 deletions Source/Core/DiscIO/VolumeDirectory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <algorithm>
#include <cstddef>
#include <cstring>
#include <locale>
#include <map>
#include <memory>
#include <string>
Expand All @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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

0 comments on commit 017e805

Please sign in to comment.