Signed-off-by: Fabian Maurer dark.shadow4@web.de --- dlls/kernel32/tests/locale.c | 20 ++++++++++++++++++++ dlls/kernelbase/locale.c | 26 ++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c index 8c976e70fc..e5102bbbf3 100644 --- a/dlls/kernel32/tests/locale.c +++ b/dlls/kernel32/tests/locale.c @@ -3222,6 +3222,26 @@ static const struct sorting_test_entry unicode_sorting_tests[] = /* 92 */ { L"en-US", 0, L"\x00c6", L"\x0041\x0045", CSTR_EQUAL }, /* Expansion */ /* 93 */ { L"en-US", 0, L"\x0f5c", L"\x0f5b\x0fb7", CSTR_EQUAL }, /* Expansion */ /* 94 */ { L"en-US", 0, L"\x05f0", L"\x05d5\x05d5", CSTR_EQUAL }, /* Expansion */ + /* 95 */ { L"ja-JP", 0, L"\x6df8", L"\x654b\x29e9", CSTR_LESS_THAN }, /* japanese locale */ + /* 96 */ { L"ja-JP", 0, L"\x685d\x1239\x1b61", L"\x59b6\x6542\x2a62\x04a7", CSTR_LESS_THAN }, /* japanese locale */ + /* 97 */ { L"ja-JP", 0, L"\x62f3\x43e9", L"\x5760", CSTR_LESS_THAN }, /* japanese locale */ + /* 98 */ { L"ja-JP", 0, L"\x634c", L"\x2f0d\x5f1c\x7124", CSTR_LESS_THAN }, /* japanese locale */ + /* 99 */ { L"ja-JP", 0, L"\x69e7\x0502", L"\x57cc" , CSTR_LESS_THAN }, /* japanese locale */ + /* 100 */ { L"ja-JP", 0, L"\x7589", L"\x67c5" , CSTR_LESS_THAN }, /* japanese locale */ + /* 101 */ { L"ja-JP", 0, L"\x5ede\x765c", L"\x7324" , CSTR_GREATER_THAN }, /* japanese locale */ + /* 102 */ { L"ja-JP", 0, L"\x5c7f\x5961", L"\x7cbe" , CSTR_GREATER_THAN }, /* japanese locale */ + /* 103 */ { L"ja-JP", 0, L"\x3162", L"\x6a84\x1549\x0b60" , CSTR_GREATER_THAN }, /* japanese locale */ + /* 104 */ { L"ja-JP", 0, L"\x769e\x448e", L"\x4e6e" , CSTR_LESS_THAN }, /* japanese locale */ + /* 105 */ { L"ja-JP", 0, L"\x59a4", L"\x5faa\x607c", CSTR_GREATER_THAN }, /* japanese locale */ + /* 106 */ { L"ja-JP", 0, L"\x529b", L"\x733f", CSTR_GREATER_THAN }, /* japanese locale */ + /* 107 */ { L"ja-JP", 0, L"\x6ff8\x2a0a", L"\x7953\x6712" , CSTR_GREATER_THAN }, /* japanese locale */ + /* 108 */ { L"ja-JP", 0, L"\x6dfb", L"\x6793", CSTR_LESS_THAN }, /* japanese locale */ + /* 109 */ { L"ja-JP", 0, L"\x67ed", L"\x6aa2", CSTR_GREATER_THAN }, /* japanese locale */ + /* 110 */ { L"ja-JP", 0, L"\x4e61", L"\x6350\x6b08", CSTR_GREATER_THAN }, /* japanese locale */ + /* 111 */ { L"ja-JP", 0, L"\x5118", L"\x53b3\x75b4", CSTR_GREATER_THAN }, /* japanese locale */ + /* 112 */ { L"ja-JP", 0, L"\x6bbf", L"\x65a3" , CSTR_LESS_THAN }, /* japanese locale */ + /* 113 */ { L"ja-JP", 0, L"\x5690", L"\x5fa8", CSTR_GREATER_THAN }, /* japanese locale */ + /* 114 */ { L"ja-JP", 0, L"\x61e2", L"\x76e5" , CSTR_GREATER_THAN }, /* japanese locale */ };
static void test_unicode_sorting(void) diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c index a12b8bdb30..48284741b0 100644 --- a/dlls/kernelbase/locale.c +++ b/dlls/kernelbase/locale.c @@ -2517,6 +2517,7 @@ typedef struct _sortkey_data list weights_case; list weights_special; list weights_extra; + const struct sortguid* locale; } sortkey_data;
/* List functions */ @@ -2586,9 +2587,28 @@ static void LIST_ADD(list* name, const void *value)
/* Helper functions */
+static DWORD get_exception(sortkey_data* data, WCHAR ch) +{ + if (data->locale && data->locale->except) + { + DWORD* table = sort.keys + data->locale->except; + DWORD hi = ch >> 8; + DWORD lo = ch & 0xff; + if (table[hi] == hi * 0x100) + return 0; + if (sort.keys[table[hi] + lo] == sort.keys[hi * 0x100 + lo]) + return 0; + return sort.keys[table[hi] + lo]; + } + return 0; +} + static BOOL get_char(sortkey_data* data, character_info* info, WCHAR ch) { - DWORD value = sort.keys[ch]; + DWORD value = get_exception(data, ch); + if (!value) + value = sort.keys[ch]; + if ((WORD)value == 0x200) /* Expansion */ return FALSE;
@@ -2596,6 +2616,7 @@ static BOOL get_char(sortkey_data* data, character_info* info, WCHAR ch) info->weight_diacritic = (value >> 16) & 0xff; info->script_member = (value >> 8) & 0xff; info->weight_primary = value & 0xff; + return info->script_member != 0; }
@@ -2630,6 +2651,7 @@ static void sortkey_data_init(sortkey_data* data, int flags, const WCHAR* locale LIST_INIT(&data->weights_case, sizeof(BYTE)); LIST_INIT(&data->weights_special, sizeof(BYTE)); LIST_INIT(&data->weights_extra, sizeof(weight_extra_info)); + data->locale = get_language_sort(locale); }
static void sortkey_data_destroy(sortkey_data* data) @@ -5330,7 +5352,7 @@ INT WINAPI DECLSPEC_HOTPATCH LCMapStringEx( const WCHAR *locale, DWORD flags, co TRACE( "(%s,0x%08x,%s,%d,%p,%d)\n", debugstr_w(locale), flags, debugstr_wn(src, srclen), srclen, dst, dstlen );
- if (!(ret = sortkey_generate(flags, L"", src, srclen, (BYTE *)dst, dstlen ))) + if (!(ret = sortkey_generate(flags, locale, src, srclen, (BYTE *)dst, dstlen ))) SetLastError( ERROR_INSUFFICIENT_BUFFER ); return ret; } -- 2.26.2