aboutsummaryrefslogtreecommitdiff
path: root/src/common/Utilities/Util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/Utilities/Util.cpp')
-rw-r--r--src/common/Utilities/Util.cpp185
1 files changed, 184 insertions, 1 deletions
diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp
index 743fb7e4543..1776815a247 100644
--- a/src/common/Utilities/Util.cpp
+++ b/src/common/Utilities/Util.cpp
@@ -372,7 +372,190 @@ bool WStrToUtf8(std::wstring const& wstr, std::string& utf8str)
return true;
}
-typedef wchar_t const* const* wstrlist;
+std::wstring wstrCaseAccentInsensitiveParse(std::wstring const& wstr, LocaleConstant locale)
+{
+ std::wstring result;
+ result.reserve(wstr.length() * 2);
+
+ switch (locale)
+ {
+ case LOCALE_frFR:
+ for (wchar_t wchar : wstr)
+ {
+ wchar = wcharToLower(wchar);
+ switch (wchar)
+ {
+ case 0x00A0: // NO-BREAK SPACE
+ result += L' ';
+ break;
+ case 0x00AB: // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ case 0x00BB: // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ result += L'"';
+ break;
+ case 0x00E7: // LATIN SMALL LETTER C WITH CEDILLA
+ result += L'c';
+ break;
+ case 0x00E8: // LATIN SMALL LETTER E WITH GRAVE
+ case 0x00E9: // LATIN SMALL LETTER E WITH ACUTE
+ case 0x00EA: // LATIN SMALL LETTER E WITH CIRCUMFLEX
+ case 0x00EB: // LATIN SMALL LETTER E WITH DIAERESIS
+ result += L'e';
+ break;
+ case 0x00EE: // LATIN SMALL LETTER I WITH CIRCUMFLEX
+ case 0x00EF: // LATIN SMALL LETTER I WITH DIAERESIS
+ result += L'i';
+ break;
+ case 0x00F2: // LATIN SMALL LETTER O WITH GRAVE
+ case 0x00F3: // LATIN SMALL LETTER O WITH ACUTE
+ case 0x00F4: // LATIN SMALL LETTER O WITH CIRCUMFLEX
+ case 0x00F6: // LATIN SMALL LETTER O WITH DIAERESIS
+ result += L'o';
+ break;
+ case 0x00F9: // LATIN SMALL LETTER U WITH GRAVE
+ case 0x00FA: // LATIN SMALL LETTER U WITH ACUTE
+ case 0x00FB: // LATIN SMALL LETTER U WITH CIRCUMFLEX
+ case 0x00FC: // LATIN SMALL LETTER U WITH DIAERESIS
+ result += L'u';
+ break;
+ case 0x0153: // LATIN SMALL LIGATURE OE
+ result += L'o';
+ result += L'e';
+ break;
+ case 0x2013: // EN DASH
+ result += L'-';
+ break;
+ case 0x2018: // LEFT SINGLE QUOTATION MARK
+ case 0x2019: // RIGHT SINGLE QUOTATION MARK
+ result += L'\'';
+ break;
+ default:
+ result += wchar;
+ break;
+ }
+ }
+ break;
+ case LOCALE_deDE:
+ for (wchar_t wchar : wstr)
+ {
+ wchar = wcharToLower(wchar);
+ if (wchar == 0x00DF) // LATIN SMALL LETTER SHARP S
+ {
+ result += L's';
+ result += L's';
+ }
+ else
+ result += wchar;
+ }
+ break;
+ case LOCALE_esES:
+ case LOCALE_esMX:
+ case LOCALE_itIT:
+ for (wchar_t wchar : wstr)
+ {
+ wchar = wcharToLower(wchar);
+ switch (wchar)
+ {
+ case 0x00E1: // LATIN SMALL LETTER A WITH ACUTE
+ result += L'a';
+ break;
+ case 0x00E9: // LATIN SMALL LETTER E WITH ACUTE
+ result += L'e';
+ break;
+ case 0x00ED: // LATIN SMALL LETTER I WITH ACUTE
+ result += L'i';
+ break;
+ case 0x00F1: // LATIN SMALL LETTER N WITH TILDE
+ result += L'n';
+ break;
+ case 0x00F3: // LATIN SMALL LETTER O WITH ACUTE
+ result += L'o';
+ break;
+ case 0x00FA: // LATIN SMALL LETTER U WITH ACUTE
+ case 0x00FC: // LATIN SMALL LETTER U WITH DIAERESIS
+ result += L'u';
+ break;
+ default:
+ result += wchar;
+ break;
+ }
+ }
+ break;
+ case LOCALE_ruRU:
+ for (wchar_t wchar : wstr)
+ {
+ wchar = wcharToLower(wchar);
+ switch (wchar)
+ {
+ case 0x451: // CYRILLIC SMALL LETTER IO
+ result += wchar_t(0x435);
+ break;
+ case 0x2013: // EN DASH
+ result += L'-';
+ break;
+ default:
+ result += wchar;
+ break;
+ }
+ }
+ break;
+ case LOCALE_ptBR:
+ for (wchar_t wchar : wstr)
+ {
+ wchar = wcharToLower(wchar);
+ switch (wchar)
+ {
+ case 0x00E0: // LATIN SMALL LETTER A WITH GRAVE
+ case 0x00E1: // LATIN SMALL LETTER A WITH ACUTE
+ case 0x00E2: // LATIN SMALL LETTER A WITH CIRCUMFLEX
+ case 0x00E3: // LATIN SMALL LETTER A WITH TILDE
+ case 0x00E4: // LATIN SMALL LETTER A WITH DIAERESIS
+ result += L'a';
+ break;
+ case 0x00E7: // LATIN SMALL LETTER C WITH CEDILLA
+ result += L'c';
+ break;
+ case 0x00E8: // LATIN SMALL LETTER E WITH GRAVE
+ case 0x00E9: // LATIN SMALL LETTER E WITH ACUTE
+ case 0x00EA: // LATIN SMALL LETTER E WITH CIRCUMFLEX
+ case 0x00EB: // LATIN SMALL LETTER E WITH DIAERESIS
+ result += L'e';
+ break;
+ case 0x00EC: // LATIN SMALL LETTER I WITH GRAVE
+ case 0x00ED: // LATIN SMALL LETTER I WITH ACUTE
+ case 0x00EE: // LATIN SMALL LETTER I WITH CIRCUMFLEX
+ case 0x00EF: // LATIN SMALL LETTER I WITH DIAERESIS
+ result += L'i';
+ break;
+ case 0x00F1: // LATIN SMALL LETTER N WITH TILDE
+ result += L'n';
+ break;
+ case 0x00F2: // LATIN SMALL LETTER O WITH GRAVE
+ case 0x00F3: // LATIN SMALL LETTER O WITH ACUTE
+ case 0x00F4: // LATIN SMALL LETTER O WITH CIRCUMFLEX
+ case 0x00F5: // LATIN SMALL LETTER O WITH TILDE
+ case 0x00F6: // LATIN SMALL LETTER O WITH DIAERESIS
+ result += L'o';
+ break;
+ case 0x00F9: // LATIN SMALL LETTER U WITH GRAVE
+ case 0x00FA: // LATIN SMALL LETTER U WITH ACUTE
+ case 0x00FB: // LATIN SMALL LETTER U WITH CIRCUMFLEX
+ case 0x00FC: // LATIN SMALL LETTER U WITH DIAERESIS
+ result += L'u';
+ break;
+ default:
+ result += wchar;
+ break;
+ }
+ }
+ break;
+ default:
+ result = wstr;
+ wstrToLower(result);
+ break;
+ }
+
+ return result;
+}
void wstrToUpper(std::wstring& str)
{