[PATCH 2/5] kernelbase/locale: Implement sortkey punctuation
Fabian Maurer
dark.shadow4 at web.de
Tue Apr 28 13:17:45 CDT 2020
Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
dlls/kernel32/tests/locale.c | 17 ++++++++++++++++
dlls/kernelbase/locale.c | 39 ++++++++++++++++++++++++++++++++++--
2 files changed, 54 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 13839bb10a..e3b1710581 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -3176,6 +3176,23 @@ static const struct sorting_test_entry unicode_sorting_tests[] =
/* 46 */ { L"en-US", 0, L"\x3099", L"\x309a", CSTR_EQUAL }, /* MIN_WEIGHT */
/* 47 */ { L"en-US", 0, L"\x309b", L"\x05a2", CSTR_EQUAL }, /* MIN_WEIGHT */
/* 48 */ { L"en-US", 0, L"\xff9e", L"\x0e47", CSTR_EQUAL }, /* MIN_WEIGHT */
+ /* 49 */ { L"en-US", 0, L"\x001b", L"\x001c", CSTR_LESS_THAN }, /* Punctuation primary weight */
+ /* 50 */ { L"en-US", 0, L"\x0005", L"\x0006", CSTR_LESS_THAN }, /* Punctuation primary weight */
+ /* 51 */ { L"en-US", 0, L"\x0027", L"\xff07", CSTR_LESS_THAN, 0, TRUE }, /* Punctuation diacritic/case weight */
+ /* 52 */ { L"en-US", 0, L"\x07f4", L"\x07f5", CSTR_LESS_THAN, 0, TRUE }, /* Punctuation diacritic/case weight */
+ /* 53 */ { L"en-US", 0, L"\x207b", L"\x0008", CSTR_GREATER_THAN }, /* Punctuation diacritic/case weight */
+ /* 54 */ { L"en-US", NORM_IGNORESYMBOLS, L"\x207b", L"\x0008", CSTR_EQUAL }, /* Punctuation NORM_IGNORESYMBOLS */
+ /* 55 */ { L"en-US", NORM_IGNORESYMBOLS, L"\x0004", L"\x0011", CSTR_EQUAL }, /* Punctuation NORM_IGNORESYMBOLS */
+ /* 56 */ { L"en-US", NORM_IGNORESYMBOLS | SORT_STRINGSORT, L"\x207b", L"\x0008", CSTR_EQUAL }, /* Punctuation NORM_IGNORESYMBOLS SORT_STRINGSORT */
+ /* 57 */ { L"en-US", NORM_IGNORESYMBOLS | SORT_STRINGSORT, L"\x0004", L"\x0011", CSTR_EQUAL }, /* Punctuation NORM_IGNORESYMBOLS SORT_STRINGSORT */
+ /* 58 */ { L"en-US", SORT_STRINGSORT, L"\x001a", L"\x001b", CSTR_LESS_THAN }, /* Punctuation SORT_STRINGSORT main weight */
+ /* 59 */ { L"en-US", SORT_STRINGSORT, L"\x2027", L"\x2011", CSTR_GREATER_THAN }, /* Punctuation SORT_STRINGSORT main weight */
+ /* 60 */ { L"en-US", SORT_STRINGSORT, L"\x3030", L"\x301c", CSTR_GREATER_THAN }, /* Punctuation SORT_STRINGSORT main weight */
+ /* 61 */ { L"en-US", SORT_STRINGSORT, L"\x058a", L"\x2010", CSTR_GREATER_THAN }, /* Punctuation SORT_STRINGSORT diacritic weight */
+ /* 62 */ { L"en-US", SORT_STRINGSORT, L"\x07F5", L"\x07F4", CSTR_GREATER_THAN }, /* Punctuation SORT_STRINGSORT diacritic weight */
+ /* 63 */ { L"en-US", SORT_STRINGSORT, L"\xfe32", L"\x2013", CSTR_GREATER_THAN }, /* Punctuation SORT_STRINGSORT case weight */
+ /* 64 */ { L"en-US", SORT_STRINGSORT, L"\xfe31", L"\xfe58", CSTR_GREATER_THAN }, /* Punctuation SORT_STRINGSORT case weight */
+ /* 65 */ { L"en-US", SORT_STRINGSORT, L"\xff07", L"\x0027", CSTR_GREATER_THAN }, /* Punctuation SORT_STRINGSORT case weight */
};
static void test_unicode_sorting(void)
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
index 74177371d9..f72061adb7 100644
--- a/dlls/kernelbase/locale.c
+++ b/dlls/kernelbase/locale.c
@@ -2478,6 +2478,12 @@ typedef struct _weight_main_info
BYTE extra;
} weight_main_info;
+typedef struct _weight_special_info
+{
+ BYTE script_member;
+ BYTE weight_primary;
+} weight_special_info;
+
typedef struct _list
{
int extra_len;
@@ -2495,6 +2501,7 @@ typedef struct _sortkey_data
list weights_main;
list weights_diacritic;
list weights_case;
+ list weights_special;
} sortkey_data;
/* List functions */
@@ -2582,6 +2589,7 @@ static void sortkey_data_init(sortkey_data* data, int flags, const WCHAR* locale
LIST_INIT(&data->weights_main, sizeof(BYTE));
LIST_INIT(&data->weights_diacritic, sizeof(BYTE));
LIST_INIT(&data->weights_case, sizeof(BYTE));
+ LIST_INIT(&data->weights_special, sizeof(BYTE));
}
static void sortkey_data_destroy(sortkey_data* data)
@@ -2590,6 +2598,7 @@ static void sortkey_data_destroy(sortkey_data* data)
LIST_DESTROY(&data->weights_main);
LIST_DESTROY(&data->weights_diacritic);
LIST_DESTROY(&data->weights_case);
+ LIST_DESTROY(&data->weights_special);
}
static weight_main_info create_weight_main(BYTE script_member, BYTE weight_primary)
@@ -2621,6 +2630,12 @@ static void main_weights_add(sortkey_data *data, weight_main_info* value)
LIST_ADD(&data->weights_main, &value->extra);
}
+static void special_weights_add(sortkey_data* data, weight_special_info* value)
+{
+ LIST_ADD(&data->weights_special, &value->script_member);
+ LIST_ADD(&data->weights_special, &value->weight_primary);
+}
+
static void diacritic_weights_add(sortkey_data* data, const character_info* info, BYTE value)
{
LIST_ADD(&data->weights_diacritic, &value);
@@ -2701,7 +2716,26 @@ static BOOL sortkey_handle_character(sortkey_data* data, WCHAR c, const WCHAR* s
break;
case 6: /* Punctuation */
- /* TODO */
+ if (flags & NORM_IGNORESYMBOLS)
+ break;
+
+ if (flags & SORT_STRINGSORT)
+ {
+ weightmain = create_weight_main(info.script_member, info.weight_primary);
+ main_weights_add(data, &weightmain);
+
+ diacritic_weights_add(data, &info, info.weight_diacritic);
+
+ case_weights_add(data, info.weight_case);
+ }
+ else
+ {
+ weight_special_info special;
+
+ special.script_member = info.weight_primary;
+ special.weight_primary = (BYTE)(info.weight_diacritic * 8 + info.weight_case); /* Logic found through testing, seems to work reliably */
+ special_weights_add(data, &special);
+ }
break;
case 7: /* Symbols */
@@ -2764,7 +2798,8 @@ static void sortkey_write_result(sortkey_data* data)
LIST_ADD(&data->key, &SORTKEY_SEPARATOR);
/* Special weights */
- /* TODO */
+
+ APPEND_LIST_TO_SORTKEY(data, weights_special, BYTE, element, FALSE);
LIST_ADD(&data->key, &SORTKEY_TERMINATOR);
}
--
2.26.2
More information about the wine-devel
mailing list