boost::locale::to_lower uses locale-dependent lowercasing, which doesn't
match filesystem case insensitivity when running in the Turkish locale,
as then lowercase "I" is not "i", and uppercase "i" is not "I". To avoid
this issue on Windows, use CompareStringOrdinal to use the same rules
as the filesystem when comparing strings, and CharUpperBuffW to
uppercase strings before comparing hashes. It's less clear that
CharUpperBuffW uses the same rules as the filesystem, but that's what I
understand from reading around.
I haven't figured out how to get similar behaviour on Linux, though it
probably involves using ICU. For now, boost::locale::to_upper is used
before comparison. This is inaccurate, but at least avoids the problem
of some characters not round-tripping when lowercased.
Sorting doesn't work as for other games, because esplugin can't tell if
a plugin contains override records, so returns 0 for their count, so no
overlap edges get added.
Intermediate masters may be able to respect the later plugin's group
without causing a cycle, and intermediate non-masters would have their
own cycles detected independently.