mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 18:42:43 +00:00 
			
		
		
		
	LibUnicode: Dynamically load the generated UnicodeLocale symbols
This commit is contained in:
		
							parent
							
								
									3fd53baa25
								
							
						
					
					
						commit
						09be26b5d2
					
				
					 4 changed files with 119 additions and 147 deletions
				
			
		|  | @ -727,11 +727,7 @@ static void generate_unicode_locale_header(Core::File& file, UnicodeLocaleData& | |||
|     generator.append(R"~~~( | ||||
| #pragma once | ||||
| 
 | ||||
| #include <AK/Optional.h> | ||||
| #include <AK/StringView.h> | ||||
| #include <AK/Types.h> | ||||
| #include <AK/Vector.h> | ||||
| #include <LibUnicode/Forward.h> | ||||
| 
 | ||||
| namespace Unicode { | ||||
| )~~~"); | ||||
|  | @ -748,45 +744,6 @@ namespace Unicode { | |||
|     generate_enum(generator, format_identifier, "ListPatternStyle"sv, {}, locale_data.list_pattern_styles); | ||||
| 
 | ||||
|     generator.append(R"~~~( | ||||
| namespace Detail { | ||||
| 
 | ||||
| Optional<Locale> locale_from_string(StringView locale); | ||||
| 
 | ||||
| Optional<StringView> get_locale_language_mapping(StringView locale, StringView language); | ||||
| Optional<Language> language_from_string(StringView language); | ||||
| Optional<StringView> resolve_language_alias(StringView language); | ||||
| 
 | ||||
| Optional<StringView> get_locale_territory_mapping(StringView locale, StringView territory); | ||||
| Optional<Territory> territory_from_string(StringView territory); | ||||
| Optional<StringView> resolve_territory_alias(StringView territory); | ||||
| 
 | ||||
| Optional<StringView> get_locale_script_tag_mapping(StringView locale, StringView script_tag); | ||||
| Optional<ScriptTag> script_tag_from_string(StringView script_tag); | ||||
| Optional<StringView> resolve_script_tag_alias(StringView script_tag); | ||||
| 
 | ||||
| Optional<StringView> get_locale_long_currency_mapping(StringView locale, StringView currency); | ||||
| Optional<StringView> get_locale_short_currency_mapping(StringView locale, StringView currency); | ||||
| Optional<StringView> get_locale_narrow_currency_mapping(StringView locale, StringView currency); | ||||
| Optional<StringView> get_locale_numeric_currency_mapping(StringView locale, StringView currency); | ||||
| Optional<Currency> currency_from_string(StringView currency); | ||||
| 
 | ||||
| Optional<StringView> get_locale_key_mapping(StringView locale, StringView key); | ||||
| Optional<Key> key_from_string(StringView key); | ||||
| 
 | ||||
| Optional<ListPatterns> get_locale_list_pattern_mapping(StringView locale, StringView list_pattern_type, StringView list_pattern_style); | ||||
| Optional<ListPatternType> list_pattern_type_from_string(StringView list_pattern_type); | ||||
| Optional<ListPatternStyle> list_pattern_style_from_string(StringView list_pattern_style); | ||||
| 
 | ||||
| Optional<StringView> resolve_variant_alias(StringView variant); | ||||
| Optional<StringView> resolve_subdivision_alias(StringView subdivision); | ||||
| 
 | ||||
| void resolve_complex_language_aliases(Unicode::LanguageID& language_id); | ||||
| 
 | ||||
| Optional<Unicode::LanguageID> add_likely_subtags(Unicode::LanguageID const& language_id); | ||||
| Optional<String> resolve_most_likely_territory(Unicode::LanguageID const& language_id); | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| } | ||||
| )~~~"); | ||||
| 
 | ||||
|  | @ -805,7 +762,10 @@ static void generate_unicode_locale_implementation(Core::File& file, UnicodeLoca | |||
|     generator.append(R"~~~( | ||||
| #include <AK/Array.h> | ||||
| #include <AK/BinarySearch.h> | ||||
| #include <AK/Optional.h> | ||||
| #include <AK/Span.h> | ||||
| #include <AK/StringView.h> | ||||
| #include <AK/Vector.h> | ||||
| #include <LibUnicode/Locale.h> | ||||
| #include <LibUnicode/UnicodeLocale.h> | ||||
| 
 | ||||
|  | @ -1072,6 +1032,7 @@ static LanguageMapping const* resolve_likely_subtag(Unicode::LanguageID const& l | |||
|         generator.set("unique_list", unique_list); | ||||
| 
 | ||||
|         generator.append(R"~~~( | ||||
| Optional<StringView> get_locale_@enum_snake@_mapping(StringView locale, StringView @enum_snake@) asm("unicode_get_locale_@enum_snake@_mapping"); | ||||
| Optional<StringView> get_locale_@enum_snake@_mapping(StringView locale, StringView @enum_snake@) | ||||
| { | ||||
|     auto locale_value = locale_from_string(locale); | ||||
|  | @ -1107,7 +1068,7 @@ Optional<StringView> get_locale_@enum_snake@_mapping(StringView locale, StringVi | |||
|         for (auto const& alias : aliases) | ||||
|             hashes.set(alias.alias.hash(), format_identifier(enum_title, alias.alias)); | ||||
| 
 | ||||
|         generate_value_from_string(generator, "{}_from_string"sv, enum_title, enum_snake, move(hashes)); | ||||
|         generate_value_from_string_for_dynamic_loading(generator, "{}_from_string"sv, enum_title, enum_snake, move(hashes)); | ||||
|     }; | ||||
| 
 | ||||
|     auto append_alias_search = [&](StringView enum_snake, auto const& aliases) { | ||||
|  | @ -1117,31 +1078,31 @@ Optional<StringView> get_locale_@enum_snake@_mapping(StringView locale, StringVi | |||
|         for (auto const& alias : aliases) | ||||
|             hashes.set(alias.key.hash(), alias.value); | ||||
| 
 | ||||
|         generate_value_from_string(generator, "resolve_{}_alias"sv, s_string_index_type, enum_snake, move(hashes), "StringView"sv, "s_string_list[{}]"sv); | ||||
|         generate_value_from_string_for_dynamic_loading(generator, "resolve_{}_alias"sv, s_string_index_type, enum_snake, move(hashes), "StringView"sv, "s_string_list[{}]"sv); | ||||
|     }; | ||||
| 
 | ||||
|     append_from_string("Locale"sv, "locale"sv, locale_data.locales.keys(), locale_data.locale_aliases); | ||||
| 
 | ||||
|     append_mapping_search("language"sv, "language"sv, "s_languages"sv, "s_language_lists"sv); | ||||
|     append_from_string("Language"sv, "language"sv, locale_data.languages); | ||||
|     append_mapping_search("language"sv, "language"sv, "s_languages"sv, "s_language_lists"sv); | ||||
|     append_alias_search("language"sv, locale_data.language_aliases); | ||||
| 
 | ||||
|     append_mapping_search("territory"sv, "territory"sv, "s_territories"sv, "s_territory_lists"sv); | ||||
|     append_from_string("Territory"sv, "territory"sv, locale_data.territories); | ||||
|     append_mapping_search("territory"sv, "territory"sv, "s_territories"sv, "s_territory_lists"sv); | ||||
|     append_alias_search("territory"sv, locale_data.territory_aliases); | ||||
| 
 | ||||
|     append_mapping_search("script_tag"sv, "script_tag"sv, "s_scripts"sv, "s_script_lists"sv); | ||||
|     append_from_string("ScriptTag"sv, "script_tag"sv, locale_data.scripts); | ||||
|     append_mapping_search("script_tag"sv, "script_tag"sv, "s_scripts"sv, "s_script_lists"sv); | ||||
|     append_alias_search("script_tag"sv, locale_data.script_aliases); | ||||
| 
 | ||||
|     append_from_string("Currency"sv, "currency"sv, locale_data.currencies); | ||||
|     append_mapping_search("long_currency"sv, "currency"sv, "s_long_currencies"sv, "s_currency_lists"sv); | ||||
|     append_mapping_search("short_currency"sv, "currency"sv, "s_short_currencies"sv, "s_currency_lists"sv); | ||||
|     append_mapping_search("narrow_currency"sv, "currency"sv, "s_narrow_currencies"sv, "s_currency_lists"sv); | ||||
|     append_mapping_search("numeric_currency"sv, "currency"sv, "s_numeric_currencies"sv, "s_currency_lists"sv); | ||||
|     append_from_string("Currency"sv, "currency"sv, locale_data.currencies); | ||||
| 
 | ||||
|     append_mapping_search("key"sv, "key"sv, "s_keywords"sv, "s_keyword_lists"sv); | ||||
|     append_from_string("Key"sv, "key"sv, locale_data.keywords); | ||||
|     append_mapping_search("key"sv, "key"sv, "s_keywords"sv, "s_keyword_lists"sv); | ||||
| 
 | ||||
|     append_alias_search("variant"sv, locale_data.variant_aliases); | ||||
|     append_alias_search("subdivision"sv, locale_data.subdivision_aliases); | ||||
|  | @ -1150,6 +1111,7 @@ Optional<StringView> get_locale_@enum_snake@_mapping(StringView locale, StringVi | |||
|     append_from_string("ListPatternStyle"sv, "list_pattern_style"sv, locale_data.list_pattern_styles); | ||||
| 
 | ||||
|     generator.append(R"~~~( | ||||
| Optional<ListPatterns> get_locale_list_pattern_mapping(StringView locale, StringView list_pattern_type, StringView list_pattern_style) asm("unicode_get_locale_list_pattern_mapping"); | ||||
| Optional<ListPatterns> get_locale_list_pattern_mapping(StringView locale, StringView list_pattern_type, StringView list_pattern_style) | ||||
| { | ||||
|     auto locale_value = locale_from_string(locale); | ||||
|  | @ -1185,6 +1147,7 @@ Optional<ListPatterns> get_locale_list_pattern_mapping(StringView locale, String | |||
|     return {}; | ||||
| } | ||||
| 
 | ||||
| void resolve_complex_language_aliases(Unicode::LanguageID& language_id) asm("unicode_resolve_complex_language_aliases"); | ||||
| void resolve_complex_language_aliases(Unicode::LanguageID& language_id) | ||||
| { | ||||
|     for (auto const& map : s_complex_alias) { | ||||
|  | @ -1217,6 +1180,7 @@ void resolve_complex_language_aliases(Unicode::LanguageID& language_id) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| Optional<Unicode::LanguageID> add_likely_subtags(Unicode::LanguageID const& language_id) asm("unicode_add_likely_subtags"); | ||||
| Optional<Unicode::LanguageID> add_likely_subtags(Unicode::LanguageID const& language_id) | ||||
| { | ||||
|     // https://www.unicode.org/reports/tr35/#Likely_Subtags
 | ||||
|  | @ -1243,6 +1207,7 @@ Optional<Unicode::LanguageID> add_likely_subtags(Unicode::LanguageID const& lang | |||
|     return maximized; | ||||
| } | ||||
| 
 | ||||
| Optional<String> resolve_most_likely_territory(Unicode::LanguageID const& language_id) asm("unicode_resolve_most_likely_territory"); | ||||
| Optional<String> resolve_most_likely_territory(Unicode::LanguageID const& language_id) | ||||
| { | ||||
|     if (auto const* likely_subtag = resolve_likely_subtag(language_id); likely_subtag != nullptr) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy Flynn
						Timothy Flynn