From 077a693de6665ead749e3d8434ff7cdb492b1551 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sun, 5 Sep 2021 13:39:06 -0400 Subject: [PATCH] LibUnicode: Sort special casing array by locale specificity This is to simply the Default Case Conversion implementation. Otherwise, the implementation would need to determine which special casing rule to apply, instead of just picking the first match. --- .../LibUnicode/GenerateUnicodeData.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeData.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeData.cpp index be4e054e15..93647ea176 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeData.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeData.cpp @@ -181,7 +181,6 @@ static void parse_special_casing(Core::File& file, UnicodeData& unicode_data) VERIFY(segments.size() == 5 || segments.size() == 6); SpecialCasing casing {}; - casing.index = static_cast(unicode_data.special_casing.size()); casing.code_point = AK::StringUtils::convert_to_uint_from_hex(segments[0]).value(); casing.lowercase_mapping = parse_code_point_list(segments[1]); casing.titlecase_mapping = parse_code_point_list(segments[2]); @@ -214,6 +213,19 @@ static void parse_special_casing(Core::File& file, UnicodeData& unicode_data) unicode_data.special_casing.append(move(casing)); } + + quick_sort(unicode_data.special_casing, [](auto const& lhs, auto const& rhs) { + if (lhs.code_point != rhs.code_point) + return lhs.code_point < rhs.code_point; + if (lhs.locale.is_empty() && !rhs.locale.is_empty()) + return false; + if (!lhs.locale.is_empty() && rhs.locale.is_empty()) + return true; + return lhs.locale < rhs.locale; + }); + + for (u32 i = 0; i < unicode_data.special_casing.size(); ++i) + unicode_data.special_casing[i].index = i; } static void parse_prop_list(Core::File& file, PropList& prop_list, bool multi_value_property = false)