diff --git a/IDEHelper/Compiler/FtsFuzzyMatch.h b/IDEHelper/Compiler/FtsFuzzyMatch.h index 3b654da6..77a58b97 100644 --- a/IDEHelper/Compiler/FtsFuzzyMatch.h +++ b/IDEHelper/Compiler/FtsFuzzyMatch.h @@ -38,6 +38,7 @@ #include #include "BeefySysLib/util/UTF8.h" +#include "BeefySysLib/third_party/utf8proc/utf8proc.h" // Public interface namespace fts { @@ -81,6 +82,16 @@ namespace fts { return fuzzy_internal::fuzzy_match_recursive(pattern, str, outScore, str, nullptr, matches, maxMatches, 0, recursionCount, recursionLimit); } + bool IsLower(uint32 c) + { + return utf8proc_category(c) == UTF8PROC_CATEGORY_LL; + } + + bool IsUpper(uint32 c) + { + return utf8proc_category(c) == UTF8PROC_CATEGORY_LU; + } + // Private implementation static bool fuzzy_internal::fuzzy_match_recursive(const char* pattern, const char* str, int& outScore, const char* strBegin, uint8_t const* srcMatches, uint8_t* matches, int maxMatches, @@ -111,7 +122,7 @@ namespace fts { // TODO: tolower only works for A-Z // Found match - if (tolower(patternChar) == tolower(strChar)) { + if (utf8proc_tolower(patternChar) == utf8proc_tolower(strChar)) { // Supplied matches buffer was too short if (nextMatch >= maxMatches) @@ -201,7 +212,7 @@ namespace fts { uint32 neighbor = Beefy::u8_nextchar((char*)strBegin, &neighborOffset); // Camel case - if (::islower(neighbor) && ::isupper(curr)) + if (IsLower(neighbor) && IsUpper(curr)) outScore += camel_bonus; // Separator