From b56241f22f96826ef9ef38cf7e4312b899f8e241 Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Thu, 22 Apr 2021 15:08:59 +0300 Subject: [PATCH] ICU: Update to version 69.1, improve ICU data export process. --- COPYRIGHT.txt | 2 +- doc/classes/ProjectSettings.xml | 5 + editor/editor_export.cpp | 28 +- editor/localization_editor.cpp | 71 ---- editor/localization_editor.h | 7 - main/main.cpp | 1 + modules/text_server_adv/SCsub | 2 +- thirdparty/README.md | 6 +- thirdparty/icu4c/APIChangeReport.md | 396 ------------------ thirdparty/icu4c/common/bytestriebuilder.cpp | 26 +- thirdparty/icu4c/common/charstr.cpp | 34 ++ thirdparty/icu4c/common/charstr.h | 3 + thirdparty/icu4c/common/cmemory.h | 55 ++- thirdparty/icu4c/common/dictbe.cpp | 32 +- thirdparty/icu4c/common/edits.cpp | 1 + thirdparty/icu4c/common/filteredbrk.cpp | 93 ++-- thirdparty/icu4c/common/hash.h | 19 + thirdparty/icu4c/common/localematcher.cpp | 12 +- .../icu4c/common/localeprioritylist.cpp | 11 +- thirdparty/icu4c/common/locdispnames.cpp | 2 +- thirdparty/icu4c/common/locid.cpp | 244 ++++++++++- thirdparty/icu4c/common/loclikelysubtags.cpp | 3 +- thirdparty/icu4c/common/norm2allmodes.h | 82 +++- thirdparty/icu4c/common/normalizer2impl.cpp | 152 ++++++- thirdparty/icu4c/common/normalizer2impl.h | 11 +- thirdparty/icu4c/common/pluralmap.h | 2 +- thirdparty/icu4c/common/putil.cpp | 4 +- thirdparty/icu4c/common/putilimp.h | 2 +- thirdparty/icu4c/common/rbbi.cpp | 2 +- thirdparty/icu4c/common/rbbi_cache.cpp | 2 +- thirdparty/icu4c/common/rbbiscan.cpp | 6 +- thirdparty/icu4c/common/rbbitblb.cpp | 2 +- thirdparty/icu4c/common/resource.h | 6 +- thirdparty/icu4c/common/restrace.cpp | 3 + thirdparty/icu4c/common/servnotf.h | 4 +- thirdparty/icu4c/common/ubrk.cpp | 12 + thirdparty/icu4c/common/ucase.cpp | 2 +- thirdparty/icu4c/common/uchar.cpp | 38 +- thirdparty/icu4c/common/ucnv2022.cpp | 6 +- thirdparty/icu4c/common/ucnv_bld.cpp | 2 +- thirdparty/icu4c/common/ucnv_err.cpp | 2 +- thirdparty/icu4c/common/ucnv_lmb.cpp | 4 +- thirdparty/icu4c/common/ucnv_u7.cpp | 2 +- thirdparty/icu4c/common/ucnvisci.cpp | 6 +- thirdparty/icu4c/common/ucurr.cpp | 4 +- thirdparty/icu4c/common/uhash.cpp | 81 +++- thirdparty/icu4c/common/uhash.h | 95 ++++- thirdparty/icu4c/common/uloc.cpp | 42 +- thirdparty/icu4c/common/uloc_keytype.cpp | 2 +- thirdparty/icu4c/common/uloc_tag.cpp | 41 +- thirdparty/icu4c/common/ulocimp.h | 3 + thirdparty/icu4c/common/unicode/bytestream.h | 6 +- thirdparty/icu4c/common/unicode/bytestrie.h | 3 + .../icu4c/common/unicode/bytestriebuilder.h | 5 + thirdparty/icu4c/common/unicode/docmain.h | 8 +- thirdparty/icu4c/common/unicode/icuplug.h | 7 +- .../icu4c/common/unicode/localematcher.h | 16 +- thirdparty/icu4c/common/unicode/locid.h | 4 +- thirdparty/icu4c/common/unicode/normalizer2.h | 28 +- thirdparty/icu4c/common/unicode/platform.h | 2 +- thirdparty/icu4c/common/unicode/stringpiece.h | 26 +- thirdparty/icu4c/common/unicode/ubrk.h | 21 +- thirdparty/icu4c/common/unicode/ucnv.h | 4 +- thirdparty/icu4c/common/unicode/ucnvsel.h | 4 +- thirdparty/icu4c/common/unicode/unifilt.h | 4 +- thirdparty/icu4c/common/unicode/uniset.h | 66 +-- thirdparty/icu4c/common/unicode/unistr.h | 8 +- thirdparty/icu4c/common/unicode/urename.h | 16 + thirdparty/icu4c/common/unicode/uset.h | 95 ++++- thirdparty/icu4c/common/unicode/ushape.h | 2 +- thirdparty/icu4c/common/unicode/utrace.h | 17 +- thirdparty/icu4c/common/unicode/uvernum.h | 12 +- thirdparty/icu4c/common/uniset.cpp | 128 +++--- thirdparty/icu4c/common/uniset_props.cpp | 116 ++--- thirdparty/icu4c/common/unisetspan.cpp | 25 +- thirdparty/icu4c/common/uprops.h | 52 --- thirdparty/icu4c/common/uresbund.cpp | 23 +- thirdparty/icu4c/common/uresdata.cpp | 8 - thirdparty/icu4c/common/uresimp.h | 4 +- thirdparty/icu4c/common/uset.cpp | 35 ++ thirdparty/icu4c/common/usprep.cpp | 2 +- thirdparty/icu4c/common/ustr_wcs.cpp | 4 +- thirdparty/icu4c/common/utext.cpp | 6 +- thirdparty/icu4c/common/util.h | 6 +- thirdparty/icu4c/common/utracimp.h | 2 +- thirdparty/icu4c/common/uvector.cpp | 4 +- thirdparty/icu4c/common/wintz.cpp | 24 +- .../icu4c/{icudt68l.dat => icudt69l.dat} | Bin 3846720 -> 3851952 bytes 88 files changed, 1417 insertions(+), 1049 deletions(-) delete mode 100644 thirdparty/icu4c/APIChangeReport.md rename thirdparty/icu4c/{icudt68l.dat => icudt69l.dat} (86%) diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index 3bb9c916fdf..9e63da3fc4b 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -198,7 +198,7 @@ License: HarfBuzz Files: ./thirdparty/icu4c/ Comment: International Components for Unicode -Copyright: 1991-2020, Unicode +Copyright: 1991-2021, Unicode License: Unicode Files: ./thirdparty/jpeg-compressor/ diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index c8fd0d667ba..59279f4e3fd 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -746,6 +746,11 @@ Default delay for touch events. This only affects iOS devices. + + If [code]true[/code], text server break iteration rule sets, dictionaries and other optional data are included in the exported project. + [b]Note:[/b] "ICU / HarfBuzz / Graphite" text server data includes dictionaries for Burmese, Chinese, Japanese, Khmer, Lao and Thai as well as Unicode Standard Annex #29 and Unicode Standard Annex #14 word and line breaking rules. Data is about 4 MB large. + [b]Note:[/b] "Fallback" text server does not use additional data. + The locale to fall back to if a translation isn't available in a given language. If left empty, [code]en[/code] (English) will be used. diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index a5ebfbfb8a5..a368a9618e4 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -1051,14 +1051,28 @@ Error EditorExportPlatform::export_project_files(const Ref & } } - // Store text server data if exists. + // Store text server data if it is supported. if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) { - String ts_data = "res://" + TS->get_support_data_filename(); - if (FileAccess::exists(ts_data)) { - Vector array = FileAccess::get_file_as_array(ts_data); - err = p_func(p_udata, ts_data, array, idx, total, enc_in_filters, enc_ex_filters, key); - if (err != OK) { - return err; + bool use_data = ProjectSettings::get_singleton()->get("internationalization/locale/include_text_server_data"); + if (use_data) { + // Try using user provided data file. + String ts_data = "res://" + TS->get_support_data_filename(); + if (FileAccess::exists(ts_data)) { + Vector array = FileAccess::get_file_as_array(ts_data); + err = p_func(p_udata, ts_data, array, idx, total, enc_in_filters, enc_ex_filters, key); + if (err != OK) { + return err; + } + } else { + // Use default text server data. + String icu_data_file = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmp_icu_data"); + TS->save_support_data(icu_data_file); + Vector array = FileAccess::get_file_as_array(icu_data_file); + err = p_func(p_udata, ts_data, array, idx, total, enc_in_filters, enc_ex_filters, key); + DirAccess::remove_file_or_error(icu_data_file); + if (err != OK) { + return err; + } } } } diff --git a/editor/localization_editor.cpp b/editor/localization_editor.cpp index 0e68af06f0d..161f1dde0d2 100644 --- a/editor/localization_editor.cpp +++ b/editor/localization_editor.cpp @@ -37,24 +37,6 @@ #include "scene/gui/control.h" void LocalizationEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_TEXT_SERVER_CHANGED) { - ts_name->set_text(TTR("Text server: ") + TS->get_name()); - - FileAccessRef file_check = FileAccess::create(FileAccess::ACCESS_RESOURCES); - if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) { - if (file_check->file_exists("res://" + TS->get_support_data_filename())) { - ts_data_status->set_text(TTR("Support data: ") + TTR("Installed")); - ts_install->set_disabled(true); - } else { - ts_data_status->set_text(TTR("Support data: ") + TTR("Not installed")); - ts_install->set_disabled(false); - } - } else { - ts_data_status->set_text(TTR("Support data: ") + TTR("Not supported")); - ts_install->set_disabled(false); - } - ts_data_info->set_text(TTR("Info: ") + TS->get_support_data_info()); - } if (p_what == NOTIFICATION_ENTER_TREE) { translation_list->connect("button_pressed", callable_mp(this, &LocalizationEditor::_translation_delete)); translation_pot_list->connect("button_pressed", callable_mp(this, &LocalizationEditor::_pot_delete)); @@ -649,26 +631,6 @@ void LocalizationEditor::update_translations() { updating_translations = false; } -void LocalizationEditor::_install_ts_data() { - if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) { - TS->save_support_data("res://" + TS->get_support_data_filename()); - } - - FileAccessRef file_check = FileAccess::create(FileAccess::ACCESS_RESOURCES); - if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) { - if (file_check->file_exists("res://" + TS->get_support_data_filename())) { - ts_data_status->set_text(TTR("Support data: ") + TTR("Installed")); - ts_install->set_disabled(true); - } else { - ts_data_status->set_text(TTR("Support data: ") + TTR("Not installed")); - ts_install->set_disabled(false); - } - } else { - ts_data_status->set_text(TTR("Support data: ") + TTR("Not supported")); - ts_install->set_disabled(false); - } -} - void LocalizationEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("update_translations"), &LocalizationEditor::update_translations); @@ -838,37 +800,4 @@ LocalizationEditor::LocalizationEditor() { pot_file_open_dialog->connect("files_selected", callable_mp(this, &LocalizationEditor::_pot_add)); add_child(pot_file_open_dialog); } - - { - VBoxContainer *tvb = memnew(VBoxContainer); - tvb->set_name(TTR("Text Server Data")); - translations->add_child(tvb); - - ts_name = memnew(Label(TTR("Text server: ") + TS->get_name())); - tvb->add_child(ts_name); - - ts_data_status = memnew(Label(TTR("Support data: "))); - tvb->add_child(ts_data_status); - - ts_data_info = memnew(Label(TTR("Info: ") + TS->get_support_data_info())); - tvb->add_child(ts_data_info); - - ts_install = memnew(Button(TTR("Install support data..."))); - ts_install->connect("pressed", callable_mp(this, &LocalizationEditor::_install_ts_data)); - tvb->add_child(ts_install); - - FileAccessRef file_check = FileAccess::create(FileAccess::ACCESS_RESOURCES); - if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) { - if (file_check->file_exists("res://" + TS->get_support_data_filename())) { - ts_data_status->set_text(TTR("Support data: ") + TTR("Installed")); - ts_install->set_disabled(true); - } else { - ts_data_status->set_text(TTR("Support data: ") + TTR("Not installed")); - ts_install->set_disabled(false); - } - } else { - ts_data_status->set_text(TTR("Support data: ") + TTR("Not supported")); - ts_install->set_disabled(false); - } - } } diff --git a/editor/localization_editor.h b/editor/localization_editor.h index 6e0d7ce61fb..23cea06fbe6 100644 --- a/editor/localization_editor.h +++ b/editor/localization_editor.h @@ -58,11 +58,6 @@ class LocalizationEditor : public VBoxContainer { Vector translation_filter_treeitems; Vector translation_locales_idxs_remap; - Label *ts_name; - Label *ts_data_status; - Label *ts_data_info; - Button *ts_install; - Tree *translation_pot_list; EditorFileDialog *pot_file_open_dialog; EditorFileDialog *pot_generate_dialog; @@ -94,8 +89,6 @@ class LocalizationEditor : public VBoxContainer { void _pot_generate(const String &p_file); void _update_pot_file_extensions(); - void _install_ts_data(); - protected: void _notification(int p_what); static void _bind_methods(); diff --git a/main/main.cpp b/main/main.cpp index bf7b88bdc95..bb16c499836 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -1253,6 +1253,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph } GLOBAL_DEF("internationalization/rendering/force_right_to_left_layout_direction", false); + GLOBAL_DEF("internationalization/locale/include_text_server_data", false); if (!force_lowdpi) { OS::get_singleton()->_allow_hidpi = GLOBAL_DEF("display/window/dpi/allow_hidpi", false); diff --git a/modules/text_server_adv/SCsub b/modules/text_server_adv/SCsub index e7863f88a32..a55b6dc2833 100644 --- a/modules/text_server_adv/SCsub +++ b/modules/text_server_adv/SCsub @@ -448,7 +448,7 @@ if env["builtin_icu"]: ] thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] - icu_data_name = "icudt68l.dat" + icu_data_name = "icudt69l.dat" if env_icu["tools"]: env_icu.Depends("#thirdparty/icu4c/icudata.gen.h", "#thirdparty/icu4c/" + icu_data_name) diff --git a/thirdparty/README.md b/thirdparty/README.md index 33ce2423d96..97f21f85393 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -186,17 +186,17 @@ Files extracted from upstream source: ## icu4c - Upstream: https://github.com/unicode-org/icu -- Version: 68.2 (84e1f26ea77152936e70d53178a816dbfbf69989, 2020) +- Version: 69.1 (0e7b4428866f3133b4abba2d932ee3faa708db1d, 2021) - License: Unicode Files extracted from upstream source: - the `common` folder -- `APIChangeReport.md`, `LICENSE` +- `LICENSE` Files generated from upstream source: -- the `icudt68l.dat` built with the provided `godot_data.json` config file (see +- the `icudt69l.dat` built with the provided `godot_data.json` config file (see https://github.com/unicode-org/icu/blob/master/docs/userguide/icu_data/buildtool.md for instructions) diff --git a/thirdparty/icu4c/APIChangeReport.md b/thirdparty/icu4c/APIChangeReport.md deleted file mode 100644 index 5385904fd10..00000000000 --- a/thirdparty/icu4c/APIChangeReport.md +++ /dev/null @@ -1,396 +0,0 @@ - - - - -# ICU4C API Comparison: ICU 67 with ICU 68 - -> _Note_ Markdown format of this document is new for ICU 65. - -- [Removed from ICU 67](#removed) -- [Deprecated or Obsoleted in ICU 68](#deprecated) -- [Changed in ICU 68](#changed) -- [Promoted to stable in ICU 68](#promoted) -- [Added in ICU 68](#added) -- [Other existing drafts in ICU 68](#other) -- [Signature Simplifications](#simplifications) - -## Removed - -Removed from ICU 67 - -| File | API | ICU 67 | ICU 68 | -|---|---|---|---| -| fmtable.h | const UFormattable* icu::Formattable::toUFormattable() | StableICU 52 | (missing) -| measunit.h | LocalArray<MeasureUnit> icu::MeasureUnit::splitToSingleUnits(int32_t&, UErrorCode&) const | InternalICU 67 | (missing) -| measunit.h | int32_t icu::MeasureUnit::getIndex() const | Internal | (missing) -| measunit.h | static MeasureUnit icu::MeasureUnit::resolveUnitPerUnit(const MeasureUnit&, const MeasureUnit&, bool*) | Internal | (missing) -| measunit.h | static int32_t icu::MeasureUnit::getIndexCount() | Internal | (missing) -| measunit.h | static int32_t icu::MeasureUnit::internalGetIndexForTypeAndSubtype(const char*, const char*) | Internal | (missing) -| nounit.h | UClassID icu::NoUnit::getDynamicClassID() const | DraftICU 60 | (missing) -| nounit.h | icu::NoUnit::NoUnit(const NoUnit&) | DraftICU 60 | (missing) -| nounit.h | icu::NoUnit::~NoUnit() | DraftICU 60 | (missing) -| nounit.h | static NoUnit icu::NoUnit::base() | DraftICU 60 | (missing) -| nounit.h | static NoUnit icu::NoUnit::percent() | DraftICU 60 | (missing) -| nounit.h | static NoUnit icu::NoUnit::permille() | DraftICU 60 | (missing) -| nounit.h | static UClassID icu::NoUnit::getStaticClassID() | DraftICU 60 | (missing) -| nounit.h | void* icu::NoUnit::clone() const | DraftICU 60 | (missing) -| uniset.h | const USet* icu::UnicodeSet::toUSet() | StableICU 4.2 | (missing) - -## Deprecated - -Deprecated or Obsoleted in ICU 68 - -| File | API | ICU 67 | ICU 68 | -|---|---|---|---| -| numberrangeformatter.h | UnicodeString icu::number::FormattedNumberRange::getFirstDecimal(UErrorCode&) const | DraftICU 63 | DeprecatedICU 68 -| numberrangeformatter.h | UnicodeString icu::number::FormattedNumberRange::getSecondDecimal(UErrorCode&) const | DraftICU 63 | DeprecatedICU 68 -| umachine.h | #define FALSE | StableICU 2.0 | DeprecatedICU 68 -| umachine.h | #define TRUE | StableICU 2.0 | DeprecatedICU 68 - -## Changed - -Changed in ICU 68 (old, new) - - - -| File | API | ICU 67 | ICU 68 | -|---|---|---|---| -| bytestrie.h | BytesTrie& icu::BytesTrie::resetToState64(uint64_t) | Draft→StableICU 65 -| bytestrie.h | uint64_t icu::BytesTrie::getState64() const | Draft→StableICU 65 -| listformatter.h | static ListFormatter* icu::ListFormatter::createInstance(const Locale&, UListFormatterType, UListFormatterWidth, UErrorCode&) | Draft→StableICU 67 -| localebuilder.h | UBool icu::LocaleBuilder::copyErrorTo(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::addSupportedLocale(const Locale&) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::operator=(Builder&&) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setDefaultLocale(const Locale*) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setDemotionPerDesiredLocale(ULocMatchDemotion) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setFavorSubtag(ULocMatchFavorSubtag) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocales(Iter, Iter) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocales(Locale::Iterator&) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocalesFromListString(StringPiece) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocalesViaConverter(Iter, Iter, Conv) | Draft→StableICU 65 -| localematcher.h | Locale icu::LocaleMatcher::Result::makeResolvedLocale(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | LocaleMatcher icu::LocaleMatcher::Builder::build(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | LocaleMatcher& icu::LocaleMatcher::operator=(LocaleMatcher&&) | Draft→StableICU 65 -| localematcher.h | Result icu::LocaleMatcher::getBestMatchResult(Locale::Iterator&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | Result icu::LocaleMatcher::getBestMatchResult(const Locale&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | Result& icu::LocaleMatcher::Result::operator=(Result&&) | Draft→StableICU 65 -| localematcher.h | UBool icu::LocaleMatcher::Builder::copyErrorTo(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::Result::getDesiredLocale() const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::Result::getSupportedLocale() const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::getBestMatch(Locale::Iterator&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::getBestMatch(const Locale&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::getBestMatchForListString(StringPiece, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | enum ULocMatchDemotion::ULOCMATCH_DEMOTION_NONE | Draft→StableICU 65 -| localematcher.h | enum ULocMatchDemotion::ULOCMATCH_DEMOTION_REGION | Draft→StableICU 65 -| localematcher.h | enum ULocMatchFavorSubtag::ULOCMATCH_FAVOR_LANGUAGE | Draft→StableICU 65 -| localematcher.h | enum ULocMatchFavorSubtag::ULOCMATCH_FAVOR_SCRIPT | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Builder::Builder() | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Builder::Builder(Builder&&) | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Builder::~Builder() | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::LocaleMatcher(LocaleMatcher&&) | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Result::Result(Result&&) | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Result::~Result() | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::~LocaleMatcher() | Draft→StableICU 65 -| localematcher.h | int32_t icu::LocaleMatcher::Result::getDesiredIndex() const | Draft→StableICU 65 -| localematcher.h | int32_t icu::LocaleMatcher::Result::getSupportedIndex() const | Draft→StableICU 65 -| locid.h | UBool icu::Locale::ConvertingIterator< Iter, Conv >::hasNext() const override | Draft→StableICU 65 -| locid.h | UBool icu::Locale::Iterator::hasNext() const | Draft→StableICU 65 -| locid.h | UBool icu::Locale::RangeIterator< Iter >::hasNext() const override | Draft→StableICU 65 -| locid.h | const Locale& icu::Locale::ConvertingIterator< Iter, Conv >::next() override | Draft→StableICU 65 -| locid.h | const Locale& icu::Locale::Iterator::next() | Draft→StableICU 65 -| locid.h | const Locale& icu::Locale::RangeIterator< Iter >::next() override | Draft→StableICU 65 -| locid.h | icu::Locale::ConvertingIterator< Iter, Conv >::ConvertingIterator(Iter, Iter, Conv) | Draft→StableICU 65 -| locid.h | icu::Locale::Iterator::~Iterator() | Draft→StableICU 65 -| locid.h | icu::Locale::RangeIterator< Iter >::RangeIterator(Iter, Iter) | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getBar() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDecade() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDotPerCentimeter() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDotPerInch() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getEm() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getMegapixel() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPascal() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPixel() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPixelPerCentimeter() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPixelPerInch() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getThermUs() | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createBar(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDecade(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDotPerCentimeter(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDotPerInch(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createEm(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createMegapixel(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPascal(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPixel(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPixelPerCentimeter(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPixelPerInch(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createThermUs(UErrorCode&) | Draft→StableICU 65 -| numberformatter.h | StringClass icu::number::FormattedNumber::toDecimalNumber(UErrorCode&) const | Draft→StableICU 65 -| numberrangeformatter.h | UnicodeString icu::number::FormattedNumberRange::getFirstDecimal(UErrorCode&) const | DraftICU 63 | DeprecatedICU 68 -| numberrangeformatter.h | UnicodeString icu::number::FormattedNumberRange::getSecondDecimal(UErrorCode&) const | DraftICU 63 | DeprecatedICU 68 -| reldatefmt.h | enum UDateAbsoluteUnit::UDAT_ABSOLUTE_HOUR | Draft→StableICU 65 -| reldatefmt.h | enum UDateAbsoluteUnit::UDAT_ABSOLUTE_MINUTE | Draft→StableICU 65 -| stringpiece.h | icu::StringPiece::StringPiece(T) | Draft→StableICU 65 -| ucal.h | int32_t ucal_getHostTimeZone(UChar*, int32_t, UErrorCode*) | Draft→StableICU 65 -| ucharstrie.h | UCharsTrie& icu::UCharsTrie::resetToState64(uint64_t) | Draft→StableICU 65 -| ucharstrie.h | uint64_t icu::UCharsTrie::getState64() const | Draft→StableICU 65 -| ulistformatter.h | UListFormatter* ulistfmt_openForType(const char*, UListFormatterType, UListFormatterWidth, UErrorCode*) | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterType::ULISTFMT_TYPE_AND | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterType::ULISTFMT_TYPE_OR | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterType::ULISTFMT_TYPE_UNITS | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterWidth::ULISTFMT_WIDTH_NARROW | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterWidth::ULISTFMT_WIDTH_SHORT | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterWidth::ULISTFMT_WIDTH_WIDE | Draft→StableICU 67 -| uloc.h | UEnumeration* uloc_openAvailableByType(ULocAvailableType, UErrorCode*) | Draft→StableICU 65 -| uloc.h | enum ULocAvailableType::ULOC_AVAILABLE_DEFAULT | Draft→StableICU 65 -| uloc.h | enum ULocAvailableType::ULOC_AVAILABLE_ONLY_LEGACY_ALIASES | Draft→StableICU 65 -| uloc.h | enum ULocAvailableType::ULOC_AVAILABLE_WITH_LEGACY_ALIASES | Draft→StableICU 65 -| umachine.h | #define FALSE | StableICU 2.0 | DeprecatedICU 68 -| umachine.h | #define TRUE | StableICU 2.0 | DeprecatedICU 68 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_BUNDLE | Draft→StableICU 65 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_DATA_FILE | Draft→StableICU 65 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_RES_FILE | Draft→StableICU 65 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_START | Draft→StableICU 65 - -## Promoted - -Promoted to stable in ICU 68 - -| File | API | ICU 67 | ICU 68 | -|---|---|---|---| -| bytestrie.h | BytesTrie& icu::BytesTrie::resetToState64(uint64_t) | Draft→StableICU 65 -| bytestrie.h | uint64_t icu::BytesTrie::getState64() const | Draft→StableICU 65 -| fmtable.h | UFormattable* icu::Formattable::toUFormattable() | (missing) | StableICU 52 -| listformatter.h | static ListFormatter* icu::ListFormatter::createInstance(const Locale&, UListFormatterType, UListFormatterWidth, UErrorCode&) | Draft→StableICU 67 -| localebuilder.h | UBool icu::LocaleBuilder::copyErrorTo(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::addSupportedLocale(const Locale&) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::operator=(Builder&&) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setDefaultLocale(const Locale*) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setDemotionPerDesiredLocale(ULocMatchDemotion) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setFavorSubtag(ULocMatchFavorSubtag) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocales(Iter, Iter) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocales(Locale::Iterator&) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocalesFromListString(StringPiece) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocalesViaConverter(Iter, Iter, Conv) | Draft→StableICU 65 -| localematcher.h | Locale icu::LocaleMatcher::Result::makeResolvedLocale(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | LocaleMatcher icu::LocaleMatcher::Builder::build(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | LocaleMatcher& icu::LocaleMatcher::operator=(LocaleMatcher&&) | Draft→StableICU 65 -| localematcher.h | Result icu::LocaleMatcher::getBestMatchResult(Locale::Iterator&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | Result icu::LocaleMatcher::getBestMatchResult(const Locale&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | Result& icu::LocaleMatcher::Result::operator=(Result&&) | Draft→StableICU 65 -| localematcher.h | UBool icu::LocaleMatcher::Builder::copyErrorTo(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::Result::getDesiredLocale() const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::Result::getSupportedLocale() const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::getBestMatch(Locale::Iterator&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::getBestMatch(const Locale&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::getBestMatchForListString(StringPiece, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | enum ULocMatchDemotion::ULOCMATCH_DEMOTION_NONE | Draft→StableICU 65 -| localematcher.h | enum ULocMatchDemotion::ULOCMATCH_DEMOTION_REGION | Draft→StableICU 65 -| localematcher.h | enum ULocMatchFavorSubtag::ULOCMATCH_FAVOR_LANGUAGE | Draft→StableICU 65 -| localematcher.h | enum ULocMatchFavorSubtag::ULOCMATCH_FAVOR_SCRIPT | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Builder::Builder() | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Builder::Builder(Builder&&) | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Builder::~Builder() | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::LocaleMatcher(LocaleMatcher&&) | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Result::Result(Result&&) | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Result::~Result() | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::~LocaleMatcher() | Draft→StableICU 65 -| localematcher.h | int32_t icu::LocaleMatcher::Result::getDesiredIndex() const | Draft→StableICU 65 -| localematcher.h | int32_t icu::LocaleMatcher::Result::getSupportedIndex() const | Draft→StableICU 65 -| locid.h | UBool icu::Locale::ConvertingIterator< Iter, Conv >::hasNext() const override | Draft→StableICU 65 -| locid.h | UBool icu::Locale::Iterator::hasNext() const | Draft→StableICU 65 -| locid.h | UBool icu::Locale::RangeIterator< Iter >::hasNext() const override | Draft→StableICU 65 -| locid.h | const Locale& icu::Locale::ConvertingIterator< Iter, Conv >::next() override | Draft→StableICU 65 -| locid.h | const Locale& icu::Locale::Iterator::next() | Draft→StableICU 65 -| locid.h | const Locale& icu::Locale::RangeIterator< Iter >::next() override | Draft→StableICU 65 -| locid.h | icu::Locale::ConvertingIterator< Iter, Conv >::ConvertingIterator(Iter, Iter, Conv) | Draft→StableICU 65 -| locid.h | icu::Locale::Iterator::~Iterator() | Draft→StableICU 65 -| locid.h | icu::Locale::RangeIterator< Iter >::RangeIterator(Iter, Iter) | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getBar() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDecade() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDotPerCentimeter() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDotPerInch() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getEm() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getMegapixel() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPascal() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPixel() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPixelPerCentimeter() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPixelPerInch() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getThermUs() | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createBar(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDecade(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDotPerCentimeter(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDotPerInch(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createEm(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createMegapixel(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPascal(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPixel(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPixelPerCentimeter(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPixelPerInch(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createThermUs(UErrorCode&) | Draft→StableICU 65 -| numberformatter.h | StringClass icu::number::FormattedNumber::toDecimalNumber(UErrorCode&) const | Draft→StableICU 65 -| reldatefmt.h | enum UDateAbsoluteUnit::UDAT_ABSOLUTE_HOUR | Draft→StableICU 65 -| reldatefmt.h | enum UDateAbsoluteUnit::UDAT_ABSOLUTE_MINUTE | Draft→StableICU 65 -| stringpiece.h | icu::StringPiece::StringPiece(T) | Draft→StableICU 65 -| ucal.h | int32_t ucal_getHostTimeZone(UChar*, int32_t, UErrorCode*) | Draft→StableICU 65 -| ucharstrie.h | UCharsTrie& icu::UCharsTrie::resetToState64(uint64_t) | Draft→StableICU 65 -| ucharstrie.h | uint64_t icu::UCharsTrie::getState64() const | Draft→StableICU 65 -| ulistformatter.h | UListFormatter* ulistfmt_openForType(const char*, UListFormatterType, UListFormatterWidth, UErrorCode*) | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterType::ULISTFMT_TYPE_AND | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterType::ULISTFMT_TYPE_OR | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterType::ULISTFMT_TYPE_UNITS | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterWidth::ULISTFMT_WIDTH_NARROW | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterWidth::ULISTFMT_WIDTH_SHORT | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterWidth::ULISTFMT_WIDTH_WIDE | Draft→StableICU 67 -| uloc.h | UEnumeration* uloc_openAvailableByType(ULocAvailableType, UErrorCode*) | Draft→StableICU 65 -| uloc.h | enum ULocAvailableType::ULOC_AVAILABLE_DEFAULT | Draft→StableICU 65 -| uloc.h | enum ULocAvailableType::ULOC_AVAILABLE_ONLY_LEGACY_ALIASES | Draft→StableICU 65 -| uloc.h | enum ULocAvailableType::ULOC_AVAILABLE_WITH_LEGACY_ALIASES | Draft→StableICU 65 -| uniset.h | USet* icu::UnicodeSet::toUSet() | (missing) | StableICU 4.2 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_BUNDLE | Draft→StableICU 65 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_DATA_FILE | Draft→StableICU 65 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_RES_FILE | Draft→StableICU 65 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_START | Draft→StableICU 65 - -## Added - -Added in ICU 68 - -| File | API | ICU 67 | ICU 68 | -|---|---|---|---| -| dtitvfmt.h | UDisplayContext icu::DateIntervalFormat::getContext(UDisplayContextType, UErrorCode&) const | (missing) | DraftICU 68 -| dtitvfmt.h | void icu::DateIntervalFormat::setContext(UDisplayContext, UErrorCode&) | (missing) | DraftICU 68 -| dtptngen.h | static DateTimePatternGenerator* icu::DateTimePatternGenerator::createInstanceNoStdPat(const Locale&, UErrorCode&) | (missing) | Internal -| fmtable.h | UFormattable* icu::Formattable::toUFormattable() | (missing) | StableICU 52 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setMaxDistance(const Locale&, const Locale&) | (missing) | DraftICU 68 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setNoDefaultLocale() | (missing) | DraftICU 68 -| localematcher.h | UBool icu::LocaleMatcher::isMatch(const Locale&, const Locale&, UErrorCode&) const | (missing) | DraftICU 68 -| measunit.h | int32_t icu::MeasureUnit::getOffset() const | (missing) | Internal -| measunit.h | static MeasureUnit icu::MeasureUnit::getCandela() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDessertSpoon() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDessertSpoonImperial() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDot() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDram() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDrop() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getEarthRadius() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getGrain() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getJigger() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getLumen() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPinch() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getQuartImperial() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createCandela(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDessertSpoon(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDessertSpoonImperial(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDot(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDram(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDrop(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createEarthRadius(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createGrain(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createJigger(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createLumen(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPinch(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createQuartImperial(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | std::pair< LocalArray< MeasureUnit >, int32_t > icu::MeasureUnit::splitToSingleUnits(UErrorCode&) const | (missing) | DraftICU 68 -| numberformatter.h | Derived icu::number::NumberFormatterSettings< Derived >::usage(StringPiece) const& | (missing) | DraftICU 68 -| numberformatter.h | Derived icu::number::NumberFormatterSettings< Derived >::usage(StringPiece)&& | (missing) | DraftICU 68 -| numberformatter.h | MeasureUnit icu::number::FormattedNumber::getOutputUnit(UErrorCode&) const | (missing) | DraftICU 68 -| numberformatter.h | Usage& icu::number::impl::Usage::operator=(Usage&&) | (missing) | Internal -| numberformatter.h | Usage& icu::number::impl::Usage::operator=(const Usage&) | (missing) | Internal -| numberformatter.h | bool icu::number::impl::Usage::isSet() const | (missing) | Internal -| numberformatter.h | icu::number::impl::Usage::Usage(Usage&&) | (missing) | Internal -| numberformatter.h | icu::number::impl::Usage::Usage(const Usage&) | (missing) | Internal -| numberformatter.h | icu::number::impl::Usage::~Usage() | (missing) | Internal -| numberformatter.h | int16_t icu::number::impl::Usage::length() const | (missing) | Internal -| numberformatter.h | void icu::number::impl::Usage::set(StringPiece) | (missing) | Internal -| numberrangeformatter.h | std::pair< StringClass, StringClass > icu::number::FormattedNumberRange::getDecimalNumbers(UErrorCode&) const | (missing) | DraftICU 68 -| plurrule.h | UnicodeString icu::PluralRules::select(const number::FormattedNumberRange&, UErrorCode&) const | (missing) | DraftICU 68 -| plurrule.h | UnicodeString icu::PluralRules::select(const number::impl::UFormattedNumberRangeData*, UErrorCode&) const | (missing) | Internal -| plurrule.h | int32_t icu::PluralRules::getSamples(const UnicodeString&, FixedDecimal*, int32_t, UErrorCode&) | (missing) | Internal -| timezone.h | static TimeZone* icu::TimeZone::forLocaleOrDefault(const Locale&) | (missing) | Internal -| ucurr.h | enum UCurrNameStyle::UCURR_FORMAL_SYMBOL_NAME | (missing) | DraftICU 68 -| ucurr.h | enum UCurrNameStyle::UCURR_VARIANT_SYMBOL_NAME | (missing) | DraftICU 68 -| udateintervalformat.h | UDisplayContext udtitvfmt_getContext(const UDateIntervalFormat*, UDisplayContextType, UErrorCode*) | (missing) | DraftICU 68 -| udateintervalformat.h | void udtitvfmt_setContext(UDateIntervalFormat*, UDisplayContext, UErrorCode*) | (missing) | DraftICU 68 -| umachine.h | #define U_DEFINE_FALSE_AND_TRUE | (missing) | InternalICU 68 -| uniset.h | USet* icu::UnicodeSet::toUSet() | (missing) | StableICU 4.2 -| unum.h | enum UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_AUTO | (missing) | DraftICU 68 -| unum.h | enum UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_MIN2 | (missing) | DraftICU 68 -| unumberformatter.h | enum UNumberUnitWidth::UNUM_UNIT_WIDTH_FORMAL | (missing) | DraftICU 68 -| unumberformatter.h | enum UNumberUnitWidth::UNUM_UNIT_WIDTH_VARIANT | (missing) | DraftICU 68 -| unumberformatter.h | int32_t unumf_resultToDecimalNumber(const UFormattedNumber*, char*, int32_t, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | UFormattedNumberRange* unumrf_openResult(UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | UNumberRangeFormatter* unumrf_openForSkeletonWithCollapseAndIdentityFallback(const UChar*, int32_t, UNumberRangeCollapse, UNumberRangeIdentityFallback, const char*, UParseError*, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | UNumberRangeIdentityResult unumrf_resultGetIdentityResult(const UFormattedNumberRange*, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | const UFormattedValue* unumrf_resultAsValue(const UFormattedNumberRange*, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | int32_t unumrf_resultGetFirstDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | int32_t unumrf_resultGetSecondDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | void unumrf_close(UNumberRangeFormatter*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | void unumrf_closeResult(UFormattedNumberRange*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | void unumrf_formatDecimalRange(const UNumberRangeFormatter*, const char*, int32_t, const char*, int32_t, UFormattedNumberRange*, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | void unumrf_formatDoubleRange(const UNumberRangeFormatter*, double, double, UFormattedNumberRange*, UErrorCode*) | (missing) | DraftICU 68 -| upluralrules.h | int32_t uplrules_selectForRange(const UPluralRules*, const struct UFormattedNumberRange*, UChar*, int32_t, UErrorCode*) | (missing) | DraftICU 68 - -## Other - -Other existing drafts in ICU 68 - -| File | API | ICU 67 | ICU 68 | -|---|---|---|---| -| bytestream.h | void icu::ByteSink::AppendU8(const char*, int32_t) | DraftICU 67 | -| bytestream.h | void icu::ByteSink::AppendU8(const char8_t*, int32_t) | DraftICU 67 | -| dtptngen.h | UDateFormatHourCycle icu::DateTimePatternGenerator::getDefaultHourCycle(UErrorCode&) const | DraftICU 67 | -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setDirection(ULocMatchDirection) | DraftICU 67 | -| localematcher.h | enum ULocMatchDirection::ULOCMATCH_DIRECTION_ONLY_TWO_WAY | DraftICU 67 | -| localematcher.h | enum ULocMatchDirection::ULOCMATCH_DIRECTION_WITH_ONE_WAY | DraftICU 67 | -| locid.h | void icu::Locale::canonicalize(UErrorCode&) | DraftICU 67 | -| measfmt.h | void icu::MeasureFormat::parseObject(const UnicodeString&, Formattable&, ParsePosition&) const | DraftICU 53 | -| measunit.h | MeasureUnit icu::MeasureUnit::product(const MeasureUnit&, UErrorCode&) const | DraftICU 67 | -| measunit.h | MeasureUnit icu::MeasureUnit::reciprocal(UErrorCode&) const | DraftICU 67 | -| measunit.h | MeasureUnit icu::MeasureUnit::withDimensionality(int32_t, UErrorCode&) const | DraftICU 67 | -| measunit.h | MeasureUnit icu::MeasureUnit::withSIPrefix(UMeasureSIPrefix, UErrorCode&) const | DraftICU 67 | -| measunit.h | MeasureUnit& icu::MeasureUnit::operator=(MeasureUnit&&) noexcept | DraftICU 67 | -| measunit.h | UMeasureSIPrefix icu::MeasureUnit::getSIPrefix(UErrorCode&) const | DraftICU 67 | -| measunit.h | UMeasureUnitComplexity icu::MeasureUnit::getComplexity(UErrorCode&) const | DraftICU 67 | -| measunit.h | const char* icu::MeasureUnit::getIdentifier() const | DraftICU 67 | -| measunit.h | icu::MeasureUnit::MeasureUnit(MeasureUnit&&) noexcept | DraftICU 67 | -| measunit.h | int32_t icu::MeasureUnit::getDimensionality(UErrorCode&) const | DraftICU 67 | -| measunit.h | static MeasureUnit icu::MeasureUnit::forIdentifier(StringPiece, UErrorCode&) | DraftICU 67 | -| stringpiece.h | icu::StringPiece::StringPiece(const char8_t*) | DraftICU 67 | -| stringpiece.h | icu::StringPiece::StringPiece(const char8_t*, int32_t) | DraftICU 67 | -| stringpiece.h | icu::StringPiece::StringPiece(const std::u8string&) | DraftICU 67 | -| stringpiece.h | icu::StringPiece::StringPiece(std::nullptr_t) | DraftICU 67 | -| stringpiece.h | int32_t icu::StringPiece::compare(StringPiece) | DraftICU 67 | -| stringpiece.h | int32_t icu::StringPiece::find(StringPiece, int32_t) | DraftICU 67 | -| stringpiece.h | void icu::StringPiece::set(const char8_t*) | DraftICU 67 | -| stringpiece.h | void icu::StringPiece::set(const char8_t*, int32_t) | DraftICU 67 | -| udat.h | enum UDateFormatHourCycle::UDAT_HOUR_CYCLE_11 | DraftICU 67 | -| udat.h | enum UDateFormatHourCycle::UDAT_HOUR_CYCLE_12 | DraftICU 67 | -| udat.h | enum UDateFormatHourCycle::UDAT_HOUR_CYCLE_23 | DraftICU 67 | -| udat.h | enum UDateFormatHourCycle::UDAT_HOUR_CYCLE_24 | DraftICU 67 | -| udateintervalformat.h | void udtitvfmt_formatCalendarToResult(const UDateIntervalFormat*, UCalendar*, UCalendar*, UFormattedDateInterval*, UErrorCode*) | DraftICU 67 | -| udateintervalformat.h | void udtitvfmt_formatToResult(const UDateIntervalFormat*, UDate, UDate, UFormattedDateInterval*, UErrorCode*) | DraftICU 67 | -| udatpg.h | UDateFormatHourCycle udatpg_getDefaultHourCycle(const UDateTimePatternGenerator*, UErrorCode*) | DraftICU 67 | -| uregex.h | enum URegexpFlag::UREGEX_CANON_EQ | DraftICU 2.4 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_CREATE_BREAK_ENGINE | DraftICU 67 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_CREATE_CHARACTER | DraftICU 67 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_CREATE_LINE | DraftICU 67 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_CREATE_SENTENCE | DraftICU 67 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_CREATE_TITLE | DraftICU 67 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_CREATE_WORD | DraftICU 67 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_START | DraftICU 67 | - -## Simplifications - -This section shows cases where the signature was "simplified" for the sake of comparison. The simplified form is in bold, followed by - all possible variations in "original" form. - - -## Colophon - -Contents generated by StableAPI tool on Fri Oct 23 11:32:42 PDT 2020 - -Copyright © 2019 and later: Unicode, Inc. and others. -License & terms of use: http://www.unicode.org/copyright.html - \ No newline at end of file diff --git a/thirdparty/icu4c/common/bytestriebuilder.cpp b/thirdparty/icu4c/common/bytestriebuilder.cpp index ec1ab7d8f50..28256f272a7 100644 --- a/thirdparty/icu4c/common/bytestriebuilder.cpp +++ b/thirdparty/icu4c/common/bytestriebuilder.cpp @@ -474,31 +474,39 @@ BytesTrieBuilder::writeDeltaTo(int32_t jumpTarget) { U_ASSERT(i>=0); if(i<=BytesTrie::kMaxOneByteDelta) { return write(i); + } else { + char intBytes[5]; + return write(intBytes, internalEncodeDelta(i, intBytes)); } - char intBytes[5]; - int32_t length; +} + +int32_t +BytesTrieBuilder::internalEncodeDelta(int32_t i, char intBytes[]) { + U_ASSERT(i>=0); + if(i<=BytesTrie::kMaxOneByteDelta) { + intBytes[0]=(char)i; + return 1; + } + int32_t length=1; if(i<=BytesTrie::kMaxTwoByteDelta) { intBytes[0]=(char)(BytesTrie::kMinTwoByteDeltaLead+(i>>8)); - length=1; } else { if(i<=BytesTrie::kMaxThreeByteDelta) { intBytes[0]=(char)(BytesTrie::kMinThreeByteDeltaLead+(i>>16)); - length=2; } else { if(i<=0xffffff) { intBytes[0]=(char)BytesTrie::kFourByteDeltaLead; - length=3; } else { intBytes[0]=(char)BytesTrie::kFiveByteDeltaLead; intBytes[1]=(char)(i>>24); - length=4; + length=2; } - intBytes[1]=(char)(i>>16); + intBytes[length++]=(char)(i>>16); } - intBytes[1]=(char)(i>>8); + intBytes[length++]=(char)(i>>8); } intBytes[length++]=(char)i; - return write(intBytes, length); + return length; } U_NAMESPACE_END diff --git a/thirdparty/icu4c/common/charstr.cpp b/thirdparty/icu4c/common/charstr.cpp index 318a185b3f1..c35622882c4 100644 --- a/thirdparty/icu4c/common/charstr.cpp +++ b/thirdparty/icu4c/common/charstr.cpp @@ -14,6 +14,8 @@ * created by: Markus W. Scherer */ +#include + #include "unicode/utypes.h" #include "unicode/putil.h" #include "charstr.h" @@ -141,6 +143,38 @@ CharString &CharString::append(const char *s, int32_t sLength, UErrorCode &error return *this; } +CharString &CharString::appendNumber(int32_t number, UErrorCode &status) { + if (number < 0) { + this->append('-', status); + if (U_FAILURE(status)) { + return *this; + } + } + + if (number == 0) { + this->append('0', status); + return *this; + } + + int32_t numLen = 0; + while (number != 0) { + int32_t residue = number % 10; + number /= 10; + this->append(std::abs(residue) + '0', status); + numLen++; + if (U_FAILURE(status)) { + return *this; + } + } + + int32_t start = this->length() - numLen, end = this->length() - 1; + while(start < end) { + std::swap(this->data()[start++], this->data()[end--]); + } + + return *this; +} + char *CharString::getAppendBuffer(int32_t minCapacity, int32_t desiredCapacityHint, int32_t &resultCapacity, diff --git a/thirdparty/icu4c/common/charstr.h b/thirdparty/icu4c/common/charstr.h index 6619faac618..175acd1c0a2 100644 --- a/thirdparty/icu4c/common/charstr.h +++ b/thirdparty/icu4c/common/charstr.h @@ -127,6 +127,9 @@ public: return append(s.data(), s.length(), errorCode); } CharString &append(const char *s, int32_t sLength, UErrorCode &status); + + CharString &appendNumber(int32_t number, UErrorCode &status); + /** * Returns a writable buffer for appending and writes the buffer's capacity to * resultCapacity. Guarantees resultCapacity>=minCapacity if U_SUCCESS(). diff --git a/thirdparty/icu4c/common/cmemory.h b/thirdparty/icu4c/common/cmemory.h index a9d9424b4e2..f03b7dcce6b 100644 --- a/thirdparty/icu4c/common/cmemory.h +++ b/thirdparty/icu4c/common/cmemory.h @@ -31,14 +31,63 @@ #include #include #include "unicode/localpointer.h" +#include "uassert.h" #if U_DEBUG && defined(UPRV_MALLOC_COUNT) #include #endif - -#define uprv_memcpy(dst, src, size) U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size) -#define uprv_memmove(dst, src, size) U_STANDARD_CPP_NAMESPACE memmove(dst, src, size) +// uprv_memcpy and uprv_memmove +#if defined(__clang__) +#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \ + /* Suppress warnings about addresses that will never be NULL */ \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Waddress\"") \ + U_ASSERT(dst != NULL); \ + U_ASSERT(src != NULL); \ + _Pragma("clang diagnostic pop") \ + U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \ +} UPRV_BLOCK_MACRO_END +#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \ + /* Suppress warnings about addresses that will never be NULL */ \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Waddress\"") \ + U_ASSERT(dst != NULL); \ + U_ASSERT(src != NULL); \ + _Pragma("clang diagnostic pop") \ + U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \ +} UPRV_BLOCK_MACRO_END +#elif defined(__GNUC__) +#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \ + /* Suppress warnings about addresses that will never be NULL */ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Waddress\"") \ + U_ASSERT(dst != NULL); \ + U_ASSERT(src != NULL); \ + _Pragma("GCC diagnostic pop") \ + U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \ +} UPRV_BLOCK_MACRO_END +#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \ + /* Suppress warnings about addresses that will never be NULL */ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Waddress\"") \ + U_ASSERT(dst != NULL); \ + U_ASSERT(src != NULL); \ + _Pragma("GCC diagnostic pop") \ + U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \ +} UPRV_BLOCK_MACRO_END +#else +#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \ + U_ASSERT(dst != NULL); \ + U_ASSERT(src != NULL); \ + U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \ +} UPRV_BLOCK_MACRO_END +#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \ + U_ASSERT(dst != NULL); \ + U_ASSERT(src != NULL); \ + U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \ +} UPRV_BLOCK_MACRO_END +#endif /** * \def UPRV_LENGTHOF diff --git a/thirdparty/icu4c/common/dictbe.cpp b/thirdparty/icu4c/common/dictbe.cpp index b42cdf03fae..44285755f3f 100644 --- a/thirdparty/icu4c/common/dictbe.cpp +++ b/thirdparty/icu4c/common/dictbe.cpp @@ -265,13 +265,9 @@ ThaiBreakEngine::divideUpDictionaryRange( UText *text, goto foundBest; } do { - int32_t wordsMatched = 1; if (words[(wordsFound + 1) % THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) { - if (wordsMatched < 2) { - // Followed by another dictionary word; mark first word as a good candidate - words[wordsFound%THAI_LOOKAHEAD].markCurrent(); - wordsMatched = 2; - } + // Followed by another dictionary word; mark first word as a good candidate + words[wordsFound%THAI_LOOKAHEAD].markCurrent(); // If we're already at the end of the range, we're done if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { @@ -503,13 +499,9 @@ LaoBreakEngine::divideUpDictionaryRange( UText *text, goto foundBest; } do { - int32_t wordsMatched = 1; if (words[(wordsFound + 1) % LAO_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) { - if (wordsMatched < 2) { - // Followed by another dictionary word; mark first word as a good candidate - words[wordsFound%LAO_LOOKAHEAD].markCurrent(); - wordsMatched = 2; - } + // Followed by another dictionary word; mark first word as a good candidate + words[wordsFound%LAO_LOOKAHEAD].markCurrent(); // If we're already at the end of the range, we're done if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { @@ -699,13 +691,9 @@ BurmeseBreakEngine::divideUpDictionaryRange( UText *text, goto foundBest; } do { - int32_t wordsMatched = 1; if (words[(wordsFound + 1) % BURMESE_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) { - if (wordsMatched < 2) { - // Followed by another dictionary word; mark first word as a good candidate - words[wordsFound%BURMESE_LOOKAHEAD].markCurrent(); - wordsMatched = 2; - } + // Followed by another dictionary word; mark first word as a good candidate + words[wordsFound%BURMESE_LOOKAHEAD].markCurrent(); // If we're already at the end of the range, we're done if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { @@ -908,13 +896,9 @@ KhmerBreakEngine::divideUpDictionaryRange( UText *text, goto foundBest; } do { - int32_t wordsMatched = 1; if (words[(wordsFound + 1) % KHMER_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) { - if (wordsMatched < 2) { - // Followed by another dictionary word; mark first word as a good candidate - words[wordsFound % KHMER_LOOKAHEAD].markCurrent(); - wordsMatched = 2; - } + // Followed by another dictionary word; mark first word as a good candidate + words[wordsFound % KHMER_LOOKAHEAD].markCurrent(); // If we're already at the end of the range, we're done if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { diff --git a/thirdparty/icu4c/common/edits.cpp b/thirdparty/icu4c/common/edits.cpp index 95f0c19a728..92ca36fb5d0 100644 --- a/thirdparty/icu4c/common/edits.cpp +++ b/thirdparty/icu4c/common/edits.cpp @@ -86,6 +86,7 @@ Edits &Edits::moveArray(Edits &src) U_NOEXCEPT { } Edits &Edits::operator=(const Edits &other) { + if (this == &other) { return *this; } // self-assignment: no-op length = other.length; delta = other.delta; numChanges = other.numChanges; diff --git a/thirdparty/icu4c/common/filteredbrk.cpp b/thirdparty/icu4c/common/filteredbrk.cpp index c07128cbce1..25080f9d33a 100644 --- a/thirdparty/icu4c/common/filteredbrk.cpp +++ b/thirdparty/icu4c/common/filteredbrk.cpp @@ -20,6 +20,7 @@ #include "ubrkimpl.h" // U_ICUDATA_BRKITR #include "uvector.h" #include "cmemory.h" +#include "umutex.h" U_NAMESPACE_BEGIN @@ -139,13 +140,30 @@ class SimpleFilteredSentenceBreakData : public UMemory { public: SimpleFilteredSentenceBreakData(UCharsTrie *forwards, UCharsTrie *backwards ) : fForwardsPartialTrie(forwards), fBackwardsTrie(backwards), refcount(1) { } - SimpleFilteredSentenceBreakData *incr() { refcount++; return this; } - SimpleFilteredSentenceBreakData *decr() { if((--refcount) <= 0) delete this; return 0; } - virtual ~SimpleFilteredSentenceBreakData(); + SimpleFilteredSentenceBreakData *incr() { + umtx_atomic_inc(&refcount); + return this; + } + SimpleFilteredSentenceBreakData *decr() { + if(umtx_atomic_dec(&refcount) <= 0) { + delete this; + } + return 0; + } + virtual ~SimpleFilteredSentenceBreakData(); - LocalPointer fForwardsPartialTrie; // Has ".a" for "a.M." - LocalPointer fBackwardsTrie; // i.e. ".srM" for Mrs. - int32_t refcount; + bool hasForwardsPartialTrie() const { return fForwardsPartialTrie.isValid(); } + bool hasBackwardsTrie() const { return fBackwardsTrie.isValid(); } + + const UCharsTrie &getForwardsPartialTrie() const { return *fForwardsPartialTrie; } + const UCharsTrie &getBackwardsTrie() const { return *fBackwardsTrie; } + +private: + // These tries own their data arrays. + // They are shared and must therefore not be modified. + LocalPointer fForwardsPartialTrie; // Has ".a" for "a.M." + LocalPointer fBackwardsTrie; // i.e. ".srM" for Mrs. + u_atomic_int32_t refcount; }; SimpleFilteredSentenceBreakData::~SimpleFilteredSentenceBreakData() {} @@ -244,7 +262,13 @@ SimpleFilteredSentenceBreakIterator::SimpleFilteredSentenceBreakIterator(BreakIt fData(new SimpleFilteredSentenceBreakData(forwards, backwards)), fDelegate(adopt) { - // all set.. + if (fData == nullptr) { + delete forwards; + delete backwards; + if (U_SUCCESS(status)) { + status = U_MEMORY_ALLOCATION_ERROR; + } + } } SimpleFilteredSentenceBreakIterator::~SimpleFilteredSentenceBreakIterator() { @@ -261,59 +285,62 @@ SimpleFilteredSentenceBreakIterator::breakExceptionAt(int32_t n) { int32_t bestValue = -1; // loops while 'n' points to an exception. utext_setNativeIndex(fText.getAlias(), n); // from n.. - fData->fBackwardsTrie->reset(); - UChar32 uch; //if(debug2) u_printf(" n@ %d\n", n); // Assume a space is following the '.' (so we handle the case: "Mr. /Brown") - if((uch=utext_previous32(fText.getAlias()))==(UChar32)0x0020) { // TODO: skip a class of chars here?? + if(utext_previous32(fText.getAlias())==u' ') { // TODO: skip a class of chars here?? // TODO only do this the 1st time? //if(debug2) u_printf("skipping prev: |%C| \n", (UChar)uch); } else { //if(debug2) u_printf("not skipping prev: |%C| \n", (UChar)uch); - uch = utext_next32(fText.getAlias()); + utext_next32(fText.getAlias()); //if(debug2) u_printf(" -> : |%C| \n", (UChar)uch); } - UStringTrieResult r = USTRINGTRIE_INTERMEDIATE_VALUE; - - while((uch=utext_previous32(fText.getAlias()))!=U_SENTINEL && // more to consume backwards and.. - USTRINGTRIE_HAS_NEXT(r=fData->fBackwardsTrie->nextForCodePoint(uch))) {// more in the trie - if(USTRINGTRIE_HAS_VALUE(r)) { // remember the best match so far - bestPosn = utext_getNativeIndex(fText.getAlias()); - bestValue = fData->fBackwardsTrie->getValue(); - } - //if(debug2) u_printf("rev< /%C/ cont?%d @%d\n", (UChar)uch, r, utext_getNativeIndex(fText.getAlias())); + { + // Do not modify the shared trie! + UCharsTrie iter(fData->getBackwardsTrie()); + UChar32 uch; + while((uch=utext_previous32(fText.getAlias()))!=U_SENTINEL) { // more to consume backwards + UStringTrieResult r = iter.nextForCodePoint(uch); + if(USTRINGTRIE_HAS_VALUE(r)) { // remember the best match so far + bestPosn = utext_getNativeIndex(fText.getAlias()); + bestValue = iter.getValue(); + } + if(!USTRINGTRIE_HAS_NEXT(r)) { + break; + } + //if(debug2) u_printf("rev< /%C/ cont?%d @%d\n", (UChar)uch, r, utext_getNativeIndex(fText.getAlias())); + } } - if(USTRINGTRIE_MATCHES(r)) { // exact match? - //if(debug2) u_printf("revfBackwardsTrie->getValue(); - bestPosn = utext_getNativeIndex(fText.getAlias()); - //if(debug2) u_printf("rev<+/%C/+end of seq.. r=%d, bestPosn=%d, bestValue=%d\n", (UChar)uch, r, bestPosn, bestValue); - } + //if(bestValue >= 0) { + //if(debug2) u_printf("rev<+/%C/+end of seq.. r=%d, bestPosn=%d, bestValue=%d\n", (UChar)uch, r, bestPosn, bestValue); + //} if(bestPosn>=0) { //if(debug2) u_printf("rev< /%C/ end of seq.. r=%d, bestPosn=%d, bestValue=%d\n", (UChar)uch, r, bestPosn, bestValue); //if(USTRINGTRIE_MATCHES(r)) { // matched - so, now what? - //int32_t bestValue = fBackwardsTrie->getValue(); + //int32_t bestValue = iter.getValue(); ////if(debug2) u_printf("rev< /%C/ matched, skip..%d bestValue=%d\n", (UChar)uch, r, bestValue); if(bestValue == kMATCH) { // exact match! //if(debug2) u_printf(" exact backward match\n"); return kExceptionHere; // See if the next is another exception. } else if(bestValue == kPARTIAL - && fData->fForwardsPartialTrie.isValid()) { // make sure there's a forward trie + && fData->hasForwardsPartialTrie()) { // make sure there's a forward trie //if(debug2) u_printf(" partial backward match\n"); // We matched the "Ph." in "Ph.D." - now we need to run everything through the forwards trie // to see if it matches something going forward. - fData->fForwardsPartialTrie->reset(); UStringTrieResult rfwd = USTRINGTRIE_INTERMEDIATE_VALUE; utext_setNativeIndex(fText.getAlias(), bestPosn); // hope that's close .. //if(debug2) u_printf("Retrying at %d\n", bestPosn); + // Do not modify the shared trie! + UCharsTrie iter(fData->getForwardsPartialTrie()); + UChar32 uch; while((uch=utext_next32(fText.getAlias()))!=U_SENTINEL && - USTRINGTRIE_HAS_NEXT(rfwd=fData->fForwardsPartialTrie->nextForCodePoint(uch))) { + USTRINGTRIE_HAS_NEXT(rfwd=iter.nextForCodePoint(uch))) { //if(debug2) u_printf("fwd> /%C/ cont?%d @%d\n", (UChar)uch, rfwd, utext_getNativeIndex(fText.getAlias())); } if(USTRINGTRIE_MATCHES(rfwd)) { @@ -339,7 +366,7 @@ SimpleFilteredSentenceBreakIterator::breakExceptionAt(int32_t n) { int32_t SimpleFilteredSentenceBreakIterator::internalNext(int32_t n) { if(n == UBRK_DONE || // at end or - fData->fBackwardsTrie.isNull()) { // .. no backwards table loaded == no exceptions + !fData->hasBackwardsTrie()) { // .. no backwards table loaded == no exceptions return n; } // OK, do we need to break here? @@ -369,7 +396,7 @@ SimpleFilteredSentenceBreakIterator::internalNext(int32_t n) { int32_t SimpleFilteredSentenceBreakIterator::internalPrev(int32_t n) { if(n == 0 || n == UBRK_DONE || // at end or - fData->fBackwardsTrie.isNull()) { // .. no backwards table loaded == no exceptions + !fData->hasBackwardsTrie()) { // .. no backwards table loaded == no exceptions return n; } // OK, do we need to break here? @@ -420,7 +447,7 @@ SimpleFilteredSentenceBreakIterator::previous(void) { UBool SimpleFilteredSentenceBreakIterator::isBoundary(int32_t offset) { if (!fDelegate->isBoundary(offset)) return false; // no break to suppress - if (fData->fBackwardsTrie.isNull()) return true; // no data = no suppressions + if (!fData->hasBackwardsTrie()) return true; // no data = no suppressions UErrorCode status = U_ZERO_ERROR; resetState(status); diff --git a/thirdparty/icu4c/common/hash.h b/thirdparty/icu4c/common/hash.h index f02cb7087a5..b927ddb3c36 100644 --- a/thirdparty/icu4c/common/hash.h +++ b/thirdparty/icu4c/common/hash.h @@ -85,16 +85,22 @@ public: inline int32_t puti(const UnicodeString& key, int32_t value, UErrorCode& status); + inline int32_t putiAllowZero(const UnicodeString& key, int32_t value, UErrorCode& status); + inline void* get(const UnicodeString& key) const; inline int32_t geti(const UnicodeString& key) const; + inline int32_t getiAndFound(const UnicodeString& key, UBool &found) const; + inline void* remove(const UnicodeString& key); inline int32_t removei(const UnicodeString& key); inline void removeAll(void); + inline UBool containsKey(const UnicodeString& key) const; + inline const UHashElement* find(const UnicodeString& key) const; /** @@ -203,6 +209,11 @@ inline int32_t Hashtable::puti(const UnicodeString& key, int32_t value, UErrorCo return uhash_puti(hash, new UnicodeString(key), value, &status); } +inline int32_t Hashtable::putiAllowZero(const UnicodeString& key, int32_t value, + UErrorCode& status) { + return uhash_putiAllowZero(hash, new UnicodeString(key), value, &status); +} + inline void* Hashtable::get(const UnicodeString& key) const { return uhash_get(hash, &key); } @@ -211,6 +222,10 @@ inline int32_t Hashtable::geti(const UnicodeString& key) const { return uhash_geti(hash, &key); } +inline int32_t Hashtable::getiAndFound(const UnicodeString& key, UBool &found) const { + return uhash_getiAndFound(hash, &key, &found); +} + inline void* Hashtable::remove(const UnicodeString& key) { return uhash_remove(hash, &key); } @@ -219,6 +234,10 @@ inline int32_t Hashtable::removei(const UnicodeString& key) { return uhash_removei(hash, &key); } +inline UBool Hashtable::containsKey(const UnicodeString& key) const { + return uhash_containsKey(hash, &key); +} + inline const UHashElement* Hashtable::find(const UnicodeString& key) const { return uhash_find(hash, &key); } diff --git a/thirdparty/icu4c/common/localematcher.cpp b/thirdparty/icu4c/common/localematcher.cpp index 5795cbf87e6..132aee290e8 100644 --- a/thirdparty/icu4c/common/localematcher.cpp +++ b/thirdparty/icu4c/common/localematcher.cpp @@ -345,9 +345,8 @@ UBool compareLSRs(const UHashTok t1, const UHashTok t2) { int32_t LocaleMatcher::putIfAbsent(const LSR &lsr, int32_t i, int32_t suppLength, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return suppLength; } - int32_t index = uhash_geti(supportedLsrToIndex, &lsr); - if (index == 0) { - uhash_puti(supportedLsrToIndex, const_cast(&lsr), i + 1, &errorCode); + if (!uhash_containsKey(supportedLsrToIndex, &lsr)) { + uhash_putiAllowZero(supportedLsrToIndex, const_cast(&lsr), i, &errorCode); if (U_SUCCESS(errorCode)) { supportedLSRs[suppLength] = &lsr; supportedIndexes[suppLength++] = i; @@ -685,12 +684,11 @@ int32_t LocaleMatcher::getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remai int32_t bestSupportedLsrIndex = -1; for (int32_t bestShiftedDistance = LocaleDistance::shiftDistance(thresholdDistance);;) { // Quick check for exact maximized LSR. - // Returns suppIndex+1 where 0 means not found. if (supportedLsrToIndex != nullptr) { desiredLSR.setHashCode(); - int32_t index = uhash_geti(supportedLsrToIndex, &desiredLSR); - if (index != 0) { - int32_t suppIndex = index - 1; + UBool found = false; + int32_t suppIndex = uhash_getiAndFound(supportedLsrToIndex, &desiredLSR, &found); + if (found) { if (remainingIter != nullptr) { remainingIter->rememberCurrent(desiredIndex, errorCode); } diff --git a/thirdparty/icu4c/common/localeprioritylist.cpp b/thirdparty/icu4c/common/localeprioritylist.cpp index 8916b121be3..4455eedb75e 100644 --- a/thirdparty/icu4c/common/localeprioritylist.cpp +++ b/thirdparty/icu4c/common/localeprioritylist.cpp @@ -187,17 +187,18 @@ bool LocalePriorityList::add(const Locale &locale, int32_t weight, UErrorCode &e if (U_FAILURE(errorCode)) { return false; } } LocalPointer clone; - int32_t index = uhash_geti(map, &locale); - if (index != 0) { + UBool found = false; + int32_t index = uhash_getiAndFound(map, &locale, &found); + if (found) { // Duplicate: Remove the old item and append it anew. - LocaleAndWeight &lw = list->array[index - 1]; + LocaleAndWeight &lw = list->array[index]; clone.adoptInstead(lw.locale); lw.locale = nullptr; lw.weight = 0; ++numRemoved; } if (weight <= 0) { // do not add q=0 - if (index != 0) { + if (found) { // Not strictly necessary but cleaner. uhash_removei(map, &locale); } @@ -217,7 +218,7 @@ bool LocalePriorityList::add(const Locale &locale, int32_t weight, UErrorCode &e return false; } } - uhash_puti(map, clone.getAlias(), listLength + 1, &errorCode); + uhash_putiAllowZero(map, clone.getAlias(), listLength, &errorCode); if (U_FAILURE(errorCode)) { return false; } LocaleAndWeight &lw = list->array[listLength]; lw.locale = clone.orphan(); diff --git a/thirdparty/icu4c/common/locdispnames.cpp b/thirdparty/icu4c/common/locdispnames.cpp index 47c0667417c..96af3f9aa84 100644 --- a/thirdparty/icu4c/common/locdispnames.cpp +++ b/thirdparty/icu4c/common/locdispnames.cpp @@ -698,7 +698,7 @@ uloc_getDisplayName(const char *locale, } /* end switch */ if (len>0) { - /* we addeed a component, so add separator and write it if there's room. */ + /* we added a component, so add separator and write it if there's room. */ if(len+sepLen<=cap) { const UChar * plimit = p + len; for (; p < plimit; p++) { diff --git a/thirdparty/icu4c/common/locid.cpp b/thirdparty/icu4c/common/locid.cpp index 874e4a70556..0d506293a99 100644 --- a/thirdparty/icu4c/common/locid.cpp +++ b/thirdparty/icu4c/common/locid.cpp @@ -254,7 +254,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Locale) Locale::~Locale() { - if (baseName != fullName) { + if ((baseName != fullName) && (baseName != fullNameBuffer)) { uprv_free(baseName); } baseName = NULL; @@ -466,7 +466,7 @@ Locale& Locale::operator=(const Locale& other) { } Locale& Locale::operator=(Locale&& other) U_NOEXCEPT { - if (baseName != fullName) uprv_free(baseName); + if ((baseName != fullName) && (baseName != fullNameBuffer)) uprv_free(baseName); if (fullName != fullNameBuffer) uprv_free(fullName); if (other.fullName == other.fullNameBuffer) { @@ -524,7 +524,7 @@ static const char* const KNOWN_CANONICALIZED[] = { "km", "km_KH", "kn", "kn_IN", "ko", "ko_KR", "ky", "ky_KG", "lo", "lo_LA", "lt", "lt_LT", "lv", "lv_LV", "mk", "mk_MK", "ml", "ml_IN", "mn", "mn_MN", "mr", "mr_IN", "ms", "ms_MY", "my", "my_MM", "nb", "nb_NO", "ne", "ne_NP", - "nl", "nl_NL", "or", "or_IN", "pa", "pa_IN", "pl", "pl_PL", "ps", "ps_AF", + "nl", "nl_NL", "no", "or", "or_IN", "pa", "pa_IN", "pl", "pl_PL", "ps", "ps_AF", "pt", "pt_BR", "pt_PT", "ro", "ro_RO", "ru", "ru_RU", "sd", "sd_IN", "si", "si_LK", "sk", "sk_SK", "sl", "sl_SI", "so", "so_SO", "sq", "sq_AL", "sr", "sr_Cyrl_RS", "sr_Latn", "sr_RS", "sv", "sv_SE", "sw", "sw_TZ", "ta", @@ -627,6 +627,17 @@ private: LocalMemory& types, LocalMemory& replacementIndexes, int32_t &length, UErrorCode &status); + + // Read the subdivisionAlias data from alias to + // strings+types+replacementIndexes + // Allocate length items for types, to store the type field. + // Allocate length items for replacementIndexes, + // to store the index in the strings for the replacement variant. + void readSubdivisionAlias(UResourceBundle* alias, + UniqueCharStrings* strings, + LocalMemory& types, + LocalMemory& replacementIndexes, + int32_t &length, UErrorCode &status); }; /** @@ -647,6 +658,7 @@ public: const CharStringMap& scriptMap() const { return script; } const CharStringMap& territoryMap() const { return territory; } const CharStringMap& variantMap() const { return variant; } + const CharStringMap& subdivisionMap() const { return subdivision; } static void U_CALLCONV loadData(UErrorCode &status); static UBool U_CALLCONV cleanup(); @@ -658,11 +670,13 @@ private: CharStringMap scriptMap, CharStringMap territoryMap, CharStringMap variantMap, + CharStringMap subdivisionMap, CharString* strings) : language(std::move(languageMap)), script(std::move(scriptMap)), territory(std::move(territoryMap)), variant(std::move(variantMap)), + subdivision(std::move(subdivisionMap)), strings(strings) { } @@ -676,6 +690,7 @@ private: CharStringMap script; CharStringMap territory; CharStringMap variant; + CharStringMap subdivision; CharString* strings; friend class AliasDataBuilder; @@ -866,6 +881,34 @@ AliasDataBuilder::readVariantAlias( status); } +/** + * Read the subdivisionAlias data from alias to strings+types+replacementIndexes. + * Allocate length items for types, to store the type field. Allocate length + * items for replacementIndexes, to store the index in the strings for the + * replacement regions. + */ +void +AliasDataBuilder::readSubdivisionAlias( + UResourceBundle* alias, + UniqueCharStrings* strings, + LocalMemory& types, + LocalMemory& replacementIndexes, + int32_t &length, + UErrorCode &status) +{ + return readAlias( + alias, strings, types, replacementIndexes, length, +#if U_DEBUG + [](const char* type) { + U_ASSERT(uprv_strlen(type) >= 3 && uprv_strlen(type) <= 8); + }, +#else + [](const char*) {}, +#endif + [](const UnicodeString&) { }, + status); +} + /** * Initializes the alias data from the ICU resource bundles. The alias data * contains alias of language, country, script and variants. @@ -905,12 +948,14 @@ AliasDataBuilder::build(UErrorCode &status) { ures_getByKey(metadataAlias.getAlias(), "territory", nullptr, &status)); LocalUResourceBundlePointer variantAlias( ures_getByKey(metadataAlias.getAlias(), "variant", nullptr, &status)); + LocalUResourceBundlePointer subdivisionAlias( + ures_getByKey(metadataAlias.getAlias(), "subdivision", nullptr, &status)); if (U_FAILURE(status)) { return nullptr; } int32_t languagesLength = 0, scriptLength = 0, territoryLength = 0, - variantLength = 0; + variantLength = 0, subdivisionLength = 0; // Read the languageAlias into languageTypes, languageReplacementIndexes // and strings @@ -955,6 +1000,16 @@ AliasDataBuilder::build(UErrorCode &status) { variantReplacementIndexes, variantLength, status); + // Read the subdivisionAlias into subdivisionTypes, subdivisionReplacementIndexes + // and strings + LocalMemory subdivisionTypes; + LocalMemory subdivisionReplacementIndexes; + readSubdivisionAlias(subdivisionAlias.getAlias(), + &strings, + subdivisionTypes, + subdivisionReplacementIndexes, + subdivisionLength, status); + if (U_FAILURE(status)) { return nullptr; } @@ -994,6 +1049,14 @@ AliasDataBuilder::build(UErrorCode &status) { status); } + // Build the subdivisionMap from subdivisionTypes & subdivisionReplacementIndexes. + CharStringMap subdivisionMap(2, status); + for (int32_t i = 0; U_SUCCESS(status) && i < subdivisionLength; i++) { + subdivisionMap.put(subdivisionTypes[i], + strings.get(subdivisionReplacementIndexes[i]), + status); + } + if (U_FAILURE(status)) { return nullptr; } @@ -1004,6 +1067,7 @@ AliasDataBuilder::build(UErrorCode &status) { std::move(scriptMap), std::move(territoryMap), std::move(variantMap), + std::move(subdivisionMap), strings.orphanCharStrings()); if (data == nullptr) { @@ -1105,6 +1169,14 @@ private: // Replace by using variantAlias. bool replaceVariant(UErrorCode& status); + + // Replace by using subdivisionAlias. + bool replaceSubdivision(StringPiece subdivision, + CharString& output, UErrorCode& status); + + // Replace transformed extensions. + bool replaceTransformedExtensions( + CharString& transformedExtensions, CharString& output, UErrorCode& status); }; CharString& @@ -1294,7 +1366,6 @@ AliasReplacer::replaceLanguage( } } if (replacedExtensions != nullptr) { - // TODO(ICU-21292) // DO NOTHING // UTS35 does not specifiy what should we do if we have extensions in the // replacement. Currently we know only the following 4 "BCP47 LegacyRules" have @@ -1435,6 +1506,106 @@ AliasReplacer::replaceVariant(UErrorCode& status) return false; } +bool +AliasReplacer::replaceSubdivision( + StringPiece subdivision, CharString& output, UErrorCode& status) +{ + if (U_FAILURE(status)) { + return false; + } + const char *replacement = data->subdivisionMap().get(subdivision.data()); + if (replacement != nullptr) { + const char* firstSpace = uprv_strchr(replacement, ' '); + // Found replacement data for this subdivision. + size_t len = (firstSpace != nullptr) ? + (firstSpace - replacement) : uprv_strlen(replacement); + if (2 <= len && len <= 8) { + output.append(replacement, (int32_t)len, status); + if (2 == len) { + // Add 'zzzz' based on changes to UTS #35 for CLDR-14312. + output.append("zzzz", 4, status); + } + } + return true; + } + return false; +} + +bool +AliasReplacer::replaceTransformedExtensions( + CharString& transformedExtensions, CharString& output, UErrorCode& status) +{ + // The content of the transformedExtensions will be modified in this + // function to NULL-terminating (tkey-tvalue) pairs. + if (U_FAILURE(status)) { + return false; + } + int32_t len = transformedExtensions.length(); + const char* str = transformedExtensions.data(); + const char* tkey = ultag_getTKeyStart(str); + int32_t tlangLen = (tkey == str) ? 0 : + ((tkey == nullptr) ? len : static_cast((tkey - str - 1))); + CharStringByteSink sink(&output); + if (tlangLen > 0) { + Locale tlang = LocaleBuilder() + .setLanguageTag(StringPiece(str, tlangLen)) + .build(status); + tlang.canonicalize(status); + tlang.toLanguageTag(sink, status); + if (U_FAILURE(status)) { + return false; + } + T_CString_toLowerCase(output.data()); + } + if (tkey != nullptr) { + // We need to sort the tfields by tkey + UVector tfields(status); + if (U_FAILURE(status)) { + return false; + } + do { + const char* tvalue = uprv_strchr(tkey, '-'); + if (tvalue == nullptr) { + status = U_ILLEGAL_ARGUMENT_ERROR; + } + const char* nextTKey = ultag_getTKeyStart(tvalue); + if (nextTKey != nullptr) { + *((char*)(nextTKey-1)) = '\0'; // NULL terminate tvalue + } + tfields.insertElementAt((void*)tkey, tfields.size(), status); + if (U_FAILURE(status)) { + return false; + } + tkey = nextTKey; + } while (tkey != nullptr); + tfields.sort([](UElement e1, UElement e2) -> int8_t { + // uprv_strcmp return int and in some platform, such as arm64-v8a, + // it may return positive values > 127 which cause the casted value + // of int8_t negative. + int res = uprv_strcmp( + (const char*)e1.pointer, (const char*)e2.pointer); + return (res == 0) ? 0 : ((res > 0) ? 1 : -1); + }, status); + for (int32_t i = 0; i < tfields.size(); i++) { + if (output.length() > 0) { + output.append('-', status); + } + const char* tfield = (const char*) tfields.elementAt(i); + const char* tvalue = uprv_strchr(tfield, '-'); + // Split the "tkey-tvalue" pair string so that we can canonicalize the tvalue. + U_ASSERT(tvalue != nullptr); + *((char*)tvalue++) = '\0'; // NULL terminate tkey + output.append(tfield, status).append('-', status); + const char* bcpTValue = ulocimp_toBcpType(tfield, tvalue, nullptr, nullptr); + output.append((bcpTValue == nullptr) ? tvalue : bcpTValue, status); + } + } + if (U_FAILURE(status)) { + return false; + } + return true; +} + CharString& AliasReplacer::outputToString( CharString& out, UErrorCode status) @@ -1453,8 +1624,12 @@ AliasReplacer::outputToString( out.append(SEP_CHAR, status); } variants.sort([](UElement e1, UElement e2) -> int8_t { - return uprv_strcmp( + // uprv_strcmp return int and in some platform, such as arm64-v8a, + // it may return positive values > 127 which cause the casted value + // of int8_t negative. + int res = uprv_strcmp( (const char*)e1.pointer, (const char*)e2.pointer); + return (res == 0) ? 0 : ((res > 0) ? 1 : -1); }, status); int32_t variantsStart = out.length(); for (int32_t i = 0; i < variants.size(); i++) { @@ -1497,7 +1672,6 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status region = nullptr; } const char* variantsStr = locale.getVariant(); - const char* extensionsStr = locale_getKeywordsStart(locale.getName()); CharString variantsBuff(variantsStr, -1, status); if (!variantsBuff.isEmpty()) { if (U_FAILURE(status)) { return false; } @@ -1516,8 +1690,12 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status // Sort the variants variants.sort([](UElement e1, UElement e2) -> int8_t { - return uprv_strcmp( + // uprv_strcmp return int and in some platform, such as arm64-v8a, + // it may return positive values > 127 which cause the casted value + // of int8_t negative. + int res = uprv_strcmp( (const char*)e1.pointer, (const char*)e2.pointer); + return (res == 0) ? 0 : ((res > 0) ? 1 : -1); }, status); // A changed count to assert when loop too many times. @@ -1561,11 +1739,52 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status if (U_FAILURE(status)) { return false; } // Nothing changed and we know the order of the vaiants are not change // because we have no variant or only one. - if (changed == 0 && variants.size() <= 1) { + const char* extensionsStr = locale_getKeywordsStart(locale.getName()); + if (changed == 0 && variants.size() <= 1 && extensionsStr == nullptr) { return false; } outputToString(out, status); + if (U_FAILURE(status)) { + return false; + } if (extensionsStr != nullptr) { + changed = 0; + Locale temp(locale); + LocalPointer iter(locale.createKeywords(status)); + if (U_SUCCESS(status) && !iter.isNull()) { + const char* key; + while ((key = iter->next(nullptr, status)) != nullptr) { + if (uprv_strcmp("sd", key) == 0 || uprv_strcmp("rg", key) == 0 || + uprv_strcmp("t", key) == 0) { + CharString value; + CharStringByteSink valueSink(&value); + locale.getKeywordValue(key, valueSink, status); + if (U_FAILURE(status)) { + status = U_ZERO_ERROR; + continue; + } + CharString replacement; + if (uprv_strlen(key) == 2) { + if (replaceSubdivision(value.toStringPiece(), replacement, status)) { + changed++; + temp.setKeywordValue(key, replacement.data(), status); + } + } else { + U_ASSERT(uprv_strcmp(key, "t") == 0); + if (replaceTransformedExtensions(value, replacement, status)) { + changed++; + temp.setKeywordValue(key, replacement.data(), status); + } + } + if (U_FAILURE(status)) { + return false; + } + } + } + } + if (changed != 0) { + extensionsStr = locale_getKeywordsStart(temp.getName()); + } out.append(extensionsStr, status); } if (U_FAILURE(status)) { @@ -1573,8 +1792,6 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status } // If the tag is not changed, return. if (uprv_strcmp(out.data(), locale.getName()) == 0) { - U_ASSERT(changed == 0); - U_ASSERT(variants.size() > 1); out.clear(); return false; } @@ -1636,7 +1853,7 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) { fIsBogus = FALSE; /* Free our current storage */ - if (baseName != fullName) { + if ((baseName != fullName) && (baseName != fullNameBuffer)) { uprv_free(baseName); } baseName = NULL; @@ -1672,6 +1889,7 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) uloc_getName(localeID, fullName, sizeof(fullNameBuffer), &err); if(err == U_BUFFER_OVERFLOW_ERROR || length >= (int32_t)sizeof(fullNameBuffer)) { + U_ASSERT(baseName == nullptr); /*Go to heap for the fullName if necessary*/ fullName = (char *)uprv_malloc(sizeof(char)*(length + 1)); if(fullName == 0) { @@ -1825,7 +2043,7 @@ Locale::hashCode() const void Locale::setToBogus() { /* Free our current storage */ - if(baseName != fullName) { + if((baseName != fullName) && (baseName != fullNameBuffer)) { uprv_free(baseName); } baseName = NULL; diff --git a/thirdparty/icu4c/common/loclikelysubtags.cpp b/thirdparty/icu4c/common/loclikelysubtags.cpp index a031bfa5872..aa592e6ea80 100644 --- a/thirdparty/icu4c/common/loclikelysubtags.cpp +++ b/thirdparty/icu4c/common/loclikelysubtags.cpp @@ -320,7 +320,8 @@ XLikelySubtags::~XLikelySubtags() { LSR XLikelySubtags::makeMaximizedLsrFrom(const Locale &locale, UErrorCode &errorCode) const { const char *name = locale.getName(); if (uprv_isAtSign(name[0]) && name[1] == 'x' && name[2] == '=') { // name.startsWith("@x=") - // Private use language tag x-subtag-subtag... + // Private use language tag x-subtag-subtag... which CLDR changes to + // und-x-subtag-subtag... return LSR(name, "", "", LSR::EXPLICIT_LSR); } return makeMaximizedLsr(locale.getLanguage(), locale.getScript(), locale.getCountry(), diff --git a/thirdparty/icu4c/common/norm2allmodes.h b/thirdparty/icu4c/common/norm2allmodes.h index e8bd52c6ae3..584835da57b 100644 --- a/thirdparty/icu4c/common/norm2allmodes.h +++ b/thirdparty/icu4c/common/norm2allmodes.h @@ -38,7 +38,7 @@ public: virtual UnicodeString & normalize(const UnicodeString &src, UnicodeString &dest, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { if(U_FAILURE(errorCode)) { dest.setToBogus(); return dest; @@ -64,13 +64,13 @@ public: virtual UnicodeString & normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { return normalizeSecondAndAppend(first, second, true, errorCode); } virtual UnicodeString & append(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { return normalizeSecondAndAppend(first, second, false, errorCode); } UnicodeString & @@ -107,7 +107,7 @@ public: UnicodeString &safeMiddle, ReorderingBuffer &buffer, UErrorCode &errorCode) const = 0; virtual UBool - getDecomposition(UChar32 c, UnicodeString &decomposition) const { + getDecomposition(UChar32 c, UnicodeString &decomposition) const U_OVERRIDE { UChar buffer[4]; int32_t length; const UChar *d=impl.getDecomposition(c, buffer, length); @@ -122,7 +122,7 @@ public: return true; } virtual UBool - getRawDecomposition(UChar32 c, UnicodeString &decomposition) const { + getRawDecomposition(UChar32 c, UnicodeString &decomposition) const U_OVERRIDE { UChar buffer[30]; int32_t length; const UChar *d=impl.getRawDecomposition(c, buffer, length); @@ -137,18 +137,18 @@ public: return true; } virtual UChar32 - composePair(UChar32 a, UChar32 b) const { + composePair(UChar32 a, UChar32 b) const U_OVERRIDE { return impl.composePair(a, b); } virtual uint8_t - getCombiningClass(UChar32 c) const { + getCombiningClass(UChar32 c) const U_OVERRIDE { return impl.getCC(impl.getNorm16(c)); } // quick checks virtual UBool - isNormalized(const UnicodeString &s, UErrorCode &errorCode) const { + isNormalized(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE { if(U_FAILURE(errorCode)) { return false; } @@ -161,11 +161,11 @@ public: return sLimit==spanQuickCheckYes(sArray, sLimit, errorCode); } virtual UNormalizationCheckResult - quickCheck(const UnicodeString &s, UErrorCode &errorCode) const { + quickCheck(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE { return Normalizer2WithImpl::isNormalized(s, errorCode) ? UNORM_YES : UNORM_NO; } virtual int32_t - spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const { + spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE { if(U_FAILURE(errorCode)) { return 0; } @@ -194,27 +194,57 @@ public: private: virtual void normalize(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.decompose(src, limit, &buffer, errorCode); } using Normalizer2WithImpl::normalize; // Avoid warning about hiding base class function. virtual void normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize, UnicodeString &safeMiddle, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.decomposeAndAppend(src, limit, doNormalize, safeMiddle, buffer, errorCode); } + + void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const U_OVERRIDE { + if (U_FAILURE(errorCode)) { + return; + } + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + const uint8_t *s = reinterpret_cast(src.data()); + impl.decomposeUTF8(options, s, s + src.length(), &sink, edits, errorCode); + sink.Flush(); + } + virtual UBool + isNormalizedUTF8(StringPiece sp, UErrorCode &errorCode) const U_OVERRIDE { + if(U_FAILURE(errorCode)) { + return false; + } + const uint8_t *s = reinterpret_cast(sp.data()); + const uint8_t *sLimit = s + sp.length(); + return sLimit == impl.decomposeUTF8(0, s, sLimit, nullptr, nullptr, errorCode); + } + virtual const UChar * - spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const { + spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const U_OVERRIDE { return impl.decompose(src, limit, NULL, errorCode); } using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. - virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const { + virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const U_OVERRIDE { return impl.isDecompYes(impl.getNorm16(c)) ? UNORM_YES : UNORM_NO; } - virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasDecompBoundaryBefore(c); } - virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasDecompBoundaryAfter(c); } - virtual UBool isInert(UChar32 c) const { return impl.isDecompInert(c); } + virtual UBool hasBoundaryBefore(UChar32 c) const U_OVERRIDE { + return impl.hasDecompBoundaryBefore(c); + } + virtual UBool hasBoundaryAfter(UChar32 c) const U_OVERRIDE { + return impl.hasDecompBoundaryAfter(c); + } + virtual UBool isInert(UChar32 c) const U_OVERRIDE { + return impl.isDecompInert(c); + } }; class ComposeNormalizer2 : public Normalizer2WithImpl { @@ -321,24 +351,30 @@ public: private: virtual void normalize(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.makeFCD(src, limit, &buffer, errorCode); } using Normalizer2WithImpl::normalize; // Avoid warning about hiding base class function. virtual void normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize, UnicodeString &safeMiddle, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.makeFCDAndAppend(src, limit, doNormalize, safeMiddle, buffer, errorCode); } virtual const UChar * - spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const { + spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const U_OVERRIDE { return impl.makeFCD(src, limit, NULL, errorCode); } using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. - virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasFCDBoundaryBefore(c); } - virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasFCDBoundaryAfter(c); } - virtual UBool isInert(UChar32 c) const { return impl.isFCDInert(c); } + virtual UBool hasBoundaryBefore(UChar32 c) const U_OVERRIDE { + return impl.hasFCDBoundaryBefore(c); + } + virtual UBool hasBoundaryAfter(UChar32 c) const U_OVERRIDE { + return impl.hasFCDBoundaryAfter(c); + } + virtual UBool isInert(UChar32 c) const U_OVERRIDE { + return impl.isFCDInert(c); + } }; struct Norm2AllModes : public UMemory { diff --git a/thirdparty/icu4c/common/normalizer2impl.cpp b/thirdparty/icu4c/common/normalizer2impl.cpp index cbf6b4d9804..c0ad5c69f3e 100644 --- a/thirdparty/icu4c/common/normalizer2impl.cpp +++ b/thirdparty/icu4c/common/normalizer2impl.cpp @@ -731,9 +731,131 @@ UBool Normalizer2Impl::decompose(UChar32 c, uint16_t norm16, return buffer.append((const UChar *)mapping+1, length, TRUE, leadCC, trailCC, errorCode); } +// Dual functionality: +// sink != nullptr: normalize +// sink == nullptr: isNormalized/spanQuickCheckYes +const uint8_t * +Normalizer2Impl::decomposeUTF8(uint32_t options, + const uint8_t *src, const uint8_t *limit, + ByteSink *sink, Edits *edits, UErrorCode &errorCode) const { + U_ASSERT(limit != nullptr); + UnicodeString s16; + uint8_t minNoLead = leadByteForCP(minDecompNoCP); + + const uint8_t *prevBoundary = src; + // only for quick check + uint8_t prevCC = 0; + + for (;;) { + // Fast path: Scan over a sequence of characters below the minimum "no" code point, + // or with (decompYes && ccc==0) properties. + const uint8_t *fastStart = src; + const uint8_t *prevSrc; + uint16_t norm16 = 0; + + for (;;) { + if (src == limit) { + if (prevBoundary != limit && sink != nullptr) { + ByteSinkUtil::appendUnchanged(prevBoundary, limit, + *sink, options, edits, errorCode); + } + return src; + } + if (*src < minNoLead) { + ++src; + } else { + prevSrc = src; + UCPTRIE_FAST_U8_NEXT(normTrie, UCPTRIE_16, src, limit, norm16); + if (!isMostDecompYesAndZeroCC(norm16)) { + break; + } + } + } + // isMostDecompYesAndZeroCC(norm16) is false, that is, norm16>=minYesNo, + // and the current character at [prevSrc..src[ is not a common case with cc=0 + // (MIN_NORMAL_MAYBE_YES or JAMO_VT). + // It could still be a maybeYes with cc=0. + if (prevSrc != fastStart) { + // The fast path looped over yes/0 characters before the current one. + if (sink != nullptr && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + prevBoundary = prevSrc; + prevCC = 0; + } + + // Medium-fast path: Quick check. + if (isMaybeOrNonZeroCC(norm16)) { + // Does not decompose. + uint8_t cc = getCCFromYesOrMaybe(norm16); + if (prevCC <= cc || cc == 0) { + prevCC = cc; + if (cc <= 1) { + if (sink != nullptr && + !ByteSinkUtil::appendUnchanged(prevBoundary, src, + *sink, options, edits, errorCode)) { + break; + } + prevBoundary = src; + } + continue; + } + } + if (sink == nullptr) { + return prevBoundary; // quick check: "no" or cc out of order + } + + // Slow path + // Decompose up to and including the current character. + if (prevBoundary != prevSrc && norm16HasDecompBoundaryBefore(norm16)) { + if (!ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + prevBoundary = prevSrc; + } + ReorderingBuffer buffer(*this, s16, errorCode); + if (U_FAILURE(errorCode)) { + break; + } + decomposeShort(prevBoundary, src, STOP_AT_LIMIT, FALSE /* onlyContiguous */, + buffer, errorCode); + // Decompose until the next boundary. + if (buffer.getLastCC() > 1) { + src = decomposeShort(src, limit, STOP_AT_DECOMP_BOUNDARY, FALSE /* onlyContiguous */, + buffer, errorCode); + } + if (U_FAILURE(errorCode)) { + break; + } + if ((src - prevSrc) > INT32_MAX) { // guard before buffer.equals() + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + break; + } + // We already know there was a change if the original character decomposed; + // otherwise compare. + if (isMaybeOrNonZeroCC(norm16) && buffer.equals(prevBoundary, src)) { + if (!ByteSinkUtil::appendUnchanged(prevBoundary, src, + *sink, options, edits, errorCode)) { + break; + } + } else { + if (!ByteSinkUtil::appendChange(prevBoundary, src, buffer.getStart(), buffer.length(), + *sink, edits, errorCode)) { + break; + } + } + prevBoundary = src; + prevCC = 0; + } + return src; +} + const uint8_t * Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, - UBool stopAtCompBoundary, UBool onlyContiguous, + StopAt stopAt, UBool onlyContiguous, ReorderingBuffer &buffer, UErrorCode &errorCode) const { if (U_FAILURE(errorCode)) { return nullptr; @@ -746,21 +868,28 @@ Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, UChar32 c = U_SENTINEL; if (norm16 >= limitNoNo) { if (isMaybeOrNonZeroCC(norm16)) { - // No boundaries around this character. + // No comp boundaries around this character. + uint8_t cc = getCCFromYesOrMaybe(norm16); + if (cc == 0 && stopAt == STOP_AT_DECOMP_BOUNDARY) { + return prevSrc; + } c = codePointFromValidUTF8(prevSrc, src); - if (!buffer.append(c, getCCFromYesOrMaybe(norm16), errorCode)) { + if (!buffer.append(c, cc, errorCode)) { return nullptr; } + if (stopAt == STOP_AT_DECOMP_BOUNDARY && buffer.getLastCC() <= 1) { + return src; + } continue; } // Maps to an isCompYesAndZeroCC. - if (stopAtCompBoundary) { + if (stopAt != STOP_AT_LIMIT) { return prevSrc; } c = codePointFromValidUTF8(prevSrc, src); c = mapAlgorithmic(c, norm16); norm16 = getRawNorm16(c); - } else if (stopAtCompBoundary && norm16 < minNoNoCompNoMaybeCC) { + } else if (stopAt != STOP_AT_LIMIT && norm16 < minNoNoCompNoMaybeCC) { return prevSrc; } // norm16!=INERT guarantees that [prevSrc, src[ is valid UTF-8. @@ -768,7 +897,8 @@ Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, // its norm16==INERT is normalization-inert, // so it gets copied unchanged in the fast path, // and we stop the slow path where invalid UTF-8 begins. - U_ASSERT(norm16 != INERT); + // c >= 0 is the result of an algorithmic mapping. + U_ASSERT(c >= 0 || norm16 != INERT); if (norm16 < minYesNo) { if (c < 0) { c = codePointFromValidUTF8(prevSrc, src); @@ -798,11 +928,15 @@ Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, } else { leadCC = 0; } + if (leadCC == 0 && stopAt == STOP_AT_DECOMP_BOUNDARY) { + return prevSrc; + } if (!buffer.append((const char16_t *)mapping+1, length, TRUE, leadCC, trailCC, errorCode)) { return nullptr; } } - if (stopAtCompBoundary && norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + if ((stopAt == STOP_AT_COMP_BOUNDARY && norm16HasCompBoundaryAfter(norm16, onlyContiguous)) || + (stopAt == STOP_AT_DECOMP_BOUNDARY && buffer.getLastCC() <= 1)) { return src; } } @@ -1954,10 +2088,10 @@ Normalizer2Impl::composeUTF8(uint32_t options, UBool onlyContiguous, break; } // We know there is not a boundary here. - decomposeShort(prevSrc, src, FALSE /* !stopAtCompBoundary */, onlyContiguous, + decomposeShort(prevSrc, src, STOP_AT_LIMIT, onlyContiguous, buffer, errorCode); // Decompose until the next boundary. - src = decomposeShort(src, limit, TRUE /* stopAtCompBoundary */, onlyContiguous, + src = decomposeShort(src, limit, STOP_AT_COMP_BOUNDARY, onlyContiguous, buffer, errorCode); if (U_FAILURE(errorCode)) { break; diff --git a/thirdparty/icu4c/common/normalizer2impl.h b/thirdparty/icu4c/common/normalizer2impl.h index 4218a30a345..bdb6767a925 100644 --- a/thirdparty/icu4c/common/normalizer2impl.h +++ b/thirdparty/icu4c/common/normalizer2impl.h @@ -491,6 +491,12 @@ public: UnicodeString &safeMiddle, ReorderingBuffer &buffer, UErrorCode &errorCode) const; + + /** sink==nullptr: isNormalized()/spanQuickCheckYes() */ + const uint8_t *decomposeUTF8(uint32_t options, + const uint8_t *src, const uint8_t *limit, + ByteSink *sink, Edits *edits, UErrorCode &errorCode) const; + UBool compose(const UChar *src, const UChar *limit, UBool onlyContiguous, UBool doCompose, @@ -649,6 +655,9 @@ private: UChar32 minNeedDataCP, ReorderingBuffer *buffer, UErrorCode &errorCode) const; + + enum StopAt { STOP_AT_LIMIT, STOP_AT_DECOMP_BOUNDARY, STOP_AT_COMP_BOUNDARY }; + const UChar *decomposeShort(const UChar *src, const UChar *limit, UBool stopAtCompBoundary, UBool onlyContiguous, ReorderingBuffer &buffer, UErrorCode &errorCode) const; @@ -656,7 +665,7 @@ private: ReorderingBuffer &buffer, UErrorCode &errorCode) const; const uint8_t *decomposeShort(const uint8_t *src, const uint8_t *limit, - UBool stopAtCompBoundary, UBool onlyContiguous, + StopAt stopAt, UBool onlyContiguous, ReorderingBuffer &buffer, UErrorCode &errorCode) const; static int32_t combine(const uint16_t *list, UChar32 trail); diff --git a/thirdparty/icu4c/common/pluralmap.h b/thirdparty/icu4c/common/pluralmap.h index d898ac4671f..2a14a07af1f 100644 --- a/thirdparty/icu4c/common/pluralmap.h +++ b/thirdparty/icu4c/common/pluralmap.h @@ -24,7 +24,7 @@ class U_COMMON_API PluralMapBase : public UMemory { public: /** * The names of all the plural categories. NONE is not an actual plural - * category, but rather represents the absense of a plural category. + * category, but rather represents the absence of a plural category. */ enum Category { NONE = -1, diff --git a/thirdparty/icu4c/common/putil.cpp b/thirdparty/icu4c/common/putil.cpp index 3ed6a05d22d..ffcbbcce59b 100644 --- a/thirdparty/icu4c/common/putil.cpp +++ b/thirdparty/icu4c/common/putil.cpp @@ -1139,7 +1139,7 @@ uprv_tzname(int n) #endif if (tzid != NULL && isValidOlsonID(tzid) #if U_PLATFORM == U_PF_SOLARIS - /* When TZ equals localtime on Solaris, check the /etc/localtime file. */ + /* Don't misinterpret TZ "localtime" on Solaris as a time zone name. */ && uprv_strcmp(tzid, TZ_ENV_CHECK) != 0 #endif ) { @@ -1361,7 +1361,7 @@ uprv_pathIsAbsolute(const char *path) /* Backup setting of ICU_DATA_DIR_PREFIX_ENV_VAR (needed for some Darwin ICU build environments) */ -#if U_PLATFORM_IS_DARWIN_BASED && TARGET_OS_SIMULATOR +#if U_PLATFORM_IS_DARWIN_BASED && defined(TARGET_OS_SIMULATOR) && TARGET_OS_SIMULATOR # if !defined(ICU_DATA_DIR_PREFIX_ENV_VAR) # define ICU_DATA_DIR_PREFIX_ENV_VAR "IPHONE_SIMULATOR_ROOT" # endif diff --git a/thirdparty/icu4c/common/putilimp.h b/thirdparty/icu4c/common/putilimp.h index a325c6c359a..5b95a68418c 100644 --- a/thirdparty/icu4c/common/putilimp.h +++ b/thirdparty/icu4c/common/putilimp.h @@ -527,7 +527,7 @@ U_CAPI void * U_EXPORT2 uprv_maximumPtr(void *base); * on the destination pointer and capacity cannot overflow. * * The pinned capacity must fulfill the following conditions (for positive capacities): - * - dest + capacity is a valid pointer according to the machine arcitecture (AS/400, 64-bit, etc.) + * - dest + capacity is a valid pointer according to the machine architecture (AS/400, 64-bit, etc.) * - (dest + capacity) >= dest * - The size (in bytes) of T[capacity] does not exceed 0x7fffffff * diff --git a/thirdparty/icu4c/common/rbbi.cpp b/thirdparty/icu4c/common/rbbi.cpp index 9b7e70c3cf4..b821ca44639 100644 --- a/thirdparty/icu4c/common/rbbi.cpp +++ b/thirdparty/icu4c/common/rbbi.cpp @@ -812,7 +812,7 @@ int32_t RuleBasedBreakIterator::handleNext() { } #endif - // handleNext alway sets the break tag value. + // handleNext always sets the break tag value. // Set the default for it. fRuleStatusIndex = 0; diff --git a/thirdparty/icu4c/common/rbbi_cache.cpp b/thirdparty/icu4c/common/rbbi_cache.cpp index 63ff3001c70..44f19d86973 100644 --- a/thirdparty/icu4c/common/rbbi_cache.cpp +++ b/thirdparty/icu4c/common/rbbi_cache.cpp @@ -258,7 +258,7 @@ void RuleBasedBreakIterator::BreakCache::preceding(int32_t startPos, UErrorCode previous(status); } else { // seek() leaves the BreakCache positioned at the preceding boundary - // if the requested position is between two bounaries. + // if the requested position is between two boundaries. // current() pushes the BreakCache position out to the BreakIterator itself. U_ASSERT(startPos > fTextIdx); current(); diff --git a/thirdparty/icu4c/common/rbbiscan.cpp b/thirdparty/icu4c/common/rbbiscan.cpp index 9c406af6713..45911b1cfe0 100644 --- a/thirdparty/icu4c/common/rbbiscan.cpp +++ b/thirdparty/icu4c/common/rbbiscan.cpp @@ -284,7 +284,7 @@ UBool RBBIRuleScanner::doParseActions(int32_t action) case doEndAssign: { - // We have reached the end of an assignement statement. + // We have reached the end of an assignment statement. // Current scan char is the ';' that terminates the assignment. // Terminate expression, leaves expression parse tree rooted in TOS node. @@ -856,6 +856,10 @@ UChar32 RBBIRuleScanner::nextCharLL() { return (UChar32)-1; } ch = fRB->fRules.char32At(fNextIndex); + if (U_IS_SURROGATE(ch)) { + error(U_ILLEGAL_CHAR_FOUND); + return U_SENTINEL; + } fNextIndex = fRB->fRules.moveIndex32(fNextIndex, 1); if (ch == chCR || diff --git a/thirdparty/icu4c/common/rbbitblb.cpp b/thirdparty/icu4c/common/rbbitblb.cpp index 70e260fc08b..dd76337bc67 100644 --- a/thirdparty/icu4c/common/rbbitblb.cpp +++ b/thirdparty/icu4c/common/rbbitblb.cpp @@ -151,7 +151,7 @@ void RBBITableBuilder::buildForwardTable() { // // calculate the functions nullable, firstpos, lastpos and followpos on // nodes in the parse tree. - // See the alogrithm description in Aho. + // See the algorithm description in Aho. // Understanding how this works by looking at the code alone will be // nearly impossible. // diff --git a/thirdparty/icu4c/common/resource.h b/thirdparty/icu4c/common/resource.h index 3795694412a..48f5b9fa6ec 100644 --- a/thirdparty/icu4c/common/resource.h +++ b/thirdparty/icu4c/common/resource.h @@ -274,8 +274,10 @@ public: * * @param key The key string of the enumeration-start resource. * Empty if the enumeration starts at the top level of the bundle. - * @param value Call getArray() or getTable() as appropriate. - * Then reuse for output values from Array and Table getters. + * @param value Call getArray() or getTable() as appropriate. Then reuse for + * output values from Array and Table getters. Note: ResourceTable and + * ResourceArray instances must outlive the ResourceValue instance for + * ResourceTracer to be happy. * @param noFallback true if the bundle has no parent; * that is, its top-level table has the nofallback attribute, * or it is the root bundle of a locale tree. diff --git a/thirdparty/icu4c/common/restrace.cpp b/thirdparty/icu4c/common/restrace.cpp index 5c6498850e2..1f83372d682 100644 --- a/thirdparty/icu4c/common/restrace.cpp +++ b/thirdparty/icu4c/common/restrace.cpp @@ -54,6 +54,9 @@ void ResourceTracer::traceOpen() const { CharString& ResourceTracer::getFilePath(CharString& output, UErrorCode& status) const { if (fResB) { + // Note: if you get a segfault around here, check that ResourceTable and + // ResourceArray instances outlive ResourceValue instances referring to + // their contents: output.append(fResB->fData->fPath, status); output.append('/', status); output.append(fResB->fData->fName, status); diff --git a/thirdparty/icu4c/common/servnotf.h b/thirdparty/icu4c/common/servnotf.h index 305570c1e67..73ce38c772e 100644 --- a/thirdparty/icu4c/common/servnotf.h +++ b/thirdparty/icu4c/common/servnotf.h @@ -82,7 +82,7 @@ public: /** * Add a listener to be notified when notifyChanged is called. * The listener must not be null. AcceptsListener must return - * true for the listener. Attempts to concurrently + * true for the listener. Attempts to concurrently * register the identical listener more than once will be * silently ignored. */ @@ -90,7 +90,7 @@ public: /** * Stop notifying this listener. The listener must - * not be null. Attemps to remove a listener that is + * not be null. Attempts to remove a listener that is * not registered will be silently ignored. */ virtual void removeListener(const EventListener* l, UErrorCode& status); diff --git a/thirdparty/icu4c/common/ubrk.cpp b/thirdparty/icu4c/common/ubrk.cpp index f8bdf5a6b65..bb5bdd1b501 100644 --- a/thirdparty/icu4c/common/ubrk.cpp +++ b/thirdparty/icu4c/common/ubrk.cpp @@ -174,6 +174,18 @@ ubrk_safeClone( return (UBreakIterator *)newBI; } +U_CAPI UBreakIterator * U_EXPORT2 +ubrk_clone(const UBreakIterator *bi, UErrorCode *status) { + if (U_FAILURE(*status)) { + return nullptr; + } + BreakIterator *newBI = ((BreakIterator *)bi)->clone(); + if (newBI == nullptr) { + *status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return (UBreakIterator *)newBI; +} U_CAPI void U_EXPORT2 diff --git a/thirdparty/icu4c/common/ucase.cpp b/thirdparty/icu4c/common/ucase.cpp index 2b142f5bc24..4f4c274d60b 100644 --- a/thirdparty/icu4c/common/ucase.cpp +++ b/thirdparty/icu4c/common/ucase.cpp @@ -681,7 +681,7 @@ ucase_isCaseSensitive(UChar32 c) { * - In [CoreProps], C has one of the properties Uppercase, or Lowercase * - Given D = NFD(C), then it is not the case that: * D = UCD_lower(D) = UCD_upper(D) = UCD_title(D) - * (This third criterium does not add any characters to the list + * (This third criterion does not add any characters to the list * for Unicode 3.2. Ignored.) * * D2. A character C is defined to be case-ignorable diff --git a/thirdparty/icu4c/common/uchar.cpp b/thirdparty/icu4c/common/uchar.cpp index eb14e4c75d5..61e9c3d900d 100644 --- a/thirdparty/icu4c/common/uchar.cpp +++ b/thirdparty/icu4c/common/uchar.cpp @@ -194,7 +194,7 @@ u_isISOControl(UChar32 c) { /* Some control characters that are used as space. */ #define IS_THAT_CONTROL_SPACE(c) \ - (c<=0x9f && ((c>=TAB && c<=CR) || (c>=0x1c && c <=0x1f) || c==NL)) + (c<=0x9f && ((c>=TAB && c<=CR) || (c>=0x1c && c <=0x1f) || c==0x85)) /* Java has decided that U+0085 New Line is not whitespace any more. */ #define IS_THAT_ASCII_CONTROL_SPACE(c) \ @@ -677,14 +677,14 @@ uchar_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { sa->add(sa->set, CR+1); /* range TAB..CR */ sa->add(sa->set, 0x1c); sa->add(sa->set, 0x1f+1); - USET_ADD_CP_AND_NEXT(sa, NL); + USET_ADD_CP_AND_NEXT(sa, 0x85); // NEXT LINE (NEL) /* add for u_isIDIgnorable() what was not added above */ - sa->add(sa->set, DEL); /* range DEL..NBSP-1, NBSP added below */ + sa->add(sa->set, 0x7f); /* range DEL..NBSP-1, NBSP added below */ sa->add(sa->set, HAIRSP); sa->add(sa->set, RLM+1); - sa->add(sa->set, INHSWAP); - sa->add(sa->set, NOMDIG+1); + sa->add(sa->set, 0x206a); // INHIBIT SYMMETRIC SWAPPING + sa->add(sa->set, 0x206f+1); // NOMINAL DIGIT SHAPES USET_ADD_CP_AND_NEXT(sa, ZWNBSP); /* add no-break spaces for u_isWhitespace() what was not added above */ @@ -693,23 +693,25 @@ uchar_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { USET_ADD_CP_AND_NEXT(sa, NNBSP); /* add for u_digit() */ - sa->add(sa->set, U_a); - sa->add(sa->set, U_z+1); - sa->add(sa->set, U_A); - sa->add(sa->set, U_Z+1); - sa->add(sa->set, U_FW_a); - sa->add(sa->set, U_FW_z+1); - sa->add(sa->set, U_FW_A); - sa->add(sa->set, U_FW_Z+1); + sa->add(sa->set, u'a'); + sa->add(sa->set, u'z'+1); + sa->add(sa->set, u'A'); + sa->add(sa->set, u'Z'+1); + // fullwidth + sa->add(sa->set, u'a'); + sa->add(sa->set, u'z'+1); + sa->add(sa->set, u'A'); + sa->add(sa->set, u'Z'+1); /* add for u_isxdigit() */ - sa->add(sa->set, U_f+1); - sa->add(sa->set, U_F+1); - sa->add(sa->set, U_FW_f+1); - sa->add(sa->set, U_FW_F+1); + sa->add(sa->set, u'f'+1); + sa->add(sa->set, u'F'+1); + // fullwidth + sa->add(sa->set, u'f'+1); + sa->add(sa->set, u'F'+1); /* add for UCHAR_DEFAULT_IGNORABLE_CODE_POINT what was not added above */ - sa->add(sa->set, WJ); /* range WJ..NOMDIG */ + sa->add(sa->set, 0x2060); /* range 2060..206f */ sa->add(sa->set, 0xfff0); sa->add(sa->set, 0xfffb+1); sa->add(sa->set, 0xe0000); diff --git a/thirdparty/icu4c/common/ucnv2022.cpp b/thirdparty/icu4c/common/ucnv2022.cpp index 169ad4c5261..1726440b944 100644 --- a/thirdparty/icu4c/common/ucnv2022.cpp +++ b/thirdparty/icu4c/common/ucnv2022.cpp @@ -820,7 +820,7 @@ getKey_2022(char c,int32_t* key,int32_t* offset){ return INVALID_2022; } -/*runs through a state machine to determine the escape sequence - codepage correspondance +/*runs through a state machine to determine the escape sequence - codepage correspondence */ static void changeState_2022(UConverter* _this, @@ -1424,7 +1424,7 @@ toUnicodeCallback(UConverter *cnv, * KSC5601 : alias to ibm-949 mapping table * GB2312 : alias to ibm-1386 mapping table * ISO-8859-1 : Algorithmic implemented as LATIN1 case -* ISO-8859-7 : alisas to ibm-9409 mapping table +* ISO-8859-7 : alias to ibm-9409 mapping table */ /* preference order of JP charsets */ @@ -2324,7 +2324,7 @@ endloop: /*************************************************************** * Rules for ISO-2022-KR encoding * i) The KSC5601 designator sequence should appear only once in a file, -* at the begining of a line before any KSC5601 characters. This usually +* at the beginning of a line before any KSC5601 characters. This usually * means that it appears by itself on the first line of the file * ii) There are only 2 shifting sequences SO to shift into double byte mode * and SI to shift into single byte mode diff --git a/thirdparty/icu4c/common/ucnv_bld.cpp b/thirdparty/icu4c/common/ucnv_bld.cpp index 0e198892f1b..d08eec73696 100644 --- a/thirdparty/icu4c/common/ucnv_bld.cpp +++ b/thirdparty/icu4c/common/ucnv_bld.cpp @@ -427,7 +427,7 @@ getAlgorithmicTypeFromName(const char *realName) #define UCNV_CACHE_LOAD_FACTOR 2 /* Puts the shared data in the static hashtable SHARED_DATA_HASHTABLE */ -/* Will always be called with the cnvCacheMutex alrady being held */ +/* Will always be called with the cnvCacheMutex already being held */ /* by the calling function. */ /* Stores the shared data in the SHARED_DATA_HASHTABLE * @param data The shared data diff --git a/thirdparty/icu4c/common/ucnv_err.cpp b/thirdparty/icu4c/common/ucnv_err.cpp index 6b738face5e..e1f2b934aa6 100644 --- a/thirdparty/icu4c/common/ucnv_err.cpp +++ b/thirdparty/icu4c/common/ucnv_err.cpp @@ -321,7 +321,7 @@ UCNV_FROM_U_CALLBACK_ESCAPE ( case UCNV_PRV_ESCAPE_CSS2: valueString[valueStringLength++] = (UChar) UNICODE_RS_CODEPOINT; /* adding \ */ valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, codePoint, 16, 0); - /* Always add space character, becase the next character might be whitespace, + /* Always add space character, because the next character might be whitespace, which would erroneously be considered the termination of the escape sequence. */ valueString[valueStringLength++] = (UChar) UNICODE_SPACE_CODEPOINT; break; diff --git a/thirdparty/icu4c/common/ucnv_lmb.cpp b/thirdparty/icu4c/common/ucnv_lmb.cpp index 168392837b5..41317d1cc01 100644 --- a/thirdparty/icu4c/common/ucnv_lmb.cpp +++ b/thirdparty/icu4c/common/ucnv_lmb.cpp @@ -81,7 +81,7 @@ [G] D1 [D2] That is, a sometimes-optional 'group' byte, followed by 1 and sometimes 2 - data bytes. The maximum size of a LMBCS chjaracter is 3 bytes: + data bytes. The maximum size of a LMBCS character is 3 bytes: */ #define ULMBCS_CHARSIZE_MAX 3 /* @@ -164,7 +164,7 @@ beginning of internal 'system' range names: */ /* Then we needed a place to put all the other ansi control characters that must be moved to different values because LMBCS reserves those values for other purposes. To represent the control characters, we start -with a first byte of 0xF & add the control chaarcter value as the +with a first byte of 0xF & add the control character value as the second byte */ #define ULMBCS_GRP_CTRL 0x0F diff --git a/thirdparty/icu4c/common/ucnv_u7.cpp b/thirdparty/icu4c/common/ucnv_u7.cpp index 87ba8cf37ec..de9f3f42ec9 100644 --- a/thirdparty/icu4c/common/ucnv_u7.cpp +++ b/thirdparty/icu4c/common/ucnv_u7.cpp @@ -814,7 +814,7 @@ const UConverterSharedData _UTF7Data= * the use of "~" in some servers as a home directory indicator. * * 5) UTF-7 permits multiple alternate forms to represent the same - * string; in particular, printable US-ASCII chararacters can be + * string; in particular, printable US-ASCII characters can be * represented in encoded form. * * In modified UTF-7, printable US-ASCII characters except for "&" diff --git a/thirdparty/icu4c/common/ucnvisci.cpp b/thirdparty/icu4c/common/ucnvisci.cpp index 44a7c05a3c8..ffb8c7ac3e8 100644 --- a/thirdparty/icu4c/common/ucnvisci.cpp +++ b/thirdparty/icu4c/common/ucnvisci.cpp @@ -992,7 +992,7 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC( if (converterData->currentDeltaFromUnicode == PNJ_DELTA) { if (sourceChar == PNJ_TIPPI) { - /* Make sure Tippi is converterd to Bindi. */ + /* Make sure Tippi is converted to Bindi. */ sourceChar = PNJ_BINDI; } else if (sourceChar == PNJ_ADHAK) { /* This is for consonant cluster handling. */ @@ -1147,7 +1147,7 @@ static const uint16_t lookupTable[][2]={ /* is the code point valid in current script? */ \ if(sourceChar> ASCII_END && \ (validityTable[(targetUniChar & 0x7F)] & data->currentMaskToUnicode)==0){ \ - /* Vocallic RR is assigne in ISCII Telugu and Unicode */ \ + /* Vocallic RR is assigned in ISCII Telugu and Unicode */ \ if(data->currentDeltaToUnicode!=(TELUGU_DELTA) || \ targetUniChar!=VOCALLIC_RR){ \ targetUniChar=missingCharMarker; \ @@ -1272,7 +1272,7 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCo goto CALLBACK; } else if (*contextCharToUnicode==ISCII_INV) { if (sourceChar==ISCII_HALANT) { - targetUniChar = 0x0020; /* replace with space accoding to Indic FAQ */ + targetUniChar = 0x0020; /* replace with space according to Indic FAQ */ } else { targetUniChar = ZWJ; } diff --git a/thirdparty/icu4c/common/ucurr.cpp b/thirdparty/icu4c/common/ucurr.cpp index 0e14cddcff3..20bbd514889 100644 --- a/thirdparty/icu4c/common/ucurr.cpp +++ b/thirdparty/icu4c/common/ucurr.cpp @@ -844,7 +844,7 @@ typedef struct { #endif -// Comparason function used in quick sort. +// Comparison function used in quick sort. static int U_CALLCONV currencyNameComparator(const void* a, const void* b) { const CurrencyNameStruct* currName_1 = (const CurrencyNameStruct*)a; const CurrencyNameStruct* currName_2 = (const CurrencyNameStruct*)b; @@ -1530,7 +1530,7 @@ uprv_parseCurrency(const char* locale, int32_t max = 0; int32_t matchIndex = -1; - // case in-sensitive comparision against currency names + // case in-sensitive comparison against currency names searchCurrencyName(currencyNames, total_currency_name_count, upperText, textLen, partialMatchLen, &max, &matchIndex); diff --git a/thirdparty/icu4c/common/uhash.cpp b/thirdparty/icu4c/common/uhash.cpp index 86311ceb0b2..67c7c363540 100644 --- a/thirdparty/icu4c/common/uhash.cpp +++ b/thirdparty/icu4c/common/uhash.cpp @@ -133,8 +133,10 @@ static const float RESIZE_POLICY_RATIO_TABLE[6] = { * or a pointer. If a hint bit is zero, then the associated * token is assumed to be an integer. */ +#define HINT_BOTH_INTEGERS (0) #define HINT_KEY_POINTER (1) #define HINT_VALUE_POINTER (2) +#define HINT_ALLOW_ZERO (4) /******************************************************************** * PRIVATE Implementation @@ -479,8 +481,9 @@ _uhash_put(UHashtable *hash, goto err; } U_ASSERT(hash != NULL); - /* Cannot always check pointer here or iSeries sees NULL every time. */ - if ((hint & HINT_VALUE_POINTER) && value.pointer == NULL) { + if ((hint & HINT_VALUE_POINTER) ? + value.pointer == NULL : + value.integer == 0 && (hint & HINT_ALLOW_ZERO) == 0) { /* Disallow storage of NULL values, since NULL is returned by * get() to indicate an absent key. Storing NULL == removing. */ @@ -687,6 +690,28 @@ uhash_igeti(const UHashtable *hash, return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer; } +U_CAPI int32_t U_EXPORT2 +uhash_getiAndFound(const UHashtable *hash, + const void *key, + UBool *found) { + UHashTok keyholder; + keyholder.pointer = (void *)key; + const UHashElement *e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder)); + *found = !IS_EMPTY_OR_DELETED(e->hashcode); + return e->value.integer; +} + +U_CAPI int32_t U_EXPORT2 +uhash_igetiAndFound(const UHashtable *hash, + int32_t key, + UBool *found) { + UHashTok keyholder; + keyholder.integer = key; + const UHashElement *e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder)); + *found = !IS_EMPTY_OR_DELETED(e->hashcode); + return e->value.integer; +} + U_CAPI void* U_EXPORT2 uhash_put(UHashtable *hash, void* key, @@ -736,7 +761,34 @@ uhash_iputi(UHashtable *hash, keyholder.integer = key; valueholder.integer = value; return _uhash_put(hash, keyholder, valueholder, - 0, /* neither is a ptr */ + HINT_BOTH_INTEGERS, + status).integer; +} + +U_CAPI int32_t U_EXPORT2 +uhash_putiAllowZero(UHashtable *hash, + void *key, + int32_t value, + UErrorCode *status) { + UHashTok keyholder, valueholder; + keyholder.pointer = key; + valueholder.integer = value; + return _uhash_put(hash, keyholder, valueholder, + HINT_KEY_POINTER | HINT_ALLOW_ZERO, + status).integer; +} + + +U_CAPI int32_t U_EXPORT2 +uhash_iputiAllowZero(UHashtable *hash, + int32_t key, + int32_t value, + UErrorCode *status) { + UHashTok keyholder, valueholder; + keyholder.integer = key; + valueholder.integer = value; + return _uhash_put(hash, keyholder, valueholder, + HINT_BOTH_INTEGERS | HINT_ALLOW_ZERO, status).integer; } @@ -785,6 +837,29 @@ uhash_removeAll(UHashtable *hash) { U_ASSERT(hash->count == 0); } +U_CAPI UBool U_EXPORT2 +uhash_containsKey(const UHashtable *hash, const void *key) { + UHashTok keyholder; + keyholder.pointer = (void *)key; + const UHashElement *e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder)); + return !IS_EMPTY_OR_DELETED(e->hashcode); +} + +/** + * Returns true if the UHashtable contains an item with this integer key. + * + * @param hash The target UHashtable. + * @param key An integer key stored in a hashtable + * @return true if the key is found. + */ +U_CAPI UBool U_EXPORT2 +uhash_icontainsKey(const UHashtable *hash, int32_t key) { + UHashTok keyholder; + keyholder.integer = key; + const UHashElement *e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder)); + return !IS_EMPTY_OR_DELETED(e->hashcode); +} + U_CAPI const UHashElement* U_EXPORT2 uhash_find(const UHashtable *hash, const void* key) { UHashTok keyholder; diff --git a/thirdparty/icu4c/common/uhash.h b/thirdparty/icu4c/common/uhash.h index b59d2711bb2..af75999860d 100644 --- a/thirdparty/icu4c/common/uhash.h +++ b/thirdparty/icu4c/common/uhash.h @@ -23,7 +23,7 @@ /** * UHashtable stores key-value pairs and does moderately fast lookup * based on keys. It provides a good tradeoff between access time and - * storage space. As elements are added to it, it grows to accomodate + * storage space. As elements are added to it, it grows to accommodate * them. By default, the table never shrinks, even if all elements * are removed from it. * @@ -54,6 +54,13 @@ * uhash_remove() on that key. This keeps uhash_get(), uhash_count(), * and uhash_nextElement() consistent with one another. * + * Keys and values can be integers. + * Functions that work with an integer key have an "i" prefix. + * Functions that work with an integer value have an "i" suffix. + * As with putting a NULL value pointer, putting a zero value integer removes the item. + * Except, there are pairs of functions that allow setting zero values + * and fetching (value, found) pairs. + * * To see everything in a hashtable, use uhash_nextElement() to * iterate through its contents. Each call to this function returns a * UHashElement pointer. A hash element contains a key, value, and @@ -405,6 +412,44 @@ uhash_iputi(UHashtable *hash, int32_t value, UErrorCode *status); +/** + * Put a (key=pointer, value=integer) item in a UHashtable. If the + * keyDeleter is non-NULL, then the hashtable owns 'key' after this + * call. valueDeleter must be NULL. + * Storing a 0 value is possible; call uhash_igetiAndFound() to retrieve values including zero. + * + * @param hash The target UHashtable. + * @param key The key to store. + * @param value The integer value to store. + * @param status A pointer to an UErrorCode to receive any errors. + * @return The previous value, or 0 if none. + * @see uhash_getiAndFound + */ +U_CAPI int32_t U_EXPORT2 +uhash_putiAllowZero(UHashtable *hash, + void *key, + int32_t value, + UErrorCode *status); + +/** + * Put a (key=integer, value=integer) item in a UHashtable. If the + * keyDeleter is non-NULL, then the hashtable owns 'key' after this + * call. valueDeleter must be NULL. + * Storing a 0 value is possible; call uhash_igetiAndFound() to retrieve values including zero. + * + * @param hash The target UHashtable. + * @param key The key to store. + * @param value The integer value to store. + * @param status A pointer to an UErrorCode to receive any errors. + * @return The previous value, or 0 if none. + * @see uhash_igetiAndFound + */ +U_CAPI int32_t U_EXPORT2 +uhash_iputiAllowZero(UHashtable *hash, + int32_t key, + int32_t value, + UErrorCode *status); + /** * Retrieve a pointer value from a UHashtable using a pointer key, * as previously stored by uhash_put(). @@ -448,6 +493,34 @@ U_CAPI int32_t U_EXPORT2 uhash_igeti(const UHashtable *hash, int32_t key); +/** + * Retrieves an integer value from a UHashtable using a pointer key, + * as previously stored by uhash_putiAllowZero() or uhash_puti(). + * + * @param hash The target UHashtable. + * @param key A pointer key stored in a hashtable + * @param found A pointer to a boolean which will be set for whether the key was found. + * @return The requested item, or 0 if not found. + */ +U_CAPI int32_t U_EXPORT2 +uhash_getiAndFound(const UHashtable *hash, + const void *key, + UBool *found); + +/** + * Retrieves an integer value from a UHashtable using an integer key, + * as previously stored by uhash_iputiAllowZero() or uhash_iputi(). + * + * @param hash The target UHashtable. + * @param key An integer key stored in a hashtable + * @param found A pointer to a boolean which will be set for whether the key was found. + * @return The requested item, or 0 if not found. + */ +U_CAPI int32_t U_EXPORT2 +uhash_igetiAndFound(const UHashtable *hash, + int32_t key, + UBool *found); + /** * Remove an item from a UHashtable stored by uhash_put(). * @param hash The target UHashtable. @@ -495,6 +568,26 @@ uhash_iremovei(UHashtable *hash, U_CAPI void U_EXPORT2 uhash_removeAll(UHashtable *hash); +/** + * Returns true if the UHashtable contains an item with this pointer key. + * + * @param hash The target UHashtable. + * @param key A pointer key stored in a hashtable + * @return true if the key is found. + */ +U_CAPI UBool U_EXPORT2 +uhash_containsKey(const UHashtable *hash, const void *key); + +/** + * Returns true if the UHashtable contains an item with this integer key. + * + * @param hash The target UHashtable. + * @param key An integer key stored in a hashtable + * @return true if the key is found. + */ +U_CAPI UBool U_EXPORT2 +uhash_icontainsKey(const UHashtable *hash, int32_t key); + /** * Locate an element of a UHashtable. The caller must not modify the * returned object. The primary use of this function is to obtain the diff --git a/thirdparty/icu4c/common/uloc.cpp b/thirdparty/icu4c/common/uloc.cpp index ebfbb506508..d96e79b8fdd 100644 --- a/thirdparty/icu4c/common/uloc.cpp +++ b/thirdparty/icu4c/common/uloc.cpp @@ -143,7 +143,7 @@ static const char * const LANGUAGES[] = { "mad", "maf", "mag", "mai", "mak", "man", "mas", "mde", "mdf", "mdh", "mdr", "men", "mer", "mfe", "mg", "mga", "mgh", "mgo", "mh", "mi", "mic", "min", "mis", "mk", - "ml", "mn", "mnc", "mni", "mo", + "ml", "mn", "mnc", "mni", "moh", "mos", "mr", "mrj", "ms", "mt", "mua", "mul", "mus", "mwl", "mwr", "mwv", "my", "mye", "myv", "mzn", @@ -166,9 +166,9 @@ static const char * const LANGUAGES[] = { "sl", "sli", "sly", "sm", "sma", "smj", "smn", "sms", "sn", "snk", "so", "sog", "sq", "sr", "srn", "srr", "ss", "ssy", "st", "stq", "su", "suk", "sus", "sux", - "sv", "sw", "swb", "swc", "syc", "syr", "szl", + "sv", "sw", "swb", "syc", "syr", "szl", "ta", "tcy", "te", "tem", "teo", "ter", "tet", "tg", - "th", "ti", "tig", "tiv", "tk", "tkl", "tkr", "tl", + "th", "ti", "tig", "tiv", "tk", "tkl", "tkr", "tlh", "tli", "tly", "tmh", "tn", "to", "tog", "tpi", "tr", "tru", "trv", "ts", "tsd", "tsi", "tt", "ttt", "tum", "tvl", "tw", "twq", "ty", "tyv", "tzm", @@ -181,7 +181,7 @@ static const char * const LANGUAGES[] = { "za", "zap", "zbl", "zea", "zen", "zgh", "zh", "zu", "zun", "zxx", "zza", NULL, - "in", "iw", "ji", "jw", "sh", /* obsolete language codes */ + "in", "iw", "ji", "jw", "mo", "sh", "swc", "tl", /* obsolete language codes */ NULL }; @@ -260,7 +260,7 @@ static const char * const LANGUAGES_3[] = { "mad", "maf", "mag", "mai", "mak", "man", "mas", "mde", "mdf", "mdh", "mdr", "men", "mer", "mfe", "mlg", "mga", "mgh", "mgo", "mah", "mri", "mic", "min", "mis", "mkd", - "mal", "mon", "mnc", "mni", "mol", + "mal", "mon", "mnc", "mni", "moh", "mos", "mar", "mrj", "msa", "mlt", "mua", "mul", "mus", "mwl", "mwr", "mwv", "mya", "mye", "myv", "mzn", @@ -283,9 +283,9 @@ static const char * const LANGUAGES_3[] = { "slv", "sli", "sly", "smo", "sma", "smj", "smn", "sms", "sna", "snk", "som", "sog", "sqi", "srp", "srn", "srr", "ssw", "ssy", "sot", "stq", "sun", "suk", "sus", "sux", - "swe", "swa", "swb", "swc", "syc", "syr", "szl", + "swe", "swa", "swb", "syc", "syr", "szl", "tam", "tcy", "tel", "tem", "teo", "ter", "tet", "tgk", - "tha", "tir", "tig", "tiv", "tuk", "tkl", "tkr", "tgl", + "tha", "tir", "tig", "tiv", "tuk", "tkl", "tkr", "tlh", "tli", "tly", "tmh", "tsn", "ton", "tog", "tpi", "tur", "tru", "trv", "tso", "tsd", "tsi", "tat", "ttt", "tum", "tvl", "twi", "twq", "tah", "tyv", "tzm", @@ -298,8 +298,8 @@ static const char * const LANGUAGES_3[] = { "zha", "zap", "zbl", "zea", "zen", "zgh", "zho", "zul", "zun", "zxx", "zza", NULL, -/* "in", "iw", "ji", "jw", "sh", */ - "ind", "heb", "yid", "jaw", "srp", +/* "in", "iw", "ji", "jw", "mo", "sh", "swc", "tl", */ + "ind", "heb", "yid", "jaw", "mol", "srp", "swc", "tgl", NULL }; @@ -334,13 +334,13 @@ static const char * const COUNTRIES[] = { "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", - "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", - "DM", "DO", "DZ", "EC", "EE", "EG", "EH", "ER", + "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DG", "DJ", "DK", + "DM", "DO", "DZ", "EA", "EC", "EE", "EG", "EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", - "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", + "IC", "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", @@ -357,7 +357,7 @@ static const char * const COUNTRIES[] = { "TK", "TL", "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF", - "WS", "YE", "YT", "ZA", "ZM", "ZW", + "WS", "XK", "YE", "YT", "ZA", "ZM", "ZW", NULL, "AN", "BU", "CS", "FX", "RO", "SU", "TP", "YD", "YU", "ZR", /* obsolete country codes */ NULL @@ -397,10 +397,10 @@ static const char * const COUNTRIES_3[] = { "BWA", "BLR", "BLZ", "CAN", "CCK", "COD", "CAF", "COG", /* "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", */ "CHE", "CIV", "COK", "CHL", "CMR", "CHN", "COL", "CRI", -/* "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", */ - "CUB", "CPV", "CUW", "CXR", "CYP", "CZE", "DEU", "DJI", "DNK", -/* "DM", "DO", "DZ", "EC", "EE", "EG", "EH", "ER", */ - "DMA", "DOM", "DZA", "ECU", "EST", "EGY", "ESH", "ERI", +/* "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DG", "DJ", "DK", */ + "CUB", "CPV", "CUW", "CXR", "CYP", "CZE", "DEU", "DGA", "DJI", "DNK", +/* "DM", "DO", "DZ", "EA", "EC", "EE", "EG", "EH", "ER", */ + "DMA", "DOM", "DZA", "XEA", "ECU", "EST", "EGY", "ESH", "ERI", /* "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", */ "ESP", "ETH", "FIN", "FJI", "FLK", "FSM", "FRO", "FRA", /* "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", */ @@ -409,8 +409,8 @@ static const char * const COUNTRIES_3[] = { "GMB", "GIN", "GLP", "GNQ", "GRC", "SGS", "GTM", "GUM", /* "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", */ "GNB", "GUY", "HKG", "HMD", "HND", "HRV", "HTI", "HUN", -/* "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS" */ - "IDN", "IRL", "ISR", "IMN", "IND", "IOT", "IRQ", "IRN", "ISL", +/* "IC", "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS" */ + "XIC", "IDN", "IRL", "ISR", "IMN", "IND", "IOT", "IRQ", "IRN", "ISL", /* "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", */ "ITA", "JEY", "JAM", "JOR", "JPN", "KEN", "KGZ", "KHM", "KIR", /* "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", */ @@ -443,8 +443,8 @@ static const char * const COUNTRIES_3[] = { "TWN", "TZA", "UKR", "UGA", "UMI", "USA", "URY", "UZB", /* "VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF", */ "VAT", "VCT", "VEN", "VGB", "VIR", "VNM", "VUT", "WLF", -/* "WS", "YE", "YT", "ZA", "ZM", "ZW", */ - "WSM", "YEM", "MYT", "ZAF", "ZMB", "ZWE", +/* "WS", "XK", "YE", "YT", "ZA", "ZM", "ZW", */ + "WSM", "XXK", "YEM", "MYT", "ZAF", "ZMB", "ZWE", NULL, /* "AN", "BU", "CS", "FX", "RO", "SU", "TP", "YD", "YU", "ZR" */ "ANT", "BUR", "SCG", "FXX", "ROM", "SUN", "TMP", "YMD", "YUG", "ZAR", diff --git a/thirdparty/icu4c/common/uloc_keytype.cpp b/thirdparty/icu4c/common/uloc_keytype.cpp index 019da058cf4..c289ebe76ff 100644 --- a/thirdparty/icu4c/common/uloc_keytype.cpp +++ b/thirdparty/icu4c/common/uloc_keytype.cpp @@ -271,7 +271,7 @@ initFromResourceBundle(UErrorCode& sts) { if (U_FAILURE(sts)) { break; } - // check if this is an alias of canoncal legacy type + // check if this is an alias of canonical legacy type if (uprv_compareInvWithUChar(NULL, legacyTypeId, -1, to, toLen) == 0) { const char* from = ures_getKey(typeAliasDataEntry.getAlias()); if (isTZ) { diff --git a/thirdparty/icu4c/common/uloc_tag.cpp b/thirdparty/icu4c/common/uloc_tag.cpp index 7f7fd9119e9..1235081bf39 100644 --- a/thirdparty/icu4c/common/uloc_tag.cpp +++ b/thirdparty/icu4c/common/uloc_tag.cpp @@ -129,7 +129,6 @@ static const char* const LEGACY[] = { // Legacy tags with no preferred value in the IANA // registry. Kept for now for the backward compatibility // because ICU has mapped them this way. - "cel-gaulish", "xtg-x-cel-gaulish", "i-default", "en-x-i-default", "i-enochian", "und-x-i-enochian", "i-mingo", "see-x-i-mingo", @@ -647,6 +646,22 @@ _isTKey(const char* s, int32_t len) return FALSE; } +U_CAPI const char * U_EXPORT2 +ultag_getTKeyStart(const char *localeID) { + const char *result = localeID; + const char *sep; + while((sep = uprv_strchr(result, SEP)) != nullptr) { + if (_isTKey(result, static_cast(sep - result))) { + return result; + } + result = ++sep; + } + if (_isTKey(result, -1)) { + return result; + } + return nullptr; +} + static UBool _isTValue(const char* s, int32_t len) { @@ -671,9 +686,13 @@ _isTransformedExtensionSubtag(int32_t& state, const char* s, int32_t len) const int32_t kGotTKey = -1; // Got tkey, wait for tvalue. ERROR if stop here. const int32_t kGotTValue = 6; // Got tvalue, wait for tkey, tvalue or end + + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } switch (state) { case kStart: - if (ultag_isLanguageSubtag(s, len)) { + if (ultag_isLanguageSubtag(s, len) && len != 4) { state = kGotLanguage; return TRUE; } @@ -1775,11 +1794,6 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) return; } - /* Determine if variants already exists */ - if (ultag_getVariantsSize(langtag)) { - posixVariant = TRUE; - } - n = ultag_getExtensionsSize(langtag); /* resolve locale keywords and reordering keys */ @@ -1787,6 +1801,11 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) key = ultag_getExtensionKey(langtag, i); type = ultag_getExtensionValue(langtag, i); if (*key == LDMLEXT) { + /* Determine if variants already exists */ + if (ultag_getVariantsSize(langtag)) { + posixVariant = TRUE; + } + _appendLDMLExtensionAsKeywords(type, &kwdFirst, extPool, kwdBuf, &posixVariant, status); if (U_FAILURE(*status)) { break; @@ -2028,7 +2047,10 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } - uprv_memcpy(tagBuf, tag, tagLen); + + if (tagLen > 0) { + uprv_memcpy(tagBuf, tag, tagLen); + } *(tagBuf + tagLen) = 0; /* create a ULanguageTag */ @@ -2692,8 +2714,7 @@ ulocimp_toLanguageTag(const char* localeID, if (U_SUCCESS(tmpStatus)) { if (ultag_isPrivateuseValueSubtags(buf.data(), buf.length())) { /* return private use only tag */ - static const char PREFIX[] = { PRIVATEUSE, SEP }; - sink.Append(PREFIX, sizeof(PREFIX)); + sink.Append("und-x-", 6); sink.Append(buf.data(), buf.length()); done = TRUE; } else if (strict) { diff --git a/thirdparty/icu4c/common/ulocimp.h b/thirdparty/icu4c/common/ulocimp.h index 5691fe9a77f..1f796aa2130 100644 --- a/thirdparty/icu4c/common/ulocimp.h +++ b/thirdparty/icu4c/common/ulocimp.h @@ -286,6 +286,9 @@ ultag_isUnicodeLocaleType(const char* s, int32_t len); U_CFUNC UBool ultag_isVariantSubtags(const char* s, int32_t len); +U_CAPI const char * U_EXPORT2 +ultag_getTKeyStart(const char *localeID); + U_CFUNC const char* ulocimp_toBcpKey(const char* key); diff --git a/thirdparty/icu4c/common/unicode/bytestream.h b/thirdparty/icu4c/common/unicode/bytestream.h index 044f7a77e78..9735ee0bf86 100644 --- a/thirdparty/icu4c/common/unicode/bytestream.h +++ b/thirdparty/icu4c/common/unicode/bytestream.h @@ -71,7 +71,6 @@ public: */ virtual void Append(const char* bytes, int32_t n) = 0; -#ifndef U_HIDE_DRAFT_API /** * Appends n bytes to this. Same as Append(). * Call AppendU8() with u8"string literals" which are const char * in C++11 @@ -81,7 +80,7 @@ public: * * @param bytes the pointer to the bytes * @param n the number of bytes; must be non-negative - * @draft ICU 67 + * @stable ICU 67 */ inline void AppendU8(const char* bytes, int32_t n) { Append(bytes, n); @@ -97,13 +96,12 @@ public: * * @param bytes the pointer to the bytes * @param n the number of bytes; must be non-negative - * @draft ICU 67 + * @stable ICU 67 */ inline void AppendU8(const char8_t* bytes, int32_t n) { Append(reinterpret_cast(bytes), n); } #endif -#endif // U_HIDE_DRAFT_API /** * Returns a writable buffer for appending and writes the buffer's capacity to diff --git a/thirdparty/icu4c/common/unicode/bytestrie.h b/thirdparty/icu4c/common/unicode/bytestrie.h index 85f802df420..271a81d1b4d 100644 --- a/thirdparty/icu4c/common/unicode/bytestrie.h +++ b/thirdparty/icu4c/common/unicode/bytestrie.h @@ -30,6 +30,8 @@ #include "unicode/uobject.h" #include "unicode/ustringtrie.h" +class BytesTrieTest; + U_NAMESPACE_BEGIN class ByteSink; @@ -378,6 +380,7 @@ public: private: friend class BytesTrieBuilder; + friend class ::BytesTrieTest; /** * Constructs a BytesTrie reader instance. diff --git a/thirdparty/icu4c/common/unicode/bytestriebuilder.h b/thirdparty/icu4c/common/unicode/bytestriebuilder.h index cae16e48b45..3cff89e443d 100644 --- a/thirdparty/icu4c/common/unicode/bytestriebuilder.h +++ b/thirdparty/icu4c/common/unicode/bytestriebuilder.h @@ -30,6 +30,8 @@ #include "unicode/stringpiece.h" #include "unicode/stringtriebuilder.h" +class BytesTrieTest; + U_NAMESPACE_BEGIN class BytesTrieElement; @@ -125,6 +127,8 @@ public: BytesTrieBuilder &clear(); private: + friend class ::BytesTrieTest; + BytesTrieBuilder(const BytesTrieBuilder &other); // no copy constructor BytesTrieBuilder &operator=(const BytesTrieBuilder &other); // no assignment operator @@ -168,6 +172,7 @@ private: virtual int32_t writeValueAndFinal(int32_t i, UBool isFinal); virtual int32_t writeValueAndType(UBool hasValue, int32_t value, int32_t node); virtual int32_t writeDeltaTo(int32_t jumpTarget); + static int32_t internalEncodeDelta(int32_t i, char intBytes[]); CharString *strings; // Pointer not object so we need not #include internal charstr.h. BytesTrieElement *elements; diff --git a/thirdparty/icu4c/common/unicode/docmain.h b/thirdparty/icu4c/common/unicode/docmain.h index edcb5d4e835..e82678c95f5 100644 --- a/thirdparty/icu4c/common/unicode/docmain.h +++ b/thirdparty/icu4c/common/unicode/docmain.h @@ -15,7 +15,7 @@ * \file * \brief (Non API- contains Doxygen definitions) * - * This file contains documentation for Doxygen and doesnot have + * This file contains documentation for Doxygen and does not have * any significance with respect to C or C++ API */ @@ -74,7 +74,7 @@ * * * Strings and Character Iteration - * ustring.h, utf8.h, utf16.h, UText, UCharIterator + * ustring.h, utf8.h, utf16.h, icu::StringPiece, UText, UCharIterator, icu::ByteSink * icu::UnicodeString, icu::CharacterIterator, icu::Appendable, icu::StringPiece,icu::ByteSink * * @@ -128,9 +128,9 @@ * icu::Normalizer2 * * - * Calendars + * Calendars and Time Zones * ucal.h - * icu::Calendar + * icu::Calendar, icu::TimeZone * * * Date and Time Formatting diff --git a/thirdparty/icu4c/common/unicode/icuplug.h b/thirdparty/icu4c/common/unicode/icuplug.h index 52f810da57d..205af360d45 100644 --- a/thirdparty/icu4c/common/unicode/icuplug.h +++ b/thirdparty/icu4c/common/unicode/icuplug.h @@ -117,14 +117,13 @@ /* === Basic types === */ #ifndef U_HIDE_INTERNAL_API +struct UPlugData; /** * @{ - * Opaque structure passed to/from a plugin. - * use the APIs to access it. + * Typedef for opaque structure passed to/from a plugin. + * Use the APIs to access it. * @internal ICU 4.4 Technology Preview */ - -struct UPlugData; typedef struct UPlugData UPlugData; /** @} */ diff --git a/thirdparty/icu4c/common/unicode/localematcher.h b/thirdparty/icu4c/common/unicode/localematcher.h index 63a68b0b7fb..0cd068ef328 100644 --- a/thirdparty/icu4c/common/unicode/localematcher.h +++ b/thirdparty/icu4c/common/unicode/localematcher.h @@ -91,8 +91,6 @@ enum ULocMatchDemotion { typedef enum ULocMatchDemotion ULocMatchDemotion; #endif -#ifndef U_FORCE_HIDE_DRAFT_API - /** * Builder option for whether to include or ignore one-way (fallback) match data. * The LocaleMatcher uses CLDR languageMatch data which includes fallback (oneway=true) entries. @@ -108,20 +106,20 @@ typedef enum ULocMatchDemotion ULocMatchDemotion; * but not if it is merely a fallback. * * @see LocaleMatcher::Builder#setDirection(ULocMatchDirection) - * @draft ICU 67 + * @stable ICU 67 */ enum ULocMatchDirection { /** * Locale matching includes one-way matches such as Breton→French. (default) * - * @draft ICU 67 + * @stable ICU 67 */ ULOCMATCH_DIRECTION_WITH_ONE_WAY, /** * Locale matching limited to two-way matches including e.g. Danish↔Norwegian * but ignoring one-way matches. * - * @draft ICU 67 + * @stable ICU 67 */ ULOCMATCH_DIRECTION_ONLY_TWO_WAY }; @@ -129,8 +127,6 @@ enum ULocMatchDirection { typedef enum ULocMatchDirection ULocMatchDirection; #endif -#endif // U_FORCE_HIDE_DRAFT_API - struct UHashtable; U_NAMESPACE_BEGIN @@ -463,14 +459,13 @@ public: */ Builder &setDemotionPerDesiredLocale(ULocMatchDemotion demotion); -#ifndef U_HIDE_DRAFT_API /** * Option for whether to include or ignore one-way (fallback) match data. * By default, they are included. * * @param direction the match direction to set. * @return this Builder object - * @draft ICU 67 + * @stable ICU 67 */ Builder &setDirection(ULocMatchDirection direction) { if (U_SUCCESS(errorCode_)) { @@ -478,7 +473,6 @@ public: } return *this; } -#endif // U_HIDE_DRAFT_API #ifndef U_HIDE_DRAFT_API /** @@ -704,7 +698,7 @@ private: LSR *lsrs; int32_t supportedLocalesLength; // These are in preference order: 1. Default locale 2. paradigm locales 3. others. - UHashtable *supportedLsrToIndex; // Map stores index+1 because 0 is "not found" + UHashtable *supportedLsrToIndex; // Map // Array versions of the supportedLsrToIndex keys and values. // The distance lookup loops over the supportedLSRs and returns the index of the best match. const LSR **supportedLSRs; diff --git a/thirdparty/icu4c/common/unicode/locid.h b/thirdparty/icu4c/common/unicode/locid.h index ba858d702af..81f4685d650 100644 --- a/thirdparty/icu4c/common/unicode/locid.h +++ b/thirdparty/icu4c/common/unicode/locid.h @@ -571,15 +571,13 @@ public: */ void minimizeSubtags(UErrorCode& status); -#ifndef U_HIDE_DRAFT_API /** * Canonicalize the locale ID of this object according to CLDR. * @param status the status code - * @draft ICU 67 + * @stable ICU 67 * @see createCanonical */ void canonicalize(UErrorCode& status); -#endif // U_HIDE_DRAFT_API /** * Gets the list of keywords for the specified locale. diff --git a/thirdparty/icu4c/common/unicode/normalizer2.h b/thirdparty/icu4c/common/unicode/normalizer2.h index 5eb1d95cafb..2d355250c29 100644 --- a/thirdparty/icu4c/common/unicode/normalizer2.h +++ b/thirdparty/icu4c/common/unicode/normalizer2.h @@ -225,10 +225,8 @@ public: * Normalizes a UTF-8 string and optionally records how source substrings * relate to changed and unchanged result substrings. * - * Currently implemented completely only for "compose" modes, - * such as for NFC, NFKC, and NFKC_Casefold - * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). - * Otherwise currently converts to & from UTF-16 and does not support edits. + * Implemented completely for all built-in modes except for FCD. + * The base class implementation converts to & from UTF-16 and does not support edits. * * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. * @param src Source UTF-8 string. @@ -381,11 +379,9 @@ public: * resolves to "yes" or "no" to provide a definitive result, * at the cost of doing more work in those cases. * - * This works for all normalization modes, - * but it is currently optimized for UTF-8 only for "compose" modes, - * such as for NFC, NFKC, and NFKC_Casefold - * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). - * For other modes it currently converts to UTF-16 and calls isNormalized(). + * This works for all normalization modes. + * It is optimized for UTF-8 for all built-in modes except for FCD. + * The base class implementation converts to UTF-16 and calls isNormalized(). * * @param s UTF-8 input string * @param errorCode Standard ICU error code. Its input value must @@ -543,10 +539,8 @@ public: * Normalizes a UTF-8 string and optionally records how source substrings * relate to changed and unchanged result substrings. * - * Currently implemented completely only for "compose" modes, - * such as for NFC, NFKC, and NFKC_Casefold - * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). - * Otherwise currently converts to & from UTF-16 and does not support edits. + * Implemented completely for most built-in modes except for FCD. + * The base class implementation converts to & from UTF-16 and does not support edits. * * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. * @param src Source UTF-8 string. @@ -676,11 +670,9 @@ public: * resolves to "yes" or "no" to provide a definitive result, * at the cost of doing more work in those cases. * - * This works for all normalization modes, - * but it is currently optimized for UTF-8 only for "compose" modes, - * such as for NFC, NFKC, and NFKC_Casefold - * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). - * For other modes it currently converts to UTF-16 and calls isNormalized(). + * This works for all normalization modes. + * It is optimized for UTF-8 for all built-in modes except for FCD. + * The base class implementation converts to UTF-16 and calls isNormalized(). * * @param s UTF-8 input string * @param errorCode Standard ICU error code. Its input value must diff --git a/thirdparty/icu4c/common/unicode/platform.h b/thirdparty/icu4c/common/unicode/platform.h index 2bb2f8b318d..cb3a833fefc 100644 --- a/thirdparty/icu4c/common/unicode/platform.h +++ b/thirdparty/icu4c/common/unicode/platform.h @@ -880,6 +880,6 @@ namespace std { #else # define U_CALLCONV_FPTR #endif -/* @} */ +/** @} */ #endif // _PLATFORM_H diff --git a/thirdparty/icu4c/common/unicode/stringpiece.h b/thirdparty/icu4c/common/unicode/stringpiece.h index 7d7d871e1f7..8c96789e730 100644 --- a/thirdparty/icu4c/common/unicode/stringpiece.h +++ b/thirdparty/icu4c/common/unicode/stringpiece.h @@ -75,12 +75,11 @@ class U_COMMON_API StringPiece : public UMemory { * @stable ICU 4.2 */ StringPiece(const char* str); -#ifndef U_HIDE_DRAFT_API #if defined(__cpp_char8_t) || defined(U_IN_DOXYGEN) /** * Constructs from a NUL-terminated const char8_t * pointer. * @param str a NUL-terminated const char8_t * pointer - * @draft ICU 67 + * @stable ICU 67 */ StringPiece(const char8_t* str) : StringPiece(reinterpret_cast(str)) {} #endif @@ -88,10 +87,9 @@ class U_COMMON_API StringPiece : public UMemory { * Constructs an empty StringPiece. * Needed for type disambiguation from multiple other overloads. * @param p nullptr - * @draft ICU 67 + * @stable ICU 67 */ StringPiece(std::nullptr_t p) : ptr_(p), length_(0) {} -#endif // U_HIDE_DRAFT_API /** * Constructs from a std::string. @@ -99,17 +97,15 @@ class U_COMMON_API StringPiece : public UMemory { */ StringPiece(const std::string& str) : ptr_(str.data()), length_(static_cast(str.size())) { } -#ifndef U_HIDE_DRAFT_API #if defined(__cpp_lib_char8_t) || defined(U_IN_DOXYGEN) /** * Constructs from a std::u8string. - * @draft ICU 67 + * @stable ICU 67 */ StringPiece(const std::u8string& str) : ptr_(reinterpret_cast(str.data())), length_(static_cast(str.size())) { } #endif -#endif // U_HIDE_DRAFT_API /** * Constructs from some other implementation of a string piece class, from any @@ -152,18 +148,16 @@ class U_COMMON_API StringPiece : public UMemory { * @stable ICU 4.2 */ StringPiece(const char* offset, int32_t len) : ptr_(offset), length_(len) { } -#ifndef U_HIDE_DRAFT_API #if defined(__cpp_char8_t) || defined(U_IN_DOXYGEN) /** * Constructs from a const char8_t * pointer and a specified length. * @param str a const char8_t * pointer (need not be terminated) * @param len the length of the string; must be non-negative - * @draft ICU 67 + * @stable ICU 67 */ StringPiece(const char8_t* str, int32_t len) : StringPiece(reinterpret_cast(str), len) {} #endif -#endif // U_HIDE_DRAFT_API /** * Substring of another StringPiece. @@ -233,13 +227,12 @@ class U_COMMON_API StringPiece : public UMemory { */ void set(const char* str); -#ifndef U_HIDE_DRAFT_API #if defined(__cpp_char8_t) || defined(U_IN_DOXYGEN) /** * Resets the stringpiece to refer to new data. * @param xdata pointer the new string data. Need not be NUL-terminated. * @param len the length of the new data - * @draft ICU 67 + * @stable ICU 67 */ inline void set(const char8_t* xdata, int32_t len) { set(reinterpret_cast(xdata), len); @@ -248,13 +241,12 @@ class U_COMMON_API StringPiece : public UMemory { /** * Resets the stringpiece to refer to new data. * @param str a pointer to a NUL-terminated string. - * @draft ICU 67 + * @stable ICU 67 */ inline void set(const char8_t* str) { set(reinterpret_cast(str)); } #endif -#endif // U_HIDE_DRAFT_API /** * Removes the first n string units. @@ -286,13 +278,12 @@ class U_COMMON_API StringPiece : public UMemory { } } -#ifndef U_HIDE_DRAFT_API /** * Searches the StringPiece for the given search string (needle); * @param needle The string for which to search. * @param offset Where to start searching within this string (haystack). * @return The offset of needle in haystack, or -1 if not found. - * @draft ICU 67 + * @stable ICU 67 */ int32_t find(StringPiece needle, int32_t offset); @@ -301,10 +292,9 @@ class U_COMMON_API StringPiece : public UMemory { * similar to std::string::compare(). * @param other The string to compare to. * @return below zero if this < other; above zero if this > other; 0 if this == other. - * @draft ICU 67 + * @stable ICU 67 */ int32_t compare(StringPiece other); -#endif // U_HIDE_DRAFT_API /** * Maximum integer, used as a default value for substring methods. diff --git a/thirdparty/icu4c/common/unicode/ubrk.h b/thirdparty/icu4c/common/unicode/ubrk.h index 37189a85984..1249b0b160d 100644 --- a/thirdparty/icu4c/common/unicode/ubrk.h +++ b/thirdparty/icu4c/common/unicode/ubrk.h @@ -296,6 +296,8 @@ ubrk_openBinaryRules(const uint8_t *binaryRules, int32_t rulesLength, const UChar * text, int32_t textLength, UErrorCode * status); +#ifndef U_HIDE_DEPRECATED_API + /** * Thread safe cloning operation * @param bi iterator to be cloned @@ -312,7 +314,7 @@ ubrk_openBinaryRules(const uint8_t *binaryRules, int32_t rulesLength, * @param status to indicate whether the operation went on smoothly or there were errors * An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used if any allocations were necessary. * @return pointer to the new clone - * @stable ICU 2.0 + * @deprecated ICU 69 Use ubrk_clone() instead. */ U_CAPI UBreakIterator * U_EXPORT2 ubrk_safeClone( @@ -321,6 +323,23 @@ ubrk_safeClone( int32_t *pBufferSize, UErrorCode *status); +#endif /* U_HIDE_DEPRECATED_API */ + +#ifndef U_HIDE_DRAFT_API + +/** + * Thread safe cloning operation. + * @param bi iterator to be cloned + * @param status to indicate whether the operation went on smoothly or there were errors + * @return pointer to the new clone + * @draft ICU 69 + */ +U_CAPI UBreakIterator * U_EXPORT2 +ubrk_clone(const UBreakIterator *bi, + UErrorCode *status); + +#endif // U_HIDE_DRAFT_API + #ifndef U_HIDE_DEPRECATED_API /** diff --git a/thirdparty/icu4c/common/unicode/ucnv.h b/thirdparty/icu4c/common/unicode/ucnv.h index 58f271cfb5a..5d784990f2c 100644 --- a/thirdparty/icu4c/common/unicode/ucnv.h +++ b/thirdparty/icu4c/common/unicode/ucnv.h @@ -1699,10 +1699,10 @@ ucnv_countAvailable(void); /** * Gets the canonical converter name of the specified converter from a list of - * all available converters contaied in the alias file. All converters + * all available converters contained in the alias file. All converters * in this list can be opened. * - * @param n the index to a converter available on the system (in the range [0..ucnv_countAvaiable()]) + * @param n the index to a converter available on the system (in the range [0..ucnv_countAvailable()]) * @return a pointer a string (library owned), or NULL if the index is out of bounds. * @see ucnv_countAvailable * @stable ICU 2.0 diff --git a/thirdparty/icu4c/common/unicode/ucnvsel.h b/thirdparty/icu4c/common/unicode/ucnvsel.h index 5e0a71cf351..3d7d3327f7d 100644 --- a/thirdparty/icu4c/common/unicode/ucnvsel.h +++ b/thirdparty/icu4c/common/unicode/ucnvsel.h @@ -45,11 +45,11 @@ * from the serialized form. */ +struct UConverterSelector; /** * @{ - * The selector data structure + * Typedef for selector data structure. */ -struct UConverterSelector; typedef struct UConverterSelector UConverterSelector; /** @} */ diff --git a/thirdparty/icu4c/common/unicode/unifilt.h b/thirdparty/icu4c/common/unicode/unifilt.h index 420e1a19056..7870b559391 100644 --- a/thirdparty/icu4c/common/unicode/unifilt.h +++ b/thirdparty/icu4c/common/unicode/unifilt.h @@ -40,8 +40,8 @@ U_NAMESPACE_BEGIN * * UnicodeFilter defines a protocol for selecting a * subset of the full range (U+0000 to U+10FFFF) of Unicode characters. - * Currently, filters are used in conjunction with classes like {@link - * Transliterator} to only process selected characters through a + * Currently, filters are used in conjunction with classes like + * {@link Transliterator} to only process selected characters through a * transformation. * *

