X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fcollator.cc;h=8de1857abeb6c24c988f9e5b2536be94b67b2c6a;hp=e88a91143fb2cef3f931448551cf6581b64a6a59;hb=af25866f2b77d856121ce67ba11ba7e9f997bfe1;hpb=3f2142a90410755d090ace98ada1fee5a869da98 diff --git a/src/lib/collator.cc b/src/lib/collator.cc index e88a91143..8de1857ab 100644 --- a/src/lib/collator.cc +++ b/src/lib/collator.cc @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -35,12 +36,13 @@ using std::string; using std::vector; -Collator::Collator() +Collator::Collator(char const* locale) { UErrorCode status = U_ZERO_ERROR; - _collator = ucol_open(nullptr, &status); + _collator = ucol_open(locale, &status); if (_collator) { ucol_setAttribute(_collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); + /* Ignore case and character encoding (and probably some other things) */ ucol_setAttribute(_collator, UCOL_STRENGTH, UCOL_PRIMARY, &status); ucol_setAttribute(_collator, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status); } @@ -78,3 +80,23 @@ Collator::compare (string const& utf8_a, string const& utf8_b) const } } + +bool +Collator::find(string pattern, string text) const +{ + if (_collator) { + auto utf16_pattern = utf8_to_utf16(pattern); + auto utf16_text = utf8_to_utf16(text); + UErrorCode status = U_ZERO_ERROR; + auto search = usearch_openFromCollator(utf16_pattern.data(), -1, utf16_text.data(), -1, _collator, nullptr, &status); + DCPOMATIC_ASSERT(search); + auto const index = usearch_first(search, &status); + usearch_close(search); + return index != -1; + } else { + transform(pattern.begin(), pattern.end(), pattern.begin(), ::tolower); + transform(text.begin(), text.end(), text.begin(), ::tolower); + return pattern.find(text) != string::npos; + } +} +