From 71d86261c36ecc91bb169a587038e056e0929412 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 15 Feb 2022 14:31:07 -0500 Subject: [PATCH] LibUnicode: Use BCP 47 data to filter valid numbering system names There isn't too much of an effective difference here other than that the BCP 47 data contains some aliases we would otherwise not handle. --- .../GenerateUnicodeNumberFormat.cpp | 40 +++++++++++++------ Userland/Libraries/LibUnicode/Forward.h | 1 - .../Libraries/LibUnicode/NumberFormat.cpp | 1 - Userland/Libraries/LibUnicode/NumberFormat.h | 1 - 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp index f9d0d4f537..310a0165b4 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp @@ -803,6 +803,7 @@ static ErrorOr generate_unicode_locale_implementation(Core::Stream::Buffer #include #include #include +#include #include namespace Unicode { @@ -911,22 +912,31 @@ static constexpr Array<@type@, @size@> @name@ { {)~~~"); generate_mapping(generator, locale_data.locales, s_number_system_index_type, "s_locale_number_systems"sv, "s_number_systems_{}", nullptr, [&](auto const& name, auto const& value) { append_map(name, s_number_system_index_type, value.number_systems); }); generate_mapping(generator, locale_data.locales, s_unit_index_type, "s_locale_units"sv, "s_units_{}", nullptr, [&](auto const& name, auto const& value) { append_map(name, s_unit_index_type, value.units); }); - auto append_from_string = [&](StringView enum_title, StringView enum_snake, auto const& values) { - HashValueMap hashes; - hashes.ensure_capacity(values.size()); + generator.append(R"~~~( +static Optional keyword_to_number_system(KeywordNumbers keyword) +{ + switch (keyword) {)~~~"); - for (auto const& value : values) - hashes.set(value.hash(), format_identifier(enum_title, value)); - - generate_value_from_string(generator, "{}_from_string"sv, enum_title, enum_snake, move(hashes)); - }; - - append_from_string("NumberSystem"sv, "number_system"sv, locale_data.number_systems); + for (auto const& number_system : locale_data.number_systems) { + generator.set("name"sv, format_identifier({}, number_system)); + generator.append(R"~~~( + case KeywordNumbers::@name@: + return NumberSystem::@name@;)~~~"); + } generator.append(R"~~~( + default: + return {}; + } +} + Optional> get_digits_for_number_system(StringView system) { - auto number_system_value = number_system_from_string(system); + auto number_system_keyword = keyword_nu_from_string(system); + if (!number_system_keyword.has_value()) + return {}; + + auto number_system_value = keyword_to_number_system(*number_system_keyword); if (!number_system_value.has_value()) return {}; @@ -940,9 +950,13 @@ static NumberSystemData const* find_number_system(StringView locale, StringView if (!locale_value.has_value()) return nullptr; - auto number_system_value = number_system_from_string(system); + auto number_system_keyword = keyword_nu_from_string(system); + if (!number_system_keyword.has_value()) + return {}; + + auto number_system_value = keyword_to_number_system(*number_system_keyword); if (!number_system_value.has_value()) - return nullptr; + return {}; auto locale_index = to_underlying(*locale_value) - 1; // Subtract 1 because 0 == Locale::None. auto number_system_index = to_underlying(*number_system_value); diff --git a/Userland/Libraries/LibUnicode/Forward.h b/Userland/Libraries/LibUnicode/Forward.h index 52140c7d24..d801c5e70b 100644 --- a/Userland/Libraries/LibUnicode/Forward.h +++ b/Userland/Libraries/LibUnicode/Forward.h @@ -35,7 +35,6 @@ enum class ListPatternStyle : u8; enum class ListPatternType : u8; enum class Locale : u16; enum class Month : u8; -enum class NumberSystem : u8; enum class NumericSymbol : u8; enum class Property : u8; enum class Script : u8; diff --git a/Userland/Libraries/LibUnicode/NumberFormat.cpp b/Userland/Libraries/LibUnicode/NumberFormat.cpp index 13b5199000..6e398eab0e 100644 --- a/Userland/Libraries/LibUnicode/NumberFormat.cpp +++ b/Userland/Libraries/LibUnicode/NumberFormat.cpp @@ -16,7 +16,6 @@ namespace Unicode { -Optional __attribute__((weak)) number_system_from_string(StringView) { return {}; } Optional __attribute__((weak)) get_number_system_symbol(StringView, StringView, NumericSymbol) { return {}; } Optional __attribute__((weak)) get_number_system_groupings(StringView, StringView) { return {}; } Optional __attribute__((weak)) get_standard_number_system_format(StringView, StringView, StandardNumberFormatType) { return {}; } diff --git a/Userland/Libraries/LibUnicode/NumberFormat.h b/Userland/Libraries/LibUnicode/NumberFormat.h index 96670cd78e..6246a46c62 100644 --- a/Userland/Libraries/LibUnicode/NumberFormat.h +++ b/Userland/Libraries/LibUnicode/NumberFormat.h @@ -66,7 +66,6 @@ enum class NumericSymbol : u8 { PlusSign, }; -Optional number_system_from_string(StringView system); Optional get_default_number_system(StringView locale); Optional get_number_system_symbol(StringView locale, StringView system, NumericSymbol symbol);