Note: UnicodeFilter currently stubs out two pure virtual methods diff --git a/thirdparty/icu4c/common/unicode/uniset.h b/thirdparty/icu4c/common/unicode/uniset.h index 50b6360f3a7..8403c4026c3 100644 --- a/thirdparty/icu4c/common/unicode/uniset.h +++ b/thirdparty/icu4c/common/unicode/uniset.h @@ -178,8 +178,6 @@ class RuleCharacterIterator; * Unicode property * * - *

Warning: you cannot add an empty string ("") to a UnicodeSet.

- * *

Formal syntax

* * \htmlonly
\endhtmlonly @@ -601,7 +599,7 @@ public: /** * Make this object represent the range `start - end`. - * If `end > start` then this object is set to an empty range. + * If `start > end` then this object is set to an empty range. * A frozen set will not be modified. * * @param start first character in the set, inclusive @@ -1077,7 +1075,7 @@ public: /** * Adds the specified range to this set if it is not already * present. If this set already contains the specified range, - * the call leaves this set unchanged. If end > start + * the call leaves this set unchanged. If start > end * then an empty range is added, leaving the set unchanged. * This is equivalent to a boolean logic OR, or a set UNION. * A frozen set will not be modified. @@ -1095,6 +1093,9 @@ public: * present. If this set already contains the specified character, * the call leaves this set unchanged. * A frozen set will not be modified. + * + * @param c the character (code point) + * @return this object, for chaining * @stable ICU 2.0 */ UnicodeSet& add(UChar32 c); @@ -1104,8 +1105,8 @@ public: * present. If this set already contains the multicharacter, * the call leaves this set unchanged. * Thus "ch" => {"ch"} - *
Warning: you cannot add an empty string ("") to a UnicodeSet. * A frozen set will not be modified. + * * @param s the source string * @return this object, for chaining * @stable ICU 2.4 @@ -1124,8 +1125,8 @@ public: public: /** - * Adds each of the characters in this string to the set. Thus "ch" => {"c", "h"} - * If this set already any particular character, it has no effect on that character. + * Adds each of the characters in this string to the set. Note: "ch" => {"c", "h"} + * If this set already contains any particular character, it has no effect on that character. * A frozen set will not be modified. * @param s the source string * @return this object, for chaining @@ -1135,7 +1136,6 @@ public: /** * Retains EACH of the characters in this string. Note: "ch" == {"c", "h"} - * If this set already any particular character, it has no effect on that character. * A frozen set will not be modified. * @param s the source string * @return this object, for chaining @@ -1145,7 +1145,6 @@ public: /** * Complement EACH of the characters in this string. Note: "ch" == {"c", "h"} - * If this set already any particular character, it has no effect on that character. * A frozen set will not be modified. * @param s the source string * @return this object, for chaining @@ -1155,7 +1154,6 @@ public: /** * Remove EACH of the characters in this string. Note: "ch" == {"c", "h"} - * If this set already any particular character, it has no effect on that character. * A frozen set will not be modified. * @param s the source string * @return this object, for chaining @@ -1165,7 +1163,7 @@ public: /** * Makes a set from a multicharacter string. Thus "ch" => {"ch"} - *
Warning: you cannot add an empty string ("") to a UnicodeSet. + * * @param s the source string * @return a newly created set containing the given string. * The caller owns the return object and is responsible for deleting it. @@ -1185,15 +1183,13 @@ public: /** * Retain only the elements in this set that are contained in the - * specified range. If end > start then an empty range is + * specified range. If start > end then an empty range is * retained, leaving the set empty. This is equivalent to * a boolean logic AND, or a set INTERSECTION. * A frozen set will not be modified. * - * @param start first character, inclusive, of range to be retained - * to this set. - * @param end last character, inclusive, of range to be retained - * to this set. + * @param start first character, inclusive, of range + * @param end last character, inclusive, of range * @stable ICU 2.0 */ virtual UnicodeSet& retain(UChar32 start, UChar32 end); @@ -1202,14 +1198,31 @@ public: /** * Retain the specified character from this set if it is present. * A frozen set will not be modified. + * + * @param c the character (code point) + * @return this object, for chaining * @stable ICU 2.0 */ UnicodeSet& retain(UChar32 c); +#ifndef U_HIDE_DRAFT_API + /** + * Retains only the specified string from this set if it is present. + * Upon return this set will be empty if it did not contain s, or + * will only contain s if it did contain s. + * A frozen set will not be modified. + * + * @param s the source string + * @return this object, for chaining + * @draft ICU 69 + */ + UnicodeSet& retain(const UnicodeString &s); +#endif // U_HIDE_DRAFT_API + /** * Removes the specified range from this set if it is present. * The set will not contain the specified range once the call - * returns. If end > start then an empty range is + * returns. If start > end then an empty range is * removed, leaving the set unchanged. * A frozen set will not be modified. * @@ -1226,6 +1239,9 @@ public: * The set will not contain the specified range once the call * returns. * A frozen set will not be modified. + * + * @param c the character (code point) + * @return this object, for chaining * @stable ICU 2.0 */ UnicodeSet& remove(UChar32 c); @@ -1253,15 +1269,13 @@ public: /** * Complements the specified range in this set. Any character in * the range will be removed if it is in this set, or will be - * added if it is not in this set. If end > start + * added if it is not in this set. If start > end * then an empty range is complemented, leaving the set unchanged. * This is equivalent to a boolean logic XOR. * A frozen set will not be modified. * - * @param start first character, inclusive, of range to be removed - * from this set. - * @param end last character, inclusive, of range to be removed - * from this set. + * @param start first character, inclusive, of range + * @param end last character, inclusive, of range * @stable ICU 2.0 */ virtual UnicodeSet& complement(UChar32 start, UChar32 end); @@ -1271,16 +1285,18 @@ public: * will be removed if it is in this set, or will be added if it is * not in this set. * A frozen set will not be modified. + * + * @param c the character (code point) + * @return this object, for chaining * @stable ICU 2.0 */ UnicodeSet& complement(UChar32 c); /** * Complement the specified string in this set. - * The set will not contain the specified string once the call - * returns. - *
Warning: you cannot add an empty string ("") to a UnicodeSet. + * The string will be removed if it is in this set, or will be added if it is not in this set. * A frozen set will not be modified. + * * @param s the string to complement * @return this object, for chaining * @stable ICU 2.4 diff --git a/thirdparty/icu4c/common/unicode/unistr.h b/thirdparty/icu4c/common/unicode/unistr.h index 456389f265f..85bd9649515 100644 --- a/thirdparty/icu4c/common/unicode/unistr.h +++ b/thirdparty/icu4c/common/unicode/unistr.h @@ -44,9 +44,10 @@ struct UConverter; // unicode/ucnv.h #ifndef USTRING_H /** * \ingroup ustring_ustrlen + * @param s Pointer to sequence of UChars. + * @return Length of sequence. */ -U_CAPI int32_t U_EXPORT2 -u_strlen(const UChar *s); +U_CAPI int32_t U_EXPORT2 u_strlen(const UChar *s); #endif U_NAMESPACE_BEGIN @@ -2766,7 +2767,6 @@ public: * @param options Options bit set, usually 0. See U_TITLECASE_NO_LOWERCASE, * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. - * @param options Options bit set, see ucasemap_open(). * @return A reference to this. * @stable ICU 3.8 */ @@ -3614,7 +3614,7 @@ private: // turn a bogus string into an empty one void unBogus(); - // implements assigment operator, copy constructor, and fastCopyFrom() + // implements assignment operator, copy constructor, and fastCopyFrom() UnicodeString ©From(const UnicodeString &src, UBool fastCopy=false); // Copies just the fields without memory management. diff --git a/thirdparty/icu4c/common/unicode/urename.h b/thirdparty/icu4c/common/unicode/urename.h index fe59fdd893d..737f4b308ef 100644 --- a/thirdparty/icu4c/common/unicode/urename.h +++ b/thirdparty/icu4c/common/unicode/urename.h @@ -482,6 +482,7 @@ #define ubiditransform_open U_ICU_ENTRY_POINT_RENAME(ubiditransform_open) #define ubiditransform_transform U_ICU_ENTRY_POINT_RENAME(ubiditransform_transform) #define ublock_getCode U_ICU_ENTRY_POINT_RENAME(ublock_getCode) +#define ubrk_clone U_ICU_ENTRY_POINT_RENAME(ubrk_clone) #define ubrk_close U_ICU_ENTRY_POINT_RENAME(ubrk_close) #define ubrk_countAvailable U_ICU_ENTRY_POINT_RENAME(ubrk_countAvailable) #define ubrk_current U_ICU_ENTRY_POINT_RENAME(ubrk_current) @@ -534,6 +535,7 @@ #define ucal_getTimeZoneDisplayName U_ICU_ENTRY_POINT_RENAME(ucal_getTimeZoneDisplayName) #define ucal_getTimeZoneID U_ICU_ENTRY_POINT_RENAME(ucal_getTimeZoneID) #define ucal_getTimeZoneIDForWindowsID U_ICU_ENTRY_POINT_RENAME(ucal_getTimeZoneIDForWindowsID) +#define ucal_getTimeZoneOffsetFromLocal U_ICU_ENTRY_POINT_RENAME(ucal_getTimeZoneOffsetFromLocal) #define ucal_getTimeZoneTransitionDate U_ICU_ENTRY_POINT_RENAME(ucal_getTimeZoneTransitionDate) #define ucal_getType U_ICU_ENTRY_POINT_RENAME(ucal_getType) #define ucal_getWeekendTransition U_ICU_ENTRY_POINT_RENAME(ucal_getWeekendTransition) @@ -962,6 +964,7 @@ #define uhash_compareScriptSet U_ICU_ENTRY_POINT_RENAME(uhash_compareScriptSet) #define uhash_compareUChars U_ICU_ENTRY_POINT_RENAME(uhash_compareUChars) #define uhash_compareUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_compareUnicodeString) +#define uhash_containsKey U_ICU_ENTRY_POINT_RENAME(uhash_containsKey) #define uhash_count U_ICU_ENTRY_POINT_RENAME(uhash_count) #define uhash_deleteHashtable U_ICU_ENTRY_POINT_RENAME(uhash_deleteHashtable) #define uhash_deleteScriptSet U_ICU_ENTRY_POINT_RENAME(uhash_deleteScriptSet) @@ -970,6 +973,7 @@ #define uhash_find U_ICU_ENTRY_POINT_RENAME(uhash_find) #define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get) #define uhash_geti U_ICU_ENTRY_POINT_RENAME(uhash_geti) +#define uhash_getiAndFound U_ICU_ENTRY_POINT_RENAME(uhash_getiAndFound) #define uhash_hashCaselessUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_hashCaselessUnicodeString) #define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars) #define uhash_hashIChars U_ICU_ENTRY_POINT_RENAME(uhash_hashIChars) @@ -977,12 +981,15 @@ #define uhash_hashScriptSet U_ICU_ENTRY_POINT_RENAME(uhash_hashScriptSet) #define uhash_hashUChars U_ICU_ENTRY_POINT_RENAME(uhash_hashUChars) #define uhash_hashUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_hashUnicodeString) +#define uhash_icontainsKey U_ICU_ENTRY_POINT_RENAME(uhash_icontainsKey) #define uhash_iget U_ICU_ENTRY_POINT_RENAME(uhash_iget) #define uhash_igeti U_ICU_ENTRY_POINT_RENAME(uhash_igeti) +#define uhash_igetiAndFound U_ICU_ENTRY_POINT_RENAME(uhash_igetiAndFound) #define uhash_init U_ICU_ENTRY_POINT_RENAME(uhash_init) #define uhash_initSize U_ICU_ENTRY_POINT_RENAME(uhash_initSize) #define uhash_iput U_ICU_ENTRY_POINT_RENAME(uhash_iput) #define uhash_iputi U_ICU_ENTRY_POINT_RENAME(uhash_iputi) +#define uhash_iputiAllowZero U_ICU_ENTRY_POINT_RENAME(uhash_iputiAllowZero) #define uhash_iremove U_ICU_ENTRY_POINT_RENAME(uhash_iremove) #define uhash_iremovei U_ICU_ENTRY_POINT_RENAME(uhash_iremovei) #define uhash_nextElement U_ICU_ENTRY_POINT_RENAME(uhash_nextElement) @@ -990,6 +997,7 @@ #define uhash_openSize U_ICU_ENTRY_POINT_RENAME(uhash_openSize) #define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put) #define uhash_puti U_ICU_ENTRY_POINT_RENAME(uhash_puti) +#define uhash_putiAllowZero U_ICU_ENTRY_POINT_RENAME(uhash_putiAllowZero) #define uhash_remove U_ICU_ENTRY_POINT_RENAME(uhash_remove) #define uhash_removeAll U_ICU_ENTRY_POINT_RENAME(uhash_removeAll) #define uhash_removeElement U_ICU_ENTRY_POINT_RENAME(uhash_removeElement) @@ -1150,6 +1158,8 @@ #define ultag_isUnicodeLocaleKey U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleKey) #define ultag_isUnicodeLocaleType U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleType) #define ultag_isVariantSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isVariantSubtags) +#define umeas_getPrefixBase U_ICU_ENTRY_POINT_RENAME(umeas_getPrefixBase) +#define umeas_getPrefixPower U_ICU_ENTRY_POINT_RENAME(umeas_getPrefixPower) #define umsg_applyPattern U_ICU_ENTRY_POINT_RENAME(umsg_applyPattern) #define umsg_autoQuoteApostrophe U_ICU_ENTRY_POINT_RENAME(umsg_autoQuoteApostrophe) #define umsg_clone U_ICU_ENTRY_POINT_RENAME(umsg_clone) @@ -1672,6 +1682,9 @@ #define uset_compact U_ICU_ENTRY_POINT_RENAME(uset_compact) #define uset_complement U_ICU_ENTRY_POINT_RENAME(uset_complement) #define uset_complementAll U_ICU_ENTRY_POINT_RENAME(uset_complementAll) +#define uset_complementAllCodePoints U_ICU_ENTRY_POINT_RENAME(uset_complementAllCodePoints) +#define uset_complementRange U_ICU_ENTRY_POINT_RENAME(uset_complementRange) +#define uset_complementString U_ICU_ENTRY_POINT_RENAME(uset_complementString) #define uset_contains U_ICU_ENTRY_POINT_RENAME(uset_contains) #define uset_containsAll U_ICU_ENTRY_POINT_RENAME(uset_containsAll) #define uset_containsAllCodePoints U_ICU_ENTRY_POINT_RENAME(uset_containsAllCodePoints) @@ -1695,12 +1708,15 @@ #define uset_openPatternOptions U_ICU_ENTRY_POINT_RENAME(uset_openPatternOptions) #define uset_remove U_ICU_ENTRY_POINT_RENAME(uset_remove) #define uset_removeAll U_ICU_ENTRY_POINT_RENAME(uset_removeAll) +#define uset_removeAllCodePoints U_ICU_ENTRY_POINT_RENAME(uset_removeAllCodePoints) #define uset_removeAllStrings U_ICU_ENTRY_POINT_RENAME(uset_removeAllStrings) #define uset_removeRange U_ICU_ENTRY_POINT_RENAME(uset_removeRange) #define uset_removeString U_ICU_ENTRY_POINT_RENAME(uset_removeString) #define uset_resemblesPattern U_ICU_ENTRY_POINT_RENAME(uset_resemblesPattern) #define uset_retain U_ICU_ENTRY_POINT_RENAME(uset_retain) #define uset_retainAll U_ICU_ENTRY_POINT_RENAME(uset_retainAll) +#define uset_retainAllCodePoints U_ICU_ENTRY_POINT_RENAME(uset_retainAllCodePoints) +#define uset_retainString U_ICU_ENTRY_POINT_RENAME(uset_retainString) #define uset_serialize U_ICU_ENTRY_POINT_RENAME(uset_serialize) #define uset_serializedContains U_ICU_ENTRY_POINT_RENAME(uset_serializedContains) #define uset_set U_ICU_ENTRY_POINT_RENAME(uset_set) diff --git a/thirdparty/icu4c/common/unicode/uset.h b/thirdparty/icu4c/common/unicode/uset.h index 502ea8dc147..1d0daf9d098 100644 --- a/thirdparty/icu4c/common/unicode/uset.h +++ b/thirdparty/icu4c/common/unicode/uset.h @@ -582,8 +582,8 @@ U_CAPI void U_EXPORT2 uset_addString(USet* set, const UChar* str, int32_t strLen); /** - * Adds each of the characters in this string to the set. Thus "ch" => {"c", "h"} - * If this set already any particular character, it has no effect on that character. + * Adds each of the characters in this string to the set. Note: "ch" => {"c", "h"} + * If this set already contains any particular character, it has no effect on that character. * A frozen set will not be modified. * @param set the object to which to add the character * @param str the source string @@ -628,6 +628,20 @@ uset_removeRange(USet* set, UChar32 start, UChar32 end); U_CAPI void U_EXPORT2 uset_removeString(USet* set, const UChar* str, int32_t strLen); +#ifndef U_HIDE_DRAFT_API +/** + * Removes EACH of the characters in this string. Note: "ch" == {"c", "h"} + * A frozen set will not be modified. + * + * @param set the object to be modified + * @param str the string + * @param length the length of the string, or -1 if NUL-terminated + * @draft ICU 69 + */ +U_CAPI void U_EXPORT2 +uset_removeAllCodePoints(USet *set, const UChar *str, int32_t length); +#endif // U_HIDE_DRAFT_API + /** * Removes from this set all of its elements that are contained in the * specified set. This operation effectively modifies this @@ -650,15 +664,41 @@ uset_removeAll(USet* set, const USet* removeSet); * A frozen set will not be modified. * * @param set the object for which to retain only the specified range - * @param start first character, inclusive, of range to be retained - * to this set. - * @param end last character, inclusive, of range to be retained - * to this set. + * @param start first character, inclusive, of range + * @param end last character, inclusive, of range * @stable ICU 3.2 */ U_CAPI void U_EXPORT2 uset_retain(USet* set, UChar32 start, UChar32 end); +#ifndef U_HIDE_DRAFT_API +/** + * Retains only the specified string from this set if it is present. + * Upon return this set will be empty if it did not contain s, or + * will only contain s if it did contain s. + * A frozen set will not be modified. + * + * @param set the object to be modified + * @param str the string + * @param length the length of the string, or -1 if NUL-terminated + * @draft ICU 69 + */ +U_CAPI void U_EXPORT2 +uset_retainString(USet *set, const UChar *str, int32_t length); + +/** + * Retains EACH of the characters in this string. Note: "ch" == {"c", "h"} + * A frozen set will not be modified. + * + * @param set the object to be modified + * @param str the string + * @param length the length of the string, or -1 if NUL-terminated + * @draft ICU 69 + */ +U_CAPI void U_EXPORT2 +uset_retainAllCodePoints(USet *set, const UChar *str, int32_t length); +#endif // U_HIDE_DRAFT_API + /** * Retains only the elements in this set that are contained in the * specified set. In other words, removes from this set all of @@ -696,6 +736,49 @@ uset_compact(USet* set); U_CAPI void U_EXPORT2 uset_complement(USet* set); +#ifndef U_HIDE_DRAFT_API +/** + * Complements the specified range in this set. Any character in + * the range will be removed if it is in this set, or will be + * added if it is not in this set. If start > end + * then an empty range is complemented, leaving the set unchanged. + * This is equivalent to a boolean logic XOR. + * A frozen set will not be modified. + * + * @param set the object to be modified + * @param start first character, inclusive, of range + * @param end last character, inclusive, of range + * @draft ICU 69 + */ +U_CAPI void U_EXPORT2 +uset_complementRange(USet *set, UChar32 start, UChar32 end); + +/** + * Complements the specified string in this set. + * The string will be removed if it is in this set, or will be added if it is not in this set. + * A frozen set will not be modified. + * + * @param set the object to be modified + * @param str the string + * @param length the length of the string, or -1 if NUL-terminated + * @draft ICU 69 + */ +U_CAPI void U_EXPORT2 +uset_complementString(USet *set, const UChar *str, int32_t length); + +/** + * Complements EACH of the characters in this string. Note: "ch" == {"c", "h"} + * A frozen set will not be modified. + * + * @param set the object to be modified + * @param str the string + * @param length the length of the string, or -1 if NUL-terminated + * @draft ICU 69 + */ +U_CAPI void U_EXPORT2 +uset_complementAllCodePoints(USet *set, const UChar *str, int32_t length); +#endif // U_HIDE_DRAFT_API + /** * Complements in this set all elements contained in the specified * set. Any character in the other set will be removed if it is diff --git a/thirdparty/icu4c/common/unicode/ushape.h b/thirdparty/icu4c/common/unicode/ushape.h index fed4869abdb..14371edc8f9 100644 --- a/thirdparty/icu4c/common/unicode/ushape.h +++ b/thirdparty/icu4c/common/unicode/ushape.h @@ -323,7 +323,7 @@ u_shapeArabic(const UChar *source, int32_t sourceLength, #define U_SHAPE_PRESERVE_PRESENTATION 0x8000 /** Presentation form option: * Replace Arabic Presentation Forms-A and Arabic Presentationo Forms-B with - * their unshaped correspondants in range 0+06xx, before shaping. + * their unshaped correspondents in range 0+06xx, before shaping. * @stable ICU 3.6 */ #define U_SHAPE_PRESERVE_PRESENTATION_NOOP 0 diff --git a/thirdparty/icu4c/common/unicode/utrace.h b/thirdparty/icu4c/common/unicode/utrace.h index 28c313c582f..677486f4733 100644 --- a/thirdparty/icu4c/common/unicode/utrace.h +++ b/thirdparty/icu4c/common/unicode/utrace.h @@ -173,24 +173,23 @@ typedef enum UTraceFunctionNumber { UTRACE_RES_DATA_LIMIT, #endif // U_HIDE_INTERNAL_API -#ifndef U_HIDE_DRAFT_API /** * The lowest break iterator location. - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_START=0x4000, /** * Indicates that a character instance of break iterator was created. * - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_CREATE_CHARACTER = UTRACE_UBRK_START, /** * Indicates that a word instance of break iterator was created. * - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_CREATE_WORD, @@ -200,21 +199,21 @@ typedef enum UTraceFunctionNumber { * Provides one C-style string to UTraceData: the lb value ("", * "loose", "strict", or "normal"). * - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_CREATE_LINE, /** * Indicates that a sentence instance of break iterator was created. * - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_CREATE_SENTENCE, /** * Indicates that a title instance of break iterator was created. * - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_CREATE_TITLE, @@ -224,12 +223,10 @@ typedef enum UTraceFunctionNumber { * Provides one C-style string to UTraceData: the script code of what * the break engine cover ("Hani", "Khmr", "Laoo", "Mymr", or "Thai"). * - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_CREATE_BREAK_ENGINE, -#endif // U_HIDE_DRAFT_API - #ifndef U_HIDE_INTERNAL_API /** * One more than the highest normal break iterator trace location. diff --git a/thirdparty/icu4c/common/unicode/uvernum.h b/thirdparty/icu4c/common/unicode/uvernum.h index a46481a3fe6..b09d4943c1c 100644 --- a/thirdparty/icu4c/common/unicode/uvernum.h +++ b/thirdparty/icu4c/common/unicode/uvernum.h @@ -60,13 +60,13 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 68 +#define U_ICU_VERSION_MAJOR_NUM 69 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_MINOR_NUM 2 +#define U_ICU_VERSION_MINOR_NUM 1 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU @@ -86,7 +86,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _68 +#define U_ICU_VERSION_SUFFIX _69 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -139,7 +139,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "68.2" +#define U_ICU_VERSION "69.1" /** * The current ICU library major version number as a string, for library name suffixes. @@ -152,13 +152,13 @@ * * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "68" +#define U_ICU_VERSION_SHORT "69" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "68.2" +#define U_ICU_DATA_VERSION "69.1" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/thirdparty/icu4c/common/uniset.cpp b/thirdparty/icu4c/common/uniset.cpp index b73d612f246..461e5a7197e 100644 --- a/thirdparty/icu4c/common/uniset.cpp +++ b/thirdparty/icu4c/common/uniset.cpp @@ -30,24 +30,6 @@ #include "bmpset.h" #include "unisetspan.h" -// Define UChar constants using hex for EBCDIC compatibility -// Used #define to reduce private static exports and memory access time. -#define SET_OPEN ((UChar)0x005B) /*[*/ -#define SET_CLOSE ((UChar)0x005D) /*]*/ -#define HYPHEN ((UChar)0x002D) /*-*/ -#define COMPLEMENT ((UChar)0x005E) /*^*/ -#define COLON ((UChar)0x003A) /*:*/ -#define BACKSLASH ((UChar)0x005C) /*\*/ -#define INTERSECTION ((UChar)0x0026) /*&*/ -#define UPPER_U ((UChar)0x0055) /*U*/ -#define LOWER_U ((UChar)0x0075) /*u*/ -#define OPEN_BRACE ((UChar)123) /*{*/ -#define CLOSE_BRACE ((UChar)125) /*}*/ -#define UPPER_P ((UChar)0x0050) /*P*/ -#define LOWER_P ((UChar)0x0070) /*p*/ -#define UPPER_N ((UChar)78) /*N*/ -#define EQUALS ((UChar)0x003D) /*=*/ - // HIGH_VALUE > all valid values. 110000 for codepoints #define UNICODESET_HIGH 0x0110000 @@ -444,7 +426,6 @@ UBool UnicodeSet::contains(UChar32 start, UChar32 end) const { * @return true if this set contains the specified string */ UBool UnicodeSet::contains(const UnicodeString& s) const { - if (s.length() == 0) return FALSE; int32_t cp = getSingleCP(s); if (cp < 0) { return stringsContains(s); @@ -559,11 +540,9 @@ UBool UnicodeSet::matchesIndexValue(uint8_t v) const { if (hasStrings()) { for (i=0; isize(); ++i) { const UnicodeString& s = *(const UnicodeString*)strings->elementAt(i); - //if (s.length() == 0) { - // // Empty strings match everything - // return TRUE; - //} - // assert(s.length() != 0); // We enforce this elsewhere + if (s.isEmpty()) { + continue; // skip the empty string + } UChar32 c = s.char32At(0); if ((c & 0xFF) == v) { return TRUE; @@ -582,9 +561,6 @@ UMatchDegree UnicodeSet::matches(const Replaceable& text, int32_t limit, UBool incremental) { if (offset == limit) { - // Strings, if any, have length != 0, so we don't worry - // about them here. If we ever allow zero-length strings - // we much check for them here. if (contains(U_ETHER)) { return incremental ? U_PARTIAL_MATCH : U_MATCH; } else { @@ -614,11 +590,9 @@ UMatchDegree UnicodeSet::matches(const Replaceable& text, for (i=0; isize(); ++i) { const UnicodeString& trial = *(const UnicodeString*)strings->elementAt(i); - - //if (trial.length() == 0) { - // return U_MATCH; // null-string always matches - //} - // assert(trial.length() != 0); // We ensure this elsewhere + if (trial.isEmpty()) { + continue; // skip the empty string + } UChar c = trial.charAt(forward ? 0 : trial.length() - 1); @@ -971,12 +945,12 @@ UnicodeSet& UnicodeSet::add(UChar32 c) { * present. If this set already contains the multicharacter, * the call leaves this set unchanged. * Thus "ch" => {"ch"} - *
Warning: you cannot add an empty string ("") to a UnicodeSet. + * * @param s the source string * @return the modified set, for chaining */ UnicodeSet& UnicodeSet::add(const UnicodeString& s) { - if (s.length() == 0 || isFrozen() || isBogus()) return *this; + if (isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { if (!stringsContains(s)) { @@ -991,8 +965,7 @@ UnicodeSet& UnicodeSet::add(const UnicodeString& s) { /** * Adds the given string, in order, to 'strings'. The given string - * must have been checked by the caller to not be empty and to not - * already be in 'strings'. + * must have been checked by the caller to not already be in 'strings'. */ void UnicodeSet::_add(const UnicodeString& s) { if (isFrozen() || isBogus()) { @@ -1021,16 +994,13 @@ void UnicodeSet::_add(const UnicodeString& s) { * @param string to test */ int32_t UnicodeSet::getSingleCP(const UnicodeString& s) { - //if (s.length() < 1) { - // throw new IllegalArgumentException("Can't use zero-length strings in UnicodeSet"); - //} - if (s.length() > 2) return -1; - if (s.length() == 1) return s.charAt(0); - - // at this point, len = 2 - UChar32 cp = s.char32At(0); - if (cp > 0xFFFF) { // is surrogate pair - return cp; + int32_t sLength = s.length(); + if (sLength == 1) return s.charAt(0); + if (sLength == 2) { + UChar32 cp = s.char32At(0); + if (cp > 0xFFFF) { // is surrogate pair + return cp; + } } return -1; } @@ -1150,6 +1120,26 @@ UnicodeSet& UnicodeSet::retain(UChar32 c) { return retain(c, c); } +UnicodeSet& UnicodeSet::retain(const UnicodeString &s) { + if (isFrozen() || isBogus()) { return *this; } + UChar32 cp = getSingleCP(s); + if (cp < 0) { + bool isIn = stringsContains(s); + // Check for getRangeCount() first to avoid somewhat-expensive size() + // when there are single code points. + if (isIn && getRangeCount() == 0 && size() == 1) { + return *this; + } + clear(); + if (isIn) { + _add(s); + } + } else { + retain(cp, cp); + } + return *this; +} + /** * Removes the specified range from this set if it is present. * The set will not contain the specified range once the call @@ -1186,7 +1176,7 @@ UnicodeSet& UnicodeSet::remove(UChar32 c) { * @return the modified set, for chaining */ UnicodeSet& UnicodeSet::remove(const UnicodeString& s) { - if (s.length() == 0 || isFrozen() || isBogus()) return *this; + if (isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { if (strings != nullptr && strings->removeElement((void*) &s)) { @@ -1252,12 +1242,12 @@ UnicodeSet& UnicodeSet::complement(void) { * Complement the specified string in this set. * The set will not contain the specified string once the call * returns. - *
Warning: you cannot add an empty string ("") to a UnicodeSet. + * * @param s the string to complement * @return this object, for chaining */ UnicodeSet& UnicodeSet::complement(const UnicodeString& s) { - if (s.length() == 0 || isFrozen() || isBogus()) return *this; + if (isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { if (stringsContains(s)) { @@ -2001,22 +1991,22 @@ escapeUnprintable) { } // Okay to let ':' pass through switch (c) { - case SET_OPEN: - case SET_CLOSE: - case HYPHEN: - case COMPLEMENT: - case INTERSECTION: - case BACKSLASH: - case OPEN_BRACE: - case CLOSE_BRACE: - case COLON: + case u'[': + case u']': + case u'-': + case u'^': + case u'&': + case u'\\': + case u'{': + case u'}': + case u':': case SymbolTable::SYMBOL_REF: - buf.append(BACKSLASH); + buf.append(u'\\'); break; default: // Escape whitespace if (PatternProps::isWhiteSpace(c)) { - buf.append(BACKSLASH); + buf.append(u'\\'); } break; } @@ -2049,7 +2039,7 @@ UnicodeString& UnicodeSet::_toPattern(UnicodeString& result, backslashCount = 0; } else { result.append(c); - if (c == BACKSLASH) { + if (c == u'\\') { ++backslashCount; } else { backslashCount = 0; @@ -2082,13 +2072,13 @@ UnicodeString& UnicodeSet::toPattern(UnicodeString& result, UnicodeString& UnicodeSet::_generatePattern(UnicodeString& result, UBool escapeUnprintable) const { - result.append(SET_OPEN); + result.append(u'['); // // Check against the predefined categories. We implicitly build // // up ALL category sets the first time toPattern() is called. // for (int8_t cat=0; catsize(); ++i) { - result.append(OPEN_BRACE); + result.append(u'{'); _appendToPat(result, *(const UnicodeString*) strings->elementAt(i), escapeUnprintable); - result.append(CLOSE_BRACE); + result.append(u'}'); } } - return result.append(SET_CLOSE); + return result.append(u']'); } /** diff --git a/thirdparty/icu4c/common/uniset_props.cpp b/thirdparty/icu4c/common/uniset_props.cpp index 37277fcb751..8fde5abcddb 100644 --- a/thirdparty/icu4c/common/uniset_props.cpp +++ b/thirdparty/icu4c/common/uniset_props.cpp @@ -47,31 +47,6 @@ U_NAMESPACE_USE -// Define UChar constants using hex for EBCDIC compatibility -// Used #define to reduce private static exports and memory access time. -#define SET_OPEN ((UChar)0x005B) /*[*/ -#define SET_CLOSE ((UChar)0x005D) /*]*/ -#define HYPHEN ((UChar)0x002D) /*-*/ -#define COMPLEMENT ((UChar)0x005E) /*^*/ -#define COLON ((UChar)0x003A) /*:*/ -#define BACKSLASH ((UChar)0x005C) /*\*/ -#define INTERSECTION ((UChar)0x0026) /*&*/ -#define UPPER_U ((UChar)0x0055) /*U*/ -#define LOWER_U ((UChar)0x0075) /*u*/ -#define OPEN_BRACE ((UChar)123) /*{*/ -#define CLOSE_BRACE ((UChar)125) /*}*/ -#define UPPER_P ((UChar)0x0050) /*P*/ -#define LOWER_P ((UChar)0x0070) /*p*/ -#define UPPER_N ((UChar)78) /*N*/ -#define EQUALS ((UChar)0x003D) /*=*/ - -//static const UChar POSIX_OPEN[] = { SET_OPEN,COLON,0 }; // "[:" -static const UChar POSIX_CLOSE[] = { COLON,SET_CLOSE,0 }; // ":]" -//static const UChar PERL_OPEN[] = { BACKSLASH,LOWER_P,0 }; // "\\p" -//static const UChar PERL_CLOSE[] = { CLOSE_BRACE,0 }; // "}" -//static const UChar NAME_OPEN[] = { BACKSLASH,UPPER_N,0 }; // "\\N" -static const UChar HYPHEN_RIGHT_BRACE[] = {HYPHEN,SET_CLOSE,0}; /*-]*/ - // Special property set IDs static const char ANY[] = "ANY"; // [\u0000-\U0010FFFF] static const char ASCII[] = "ASCII"; // [\u0000-\u007F] @@ -81,12 +56,6 @@ static const char ASSIGNED[] = "Assigned"; // [:^Cn:] #define NAME_PROP "na" #define NAME_PROP_LENGTH 2 -/** - * Delimiter string used in patterns to close a category reference: - * ":]". Example: "[:Lu:]". - */ -//static const UChar CATEGORY_CLOSE[] = {COLON, SET_CLOSE, 0x0000}; /* ":]" */ - // Cached sets ------------------------------------------------------------- *** U_CDECL_BEGIN @@ -140,27 +109,27 @@ uniset_getUnicode32Instance(UErrorCode &errorCode) { static inline UBool isPerlOpen(const UnicodeString &pattern, int32_t pos) { UChar c; - return pattern.charAt(pos)==BACKSLASH && ((c=pattern.charAt(pos+1))==LOWER_P || c==UPPER_P); + return pattern.charAt(pos)==u'\\' && ((c=pattern.charAt(pos+1))==u'p' || c==u'P'); } /*static inline UBool isPerlClose(const UnicodeString &pattern, int32_t pos) { - return pattern.charAt(pos)==CLOSE_BRACE; + return pattern.charAt(pos)==u'}'; }*/ static inline UBool isNameOpen(const UnicodeString &pattern, int32_t pos) { - return pattern.charAt(pos)==BACKSLASH && pattern.charAt(pos+1)==UPPER_N; + return pattern.charAt(pos)==u'\\' && pattern.charAt(pos+1)==u'N'; } static inline UBool isPOSIXOpen(const UnicodeString &pattern, int32_t pos) { - return pattern.charAt(pos)==SET_OPEN && pattern.charAt(pos+1)==COLON; + return pattern.charAt(pos)==u'[' && pattern.charAt(pos+1)==u':'; } /*static inline UBool isPOSIXClose(const UnicodeString &pattern, int32_t pos) { - return pattern.charAt(pos)==COLON && pattern.charAt(pos+1)==SET_CLOSE; + return pattern.charAt(pos)==u':' && pattern.charAt(pos+1)==u']'; }*/ // TODO memory debugging provided inside uniset.cpp @@ -326,9 +295,8 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, while (mode != 2 && !chars.atEnd()) { U_ASSERT((lastItem == 0 && op == 0) || - (lastItem == 1 && (op == 0 || op == HYPHEN /*'-'*/)) || - (lastItem == 2 && (op == 0 || op == HYPHEN /*'-'*/ || - op == INTERSECTION /*'&'*/))); + (lastItem == 1 && (op == 0 || op == u'-')) || + (lastItem == 2 && (op == 0 || op == u'-' || op == u'&'))); UChar32 c = 0; UBool literal = FALSE; @@ -356,27 +324,27 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; - if (c == 0x5B /*'['*/ && !literal) { + if (c == u'[' && !literal) { if (mode == 1) { chars.setPos(backup); // backup setMode = 1; } else { // Handle opening '[' delimiter mode = 1; - patLocal.append((UChar) 0x5B /*'['*/); + patLocal.append(u'['); chars.getPos(backup); // prepare to backup c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; - if (c == 0x5E /*'^'*/ && !literal) { + if (c == u'^' && !literal) { invert = TRUE; - patLocal.append((UChar) 0x5E /*'^'*/); + patLocal.append(u'^'); chars.getPos(backup); // prepare to backup c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; } // Fall through to handle special leading '-'; // otherwise restart loop for nested [], \p{}, etc. - if (c == HYPHEN /*'-'*/) { + if (c == u'-') { literal = TRUE; // Fall through to handle literal '-' below } else { @@ -418,7 +386,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, op = 0; } - if (op == HYPHEN /*'-'*/ || op == INTERSECTION /*'&'*/) { + if (op == u'-' || op == u'&') { patLocal.append(op); } @@ -454,10 +422,10 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, } switch (op) { - case HYPHEN: /*'-'*/ + case u'-': removeAll(*nested); break; - case INTERSECTION: /*'&'*/ + case u'&': retainAll(*nested); break; case 0: @@ -483,24 +451,24 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, if (!literal) { switch (c) { - case 0x5D /*']'*/: + case u']': if (lastItem == 1) { add(lastChar, lastChar); _appendToPat(patLocal, lastChar, FALSE); } // Treat final trailing '-' as a literal - if (op == HYPHEN /*'-'*/) { + if (op == u'-') { add(op, op); patLocal.append(op); - } else if (op == INTERSECTION /*'&'*/) { + } else if (op == u'&') { // syntaxError(chars, "Trailing '&'"); ec = U_MALFORMED_SET; return; } - patLocal.append((UChar) 0x5D /*']'*/); + patLocal.append(u']'); mode = 2; continue; - case HYPHEN /*'-'*/: + case u'-': if (op == 0) { if (lastItem != 0) { op = (UChar) c; @@ -510,8 +478,8 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, add(c, c); c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; - if (c == 0x5D /*']'*/ && !literal) { - patLocal.append(HYPHEN_RIGHT_BRACE, 2); + if (c == u']' && !literal) { + patLocal.append(u"-]", 2); mode = 2; continue; } @@ -520,7 +488,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, // syntaxError(chars, "'-' not after char or set"); ec = U_MALFORMED_SET; return; - case INTERSECTION /*'&'*/: + case u'&': if (lastItem == 2 && op == 0) { op = (UChar) c; continue; @@ -528,11 +496,11 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, // syntaxError(chars, "'&' not after set"); ec = U_MALFORMED_SET; return; - case 0x5E /*'^'*/: + case u'^': // syntaxError(chars, "'^' not after '['"); ec = U_MALFORMED_SET; return; - case 0x7B /*'{'*/: + case u'{': if (op != 0) { // syntaxError(chars, "Missing operand after operator"); ec = U_MALFORMED_SET; @@ -549,13 +517,13 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, while (!chars.atEnd()) { c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; - if (c == 0x7D /*'}'*/ && !literal) { + if (c == u'}' && !literal) { ok = TRUE; break; } buf.append(c); } - if (buf.length() < 1 || !ok) { + if (!ok) { // syntaxError(chars, "Invalid multicharacter string"); ec = U_MALFORMED_SET; return; @@ -565,9 +533,9 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, // we don't need to drop through to the further // processing add(buf); - patLocal.append((UChar) 0x7B /*'{'*/); + patLocal.append(u'{'); _appendToPat(patLocal, buf, FALSE); - patLocal.append((UChar) 0x7D /*'}'*/); + patLocal.append(u'}'); continue; case SymbolTable::SYMBOL_REF: // symbols nosymbols @@ -580,7 +548,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, chars.getPos(backup); c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; - UBool anchor = (c == 0x5D /*']'*/ && !literal); + UBool anchor = (c == u']' && !literal); if (symbols == 0 && !anchor) { c = SymbolTable::SYMBOL_REF; chars.setPos(backup); @@ -594,7 +562,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, add(U_ETHER); usePat = TRUE; patLocal.append((UChar) SymbolTable::SYMBOL_REF); - patLocal.append((UChar) 0x5D /*']'*/); + patLocal.append(u']'); mode = 2; continue; } @@ -617,7 +585,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, lastChar = c; break; case 1: - if (op == HYPHEN /*'-'*/) { + if (op == u'-') { if (lastChar >= c) { // Don't allow redundant (a-a) or empty (b-a) ranges; // these are most likely typos. @@ -1036,11 +1004,11 @@ UBool UnicodeSet::resemblesPropertyPattern(RuleCharacterIterator& chars, RuleCharacterIterator::Pos pos; chars.getPos(pos); UChar32 c = chars.next(iterOpts, literal, ec); - if (c == 0x5B /*'['*/ || c == 0x5C /*'\\'*/) { + if (c == u'[' || c == u'\\') { UChar32 d = chars.next(iterOpts & ~RuleCharacterIterator::SKIP_WHITESPACE, literal, ec); - result = (c == 0x5B /*'['*/) ? (d == 0x3A /*':'*/) : - (d == 0x4E /*'N'*/ || d == 0x70 /*'p'*/ || d == 0x50 /*'P'*/); + result = (c == u'[') ? (d == u':') : + (d == u'N' || d == u'p' || d == u'P'); } chars.setPos(pos); return result && U_SUCCESS(ec); @@ -1071,17 +1039,17 @@ UnicodeSet& UnicodeSet::applyPropertyPattern(const UnicodeString& pattern, posix = TRUE; pos += 2; pos = ICU_Utility::skipWhitespace(pattern, pos); - if (pos < pattern.length() && pattern.charAt(pos) == COMPLEMENT) { + if (pos < pattern.length() && pattern.charAt(pos) == u'^') { ++pos; invert = TRUE; } } else if (isPerlOpen(pattern, pos) || isNameOpen(pattern, pos)) { UChar c = pattern.charAt(pos+1); - invert = (c == UPPER_P); - isName = (c == UPPER_N); + invert = (c == u'P'); + isName = (c == u'N'); pos += 2; pos = ICU_Utility::skipWhitespace(pattern, pos); - if (pos == pattern.length() || pattern.charAt(pos++) != OPEN_BRACE) { + if (pos == pattern.length() || pattern.charAt(pos++) != u'{') { // Syntax error; "\p" or "\P" not followed by "{" FAIL(ec); } @@ -1093,9 +1061,9 @@ UnicodeSet& UnicodeSet::applyPropertyPattern(const UnicodeString& pattern, // Look for the matching close delimiter, either :] or } int32_t close; if (posix) { - close = pattern.indexOf(POSIX_CLOSE, 2, pos); + close = pattern.indexOf(u":]", 2, pos); } else { - close = pattern.indexOf(CLOSE_BRACE, pos); + close = pattern.indexOf(u'}', pos); } if (close < 0) { // Syntax error; close delimiter missing @@ -1105,7 +1073,7 @@ UnicodeSet& UnicodeSet::applyPropertyPattern(const UnicodeString& pattern, // Look for an '=' sign. If this is present, we will parse a // medium \p{gc=Cf} or long \p{GeneralCategory=Format} // pattern. - int32_t equals = pattern.indexOf(EQUALS, pos); + int32_t equals = pattern.indexOf(u'=', pos); UnicodeString propName, valueName; if (equals >= 0 && equals < close && !isName) { // Equals seen; parse medium/long pattern diff --git a/thirdparty/icu4c/common/unisetspan.cpp b/thirdparty/icu4c/common/unisetspan.cpp index 68e44d91ee7..fe0d74f5b28 100644 --- a/thirdparty/icu4c/common/unisetspan.cpp +++ b/thirdparty/icu4c/common/unisetspan.cpp @@ -231,6 +231,9 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSet &set, const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); const UChar *s16=string.getBuffer(); int32_t length16=string.length(); + if (length16==0) { + continue; // skip the empty string + } UBool thisRelevant; spanLength=spanSet.span(s16, length16, USET_SPAN_CONTAINED); if(spanLength0) { // Relevant string. if(which&UTF16) { if(which&CONTAINED) { if(which&FWD) { @@ -362,7 +365,7 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSet &set, addToSpanNotSet(c); } } - } else { // Irrelevant string. + } else { // Irrelevant string. (Also the empty string.) if(which&UTF8) { if(which&CONTAINED) { // Only necessary for LONGEST_MATCH. uint8_t *s8=utf8+utf8Count; @@ -653,11 +656,12 @@ int32_t UnicodeSetStringSpan::span(const UChar *s, int32_t length, USetSpanCondi for(i=0; i0); // Try to match this string at pos-overlap..pos. if(overlap>=LONG_SPAN) { @@ -697,6 +701,9 @@ int32_t UnicodeSetStringSpan::span(const UChar *s, int32_t length, USetSpanCondi const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); const UChar *s16=string.getBuffer(); int32_t length16=string.length(); + if (length16==0) { + continue; // skip the empty string + } // Try to match this string at pos-overlap..pos. if(overlap>=LONG_SPAN) { @@ -817,11 +824,12 @@ int32_t UnicodeSetStringSpan::spanBack(const UChar *s, int32_t length, USetSpanC for(i=0; i0); // Try to match this string at pos-(length16-overlap)..pos-length16. if(overlap>=LONG_SPAN) { @@ -863,6 +871,9 @@ int32_t UnicodeSetStringSpan::spanBack(const UChar *s, int32_t length, USetSpanC const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); const UChar *s16=string.getBuffer(); int32_t length16=string.length(); + if (length16==0) { + continue; // skip the empty string + } // Try to match this string at pos-(length16-overlap)..pos-length16. if(overlap>=LONG_SPAN) { @@ -1358,11 +1369,12 @@ int32_t UnicodeSetStringSpan::spanNot(const UChar *s, int32_t length) const { // Try to match the strings at pos. for(i=0; i0); if(length16<=rest && matches16CPB(s, pos, length, s16, length16)) { return pos; // There is a set element at pos. } @@ -1401,11 +1413,12 @@ int32_t UnicodeSetStringSpan::spanNotBack(const UChar *s, int32_t length) const // it is easier and we only need to know whether the string is irrelevant // which is the same in either array. if(spanLengths[i]==ALL_CP_CONTAINED) { - continue; // Irrelevant string. + continue; // Irrelevant string. (Also the empty string.) } const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); const UChar *s16=string.getBuffer(); int32_t length16=string.length(); + U_ASSERT(length>0); if(length16<=pos && matches16CPB(s, pos-length16, length, s16, length16)) { return pos; // There is a set element at pos. } diff --git a/thirdparty/icu4c/common/uprops.h b/thirdparty/icu4c/common/uprops.h index 8bf929919f2..09830bdeb99 100644 --- a/thirdparty/icu4c/common/uprops.h +++ b/thirdparty/icu4c/common/uprops.h @@ -310,55 +310,12 @@ u_isgraphPOSIX(UChar32 c); U_CFUNC UBool u_isprintPOSIX(UChar32 c); -/** Turn a bit index into a bit flag. @internal */ -#define FLAG(n) ((uint32_t)1<<(n)) - -/** Flags for general categories in the order of UCharCategory. @internal */ -#define _Cn FLAG(U_GENERAL_OTHER_TYPES) -#define _Lu FLAG(U_UPPERCASE_LETTER) -#define _Ll FLAG(U_LOWERCASE_LETTER) -#define _Lt FLAG(U_TITLECASE_LETTER) -#define _Lm FLAG(U_MODIFIER_LETTER) -/* #define _Lo FLAG(U_OTHER_LETTER) -- conflicts with MS Visual Studio 9.0 xiosbase */ -#define _Mn FLAG(U_NON_SPACING_MARK) -#define _Me FLAG(U_ENCLOSING_MARK) -#define _Mc FLAG(U_COMBINING_SPACING_MARK) -#define _Nd FLAG(U_DECIMAL_DIGIT_NUMBER) -#define _Nl FLAG(U_LETTER_NUMBER) -#define _No FLAG(U_OTHER_NUMBER) -#define _Zs FLAG(U_SPACE_SEPARATOR) -#define _Zl FLAG(U_LINE_SEPARATOR) -#define _Zp FLAG(U_PARAGRAPH_SEPARATOR) -#define _Cc FLAG(U_CONTROL_CHAR) -#define _Cf FLAG(U_FORMAT_CHAR) -#define _Co FLAG(U_PRIVATE_USE_CHAR) -#define _Cs FLAG(U_SURROGATE) -#define _Pd FLAG(U_DASH_PUNCTUATION) -#define _Ps FLAG(U_START_PUNCTUATION) -/* #define _Pe FLAG(U_END_PUNCTUATION) -- conflicts with MS Visual Studio 9.0 xlocnum */ -/* #define _Pc FLAG(U_CONNECTOR_PUNCTUATION) -- conflicts with MS Visual Studio 9.0 streambuf */ -#define _Po FLAG(U_OTHER_PUNCTUATION) -#define _Sm FLAG(U_MATH_SYMBOL) -#define _Sc FLAG(U_CURRENCY_SYMBOL) -#define _Sk FLAG(U_MODIFIER_SYMBOL) -#define _So FLAG(U_OTHER_SYMBOL) -#define _Pi FLAG(U_INITIAL_PUNCTUATION) -/* #define _Pf FLAG(U_FINAL_PUNCTUATION) -- conflicts with MS Visual Studio 9.0 streambuf */ - /** Some code points. @internal */ enum { TAB =0x0009, LF =0x000a, FF =0x000c, CR =0x000d, - U_A =0x0041, - U_F =0x0046, - U_Z =0x005a, - U_a =0x0061, - U_f =0x0066, - U_z =0x007a, - DEL =0x007f, - NL =0x0085, NBSP =0x00a0, CGJ =0x034f, FIGURESP=0x2007, @@ -367,15 +324,6 @@ enum { ZWJ =0x200d, RLM =0x200f, NNBSP =0x202f, - WJ =0x2060, - INHSWAP =0x206a, - NOMDIG =0x206f, - U_FW_A =0xff21, - U_FW_F =0xff26, - U_FW_Z =0xff3a, - U_FW_a =0xff41, - U_FW_f =0xff46, - U_FW_z =0xff5a, ZWNBSP =0xfeff }; diff --git a/thirdparty/icu4c/common/uresbund.cpp b/thirdparty/icu4c/common/uresbund.cpp index 2ece87897d7..5ea4187100e 100644 --- a/thirdparty/icu4c/common/uresbund.cpp +++ b/thirdparty/icu4c/common/uresbund.cpp @@ -91,6 +91,15 @@ static UBool chopLocale(char *name) { return FALSE; } +/** + * Called to check whether a name without '_' needs to be checked for a parent. + * Some code had assumed that locale IDs with '_' could not have a non-root parent. + * We may want a better way of doing this. + */ +static UBool mayHaveParent(char *name) { + return (name[0] != 0 && uprv_strstr("nb nn",name) != nullptr); +} + /** * Internal function */ @@ -529,8 +538,8 @@ loadParentsExceptRoot(UResourceDataEntry *&t1, char name[], int32_t nameCapacity, UBool usingUSRData, char usrDataPath[], UErrorCode *status) { if (U_FAILURE(*status)) { return FALSE; } - UBool hasChopped = TRUE; - while (hasChopped && t1->fParent == NULL && !t1->fData.noFallback && + UBool checkParent = TRUE; + while (checkParent && t1->fParent == NULL && !t1->fData.noFallback && res_getResource(&t1->fData,"%%ParentIsRoot") == RES_BOGUS) { Resource parentRes = res_getResource(&t1->fData, "%%Parent"); if (parentRes != RES_BOGUS) { // An explicit parent was found. @@ -573,7 +582,7 @@ loadParentsExceptRoot(UResourceDataEntry *&t1, } } t1 = t2; - hasChopped = chopLocale(name); + checkParent = chopLocale(name) || mayHaveParent(name); } return TRUE; } @@ -692,7 +701,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, } } } - if (hasChopped && !isRoot) { + if ((hasChopped || mayHaveParent(name)) && !isRoot) { if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) { goto finish; } @@ -716,7 +725,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, hasRealData = TRUE; isDefault = TRUE; // TODO: Why not if (usingUSRData) { ... } like in the non-default-locale code path? - if (hasChopped && !isRoot) { + if ((hasChopped || mayHaveParent(name)) && !isRoot) { if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) { goto finish; } @@ -1908,6 +1917,8 @@ ures_getByKeyWithFallback(const UResourceBundle *resB, } else { break; } + } else if (res == RES_BOGUS) { + break; } } while(*myPath); /* Continue until the whole path is consumed */ } @@ -3019,7 +3030,7 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status) U_CAPI UBool U_EXPORT2 ures_equal(const UResourceBundle* res1, const UResourceBundle* res2){ if(res1==NULL || res2==NULL){ - return res1==res2; /* pointer comparision */ + return res1==res2; /* pointer comparison */ } if(res1->fKey==NULL|| res2->fKey==NULL){ return (res1->fKey==res2->fKey); diff --git a/thirdparty/icu4c/common/uresdata.cpp b/thirdparty/icu4c/common/uresdata.cpp index ae731e45442..9af081be408 100644 --- a/thirdparty/icu4c/common/uresdata.cpp +++ b/thirdparty/icu4c/common/uresdata.cpp @@ -960,14 +960,6 @@ res_findResource(const ResourceData *pResData, Resource r, char** path, const ch if(URES_IS_TABLE(type)) { *key = pathP; t2 = res_getTableItemByKey(pResData, t1, &indexR, key); - if(t2 == RES_BOGUS) { - /* if we fail to get the resource by key, maybe we got an index */ - indexR = uprv_strtol(pathP, &closeIndex, 10); - if(indexR >= 0 && *closeIndex == 0 && (*pathP != '0' || closeIndex - pathP == 1)) { - /* if we indeed have an index, try to get the item by index */ - t2 = res_getTableItemByIndex(pResData, t1, indexR, key); - } // else t2 is already RES_BOGUS - } } else if(URES_IS_ARRAY(type)) { indexR = uprv_strtol(pathP, &closeIndex, 10); if(indexR >= 0 && *closeIndex == 0) { diff --git a/thirdparty/icu4c/common/uresimp.h b/thirdparty/icu4c/common/uresimp.h index 69d82566fe0..f038dedace3 100644 --- a/thirdparty/icu4c/common/uresimp.h +++ b/thirdparty/icu4c/common/uresimp.h @@ -270,11 +270,13 @@ ures_getByKeyWithFallback(const UResourceBundle *resB, * function can perform fallback on the sub-resources of the table. * @param resB a resource * @param inKey a key associated with the requested resource + * @param len if not NULL, used to return the length of the string * @param status: fills in the outgoing error code * could be U_MISSING_RESOURCE_ERROR if the key is not found * could be a non-failing error * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING - * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it + * @return returns a pointer to a zero-terminated UChar array which lives in a + * memory mapped/DLL file. */ U_CAPI const UChar* U_EXPORT2 ures_getStringByKeyWithFallback(const UResourceBundle *resB, diff --git a/thirdparty/icu4c/common/uset.cpp b/thirdparty/icu4c/common/uset.cpp index eae7981d52f..a7e3046dbf2 100644 --- a/thirdparty/icu4c/common/uset.cpp +++ b/thirdparty/icu4c/common/uset.cpp @@ -116,6 +116,12 @@ uset_removeString(USet* set, const UChar* str, int32_t strLen) { ((UnicodeSet*) set)->UnicodeSet::remove(s); } +U_CAPI void U_EXPORT2 +uset_removeAllCodePoints(USet *set, const UChar *str, int32_t length) { + UnicodeString s(length==-1, str, length); + ((UnicodeSet*) set)->UnicodeSet::removeAll(s); +} + U_CAPI void U_EXPORT2 uset_removeAll(USet* set, const USet* remove) { ((UnicodeSet*) set)->UnicodeSet::removeAll(*(const UnicodeSet*)remove); @@ -126,6 +132,18 @@ uset_retain(USet* set, UChar32 start, UChar32 end) { ((UnicodeSet*) set)->UnicodeSet::retain(start, end); } +U_CAPI void U_EXPORT2 +uset_retainString(USet *set, const UChar *str, int32_t length) { + UnicodeString s(length==-1, str, length); + ((UnicodeSet*) set)->UnicodeSet::retain(s); +} + +U_CAPI void U_EXPORT2 +uset_retainAllCodePoints(USet *set, const UChar *str, int32_t length) { + UnicodeString s(length==-1, str, length); + ((UnicodeSet*) set)->UnicodeSet::retainAll(s); +} + U_CAPI void U_EXPORT2 uset_retainAll(USet* set, const USet* retain) { ((UnicodeSet*) set)->UnicodeSet::retainAll(*(const UnicodeSet*)retain); @@ -141,6 +159,23 @@ uset_complement(USet* set) { ((UnicodeSet*) set)->UnicodeSet::complement(); } +U_CAPI void U_EXPORT2 +uset_complementRange(USet *set, UChar32 start, UChar32 end) { + ((UnicodeSet*) set)->UnicodeSet::complement(start, end); +} + +U_CAPI void U_EXPORT2 +uset_complementString(USet *set, const UChar *str, int32_t length) { + UnicodeString s(length==-1, str, length); + ((UnicodeSet*) set)->UnicodeSet::complement(s); +} + +U_CAPI void U_EXPORT2 +uset_complementAllCodePoints(USet *set, const UChar *str, int32_t length) { + UnicodeString s(length==-1, str, length); + ((UnicodeSet*) set)->UnicodeSet::complementAll(s); +} + U_CAPI void U_EXPORT2 uset_complementAll(USet* set, const USet* complement) { ((UnicodeSet*) set)->UnicodeSet::complementAll(*(const UnicodeSet*)complement); diff --git a/thirdparty/icu4c/common/usprep.cpp b/thirdparty/icu4c/common/usprep.cpp index 8351a773706..874ffc63a8b 100644 --- a/thirdparty/icu4c/common/usprep.cpp +++ b/thirdparty/icu4c/common/usprep.cpp @@ -575,7 +575,7 @@ usprep_map( const UStringPrepProfile* profile, } }else if(type==USPREP_DELETE){ - // just consume the codepoint and contine + // just consume the codepoint and continue continue; } //copy the code point into destination diff --git a/thirdparty/icu4c/common/ustr_wcs.cpp b/thirdparty/icu4c/common/ustr_wcs.cpp index e9f278e9691..89d0762480d 100644 --- a/thirdparty/icu4c/common/ustr_wcs.cpp +++ b/thirdparty/icu4c/common/ustr_wcs.cpp @@ -364,7 +364,7 @@ _strFromWCS( UChar *dest, } /* we have found a null so convert the - * chunk from begining of non-null char to null + * chunk from beginning of non-null char to null */ retVal = uprv_wcstombs(pCSrc,pSrc,remaining); @@ -387,7 +387,7 @@ _strFromWCS( UChar *dest, * null terminate it and convert wchar_ts to chars */ if(nulLen >= _STACK_BUFFER_CAPACITY){ - /* Should rarely occcur */ + /* Should rarely occur */ /* allocate new buffer buffer */ pWStack =(wchar_t*) uprv_malloc(sizeof(wchar_t) * (nulLen + 1)); if(pWStack==NULL){ diff --git a/thirdparty/icu4c/common/utext.cpp b/thirdparty/icu4c/common/utext.cpp index 763b6684fba..d79f8141bba 100644 --- a/thirdparty/icu4c/common/utext.cpp +++ b/thirdparty/icu4c/common/utext.cpp @@ -382,7 +382,7 @@ utext_previous32From(UText *ut, int64_t index) { // UChar32 cPrev; // The character preceding cCurr, which is what we will return. - // Address the chunk containg the position preceding the incoming index + // Address the chunk containing the position preceding the incoming index // A tricky edge case: // We try to test the requested native index against the chunkNativeStart to determine // whether the character preceding the one at the index is in the current chunk. @@ -894,7 +894,7 @@ struct UTF8Buf { // one for a supplementary starting in the last normal position, // and one for an entry for the buffer limit position. uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*3+6]; // Map native offset from bufNativeStart to - // correspoding offset in filled part of buf. + // corresponding offset in filled part of buf. int32_t align; }; @@ -1545,7 +1545,7 @@ utf8TextMapOffsetToNative(const UText *ut) { } // -// Map a native index to the corrsponding chunk offset +// Map a native index to the corresponding chunk offset // static int32_t U_CALLCONV utf8TextMapIndexToUTF16(const UText *ut, int64_t index64) { diff --git a/thirdparty/icu4c/common/util.h b/thirdparty/icu4c/common/util.h index 9c3b76d9ed5..b5fac383a2f 100644 --- a/thirdparty/icu4c/common/util.h +++ b/thirdparty/icu4c/common/util.h @@ -13,10 +13,10 @@ #ifndef ICU_UTIL_H #define ICU_UTIL_H -#include "unicode/utypes.h" -#include "unicode/uobject.h" +#include "charstr.h" #include "unicode/unistr.h" - +#include "unicode/uobject.h" +#include "unicode/utypes.h" //-------------------------------------------------------------------- // class ICU_Utility // i18n utility functions, scoped into the class ICU_Utility. diff --git a/thirdparty/icu4c/common/utracimp.h b/thirdparty/icu4c/common/utracimp.h index f32fe1db394..945540d25af 100644 --- a/thirdparty/icu4c/common/utracimp.h +++ b/thirdparty/icu4c/common/utracimp.h @@ -193,7 +193,7 @@ UPRV_BLOCK_MACRO_BEGIN { \ * Trace statement for each exit point of a function that has a UTRACE_ENTRY() * statement, and that returns a value. * - * @param val The function's return value, int32_t or comatible type. + * @param val The function's return value, int32_t or compatible type. * * @internal */ diff --git a/thirdparty/icu4c/common/uvector.cpp b/thirdparty/icu4c/common/uvector.cpp index cf19edf646f..9c7e74c6d5a 100644 --- a/thirdparty/icu4c/common/uvector.cpp +++ b/thirdparty/icu4c/common/uvector.cpp @@ -312,7 +312,7 @@ int32_t UVector::indexOf(UElement key, int32_t startIndex, int8_t hint) const { } else { for (i=startIndex; i and a timezone - // behind UTC is Etc/GMT+. - int ret = snprintf(gmtOffsetTz, UPRV_LENGTHOF(gmtOffsetTz), "Etc/GMT%+ld", -utcOffsetMins / 60); + // Important note on the sign convention for zones: + // + // From https://en.wikipedia.org/wiki/Tz_database#Area + // "In order to conform with the POSIX style, those zone names beginning with "Etc/GMT" have their sign reversed + // from the standard ISO 8601 convention. In the "Etc" area, zones west of GMT have a positive sign and those + // east have a negative sign in their name (e.g "Etc/GMT-14" is 14 hours ahead of GMT)." + // + // Regarding the POSIX style, from https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html + // "The offset specifies the time value you must add to the local time to get a Coordinated Universal Time value." + // + // However, the Bias value in DYNAMIC_TIME_ZONE_INFORMATION *already* follows the POSIX convention. + // + // From https://docs.microsoft.com/en-us/windows/win32/api/timezoneapi/ns-timezoneapi-dynamic_time_zone_information + // "The bias is the difference, in minutes, between Coordinated Universal Time (UTC) and + // local time. All translations between UTC and local time are based on the following formula: + // UTC = local time + bias" + // + // For example, a time zone that is 3 hours ahead of UTC (UTC+03:00) would have a Bias value of -180, and the + // corresponding time zone ID would be "Etc/GMT-3". (So there is no need to negate utcOffsetMins below.) + int ret = snprintf(gmtOffsetTz, UPRV_LENGTHOF(gmtOffsetTz), "Etc/GMT%+ld", utcOffsetMins / 60); if (ret > 0 && ret < UPRV_LENGTHOF(gmtOffsetTz)) { return uprv_strdup(gmtOffsetTz); } diff --git a/thirdparty/icu4c/icudt68l.dat b/thirdparty/icu4c/icudt69l.dat similarity index 86% rename from thirdparty/icu4c/icudt68l.dat rename to thirdparty/icu4c/icudt69l.dat index 9ecea5d548e142cc34f7d3aa0d43d83e61e5545f..3101a49695e16488abfc1c27b1df2e09018d68d0 100644 GIT binary patch delta 184972 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 zЙ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