From abcb2d42bc34ef143c0498bb63508377815a0206 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 23 Jul 2025 15:25:14 -0400 Subject: [PATCH] LibUnicode: Port Intl.PluralRules to UTF-16 strings --- Libraries/LibUnicode/ICU.cpp | 5 +++++ Libraries/LibUnicode/ICU.h | 2 ++ Libraries/LibUnicode/NumberFormat.cpp | 6 +++--- Libraries/LibUnicode/PluralRules.cpp | 6 +++--- Libraries/LibUnicode/PluralRules.h | 7 ++++--- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Libraries/LibUnicode/ICU.cpp b/Libraries/LibUnicode/ICU.cpp index 9359673c7b7..2dd1f8cc948 100644 --- a/Libraries/LibUnicode/ICU.cpp +++ b/Libraries/LibUnicode/ICU.cpp @@ -169,6 +169,11 @@ Utf16String icu_string_to_utf16_string(UChar const* string, i32 length) return Utf16String::from_utf16_without_validation({ string, static_cast(length) }); } +Utf16View icu_string_to_utf16_view(icu::UnicodeString const& string) +{ + return { string.getBuffer(), static_cast(string.length()) }; +} + UCharIterator icu_string_iterator(Utf16View const& string) { UCharIterator iterator; diff --git a/Libraries/LibUnicode/ICU.h b/Libraries/LibUnicode/ICU.h index 8392e29a616..c2ad5f3747b 100644 --- a/Libraries/LibUnicode/ICU.h +++ b/Libraries/LibUnicode/ICU.h @@ -116,6 +116,8 @@ String icu_string_to_string(UChar const*, i32 length); Utf16String icu_string_to_utf16_string(icu::UnicodeString const& string); Utf16String icu_string_to_utf16_string(UChar const*, i32 length); +Utf16View icu_string_to_utf16_view(icu::UnicodeString const& string); + UCharIterator icu_string_iterator(Utf16View const&); template diff --git a/Libraries/LibUnicode/NumberFormat.cpp b/Libraries/LibUnicode/NumberFormat.cpp index 35a79a7de60..e214e65f476 100644 --- a/Libraries/LibUnicode/NumberFormat.cpp +++ b/Libraries/LibUnicode/NumberFormat.cpp @@ -671,7 +671,7 @@ public: if (icu_failure(status)) return PluralCategory::Other; - return plural_category_from_string(icu_string_to_string(result)); + return plural_category_from_string(icu_string_to_utf16_view(result)); } virtual PluralCategory select_plural_range(double start, double end) const override @@ -694,7 +694,7 @@ public: if (icu_failure(status)) return PluralCategory::Other; - return plural_category_from_string(icu_string_to_string(result)); + return plural_category_from_string(icu_string_to_utf16_view(result)); } virtual Vector available_plural_categories() const override @@ -710,7 +710,7 @@ public: while (true) { i32 length = 0; - auto const* category = keywords->next(&length, status); + auto const* category = keywords->unext(&length, status); if (icu_failure(status) || category == nullptr) break; diff --git a/Libraries/LibUnicode/PluralRules.cpp b/Libraries/LibUnicode/PluralRules.cpp index 5773d474be5..e229aa06a70 100644 --- a/Libraries/LibUnicode/PluralRules.cpp +++ b/Libraries/LibUnicode/PluralRules.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024, Tim Flynn + * Copyright (c) 2022-2025, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ @@ -28,7 +28,7 @@ StringView plural_form_to_string(PluralForm plural_form) VERIFY_NOT_REACHED(); } -PluralCategory plural_category_from_string(StringView category) +PluralCategory plural_category_from_string(Utf16View const& category) { if (category == "other"sv) return PluralCategory::Other; @@ -49,7 +49,7 @@ PluralCategory plural_category_from_string(StringView category) VERIFY_NOT_REACHED(); } -StringView plural_category_to_string(PluralCategory category) +Utf16View plural_category_to_string(PluralCategory category) { switch (category) { case PluralCategory::Other: diff --git a/Libraries/LibUnicode/PluralRules.h b/Libraries/LibUnicode/PluralRules.h index 62182bd0d90..7b3a21eb1b0 100644 --- a/Libraries/LibUnicode/PluralRules.h +++ b/Libraries/LibUnicode/PluralRules.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2024, Tim Flynn + * Copyright (c) 2022-2025, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Unicode { @@ -30,7 +31,7 @@ enum class PluralCategory { ExactlyZero, ExactlyOne, }; -PluralCategory plural_category_from_string(StringView); -StringView plural_category_to_string(PluralCategory); +PluralCategory plural_category_from_string(Utf16View const&); +Utf16View plural_category_to_string(PluralCategory); }