summaryrefslogtreecommitdiff
path: root/deps/node/deps/icu-small/source/i18n/numparse_currency.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'deps/node/deps/icu-small/source/i18n/numparse_currency.cpp')
-rw-r--r--deps/node/deps/icu-small/source/i18n/numparse_currency.cpp188
1 files changed, 0 insertions, 188 deletions
diff --git a/deps/node/deps/icu-small/source/i18n/numparse_currency.cpp b/deps/node/deps/icu-small/source/i18n/numparse_currency.cpp
deleted file mode 100644
index 598ace56..00000000
--- a/deps/node/deps/icu-small/source/i18n/numparse_currency.cpp
+++ /dev/null
@@ -1,188 +0,0 @@
-// © 2018 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_FORMATTING
-
-// Allow implicit conversion from char16_t* to UnicodeString for this file:
-// Helpful in toString methods and elsewhere.
-#define UNISTR_FROM_STRING_EXPLICIT
-
-#include "numparse_types.h"
-#include "numparse_currency.h"
-#include "ucurrimp.h"
-#include "unicode/errorcode.h"
-#include "numparse_utils.h"
-
-using namespace icu;
-using namespace icu::numparse;
-using namespace icu::numparse::impl;
-
-
-CombinedCurrencyMatcher::CombinedCurrencyMatcher(const CurrencySymbols& currencySymbols, const DecimalFormatSymbols& dfs,
- parse_flags_t parseFlags, UErrorCode& status)
- : fCurrency1(currencySymbols.getCurrencySymbol(status)),
- fCurrency2(currencySymbols.getIntlCurrencySymbol(status)),
- fUseFullCurrencyData(0 == (parseFlags & PARSE_FLAG_NO_FOREIGN_CURRENCY)),
- afterPrefixInsert(dfs.getPatternForCurrencySpacing(UNUM_CURRENCY_INSERT, false, status)),
- beforeSuffixInsert(dfs.getPatternForCurrencySpacing(UNUM_CURRENCY_INSERT, true, status)),
- fLocaleName(dfs.getLocale().getName(), -1, status) {
- utils::copyCurrencyCode(fCurrencyCode, currencySymbols.getIsoCode());
-
- // Pre-load the long names for the current locale and currency
- // if we are parsing without the full currency data.
- if (!fUseFullCurrencyData) {
- for (int32_t i=0; i<StandardPlural::COUNT; i++) {
- auto plural = static_cast<StandardPlural::Form>(i);
- fLocalLongNames[i] = currencySymbols.getPluralName(plural, status);
- }
- }
-
- // TODO: Figure out how to make this faster and re-enable.
- // Computing the "lead code points" set for fastpathing is too slow to use in production.
- // See http://bugs.icu-project.org/trac/ticket/13584
-// // Compute the full set of characters that could be the first in a currency to allow for
-// // efficient smoke test.
-// fLeadCodePoints.add(fCurrency1.char32At(0));
-// fLeadCodePoints.add(fCurrency2.char32At(0));
-// fLeadCodePoints.add(beforeSuffixInsert.char32At(0));
-// uprv_currencyLeads(fLocaleName.data(), fLeadCodePoints, status);
-// // Always apply case mapping closure for currencies
-// fLeadCodePoints.closeOver(USET_ADD_CASE_MAPPINGS);
-// fLeadCodePoints.freeze();
-}
-
-bool
-CombinedCurrencyMatcher::match(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const {
- if (result.currencyCode[0] != 0) {
- return false;
- }
-
- // Try to match a currency spacing separator.
- int32_t initialOffset = segment.getOffset();
- bool maybeMore = false;
- if (result.seenNumber() && !beforeSuffixInsert.isEmpty()) {
- int32_t overlap = segment.getCommonPrefixLength(beforeSuffixInsert);
- if (overlap == beforeSuffixInsert.length()) {
- segment.adjustOffset(overlap);
- // Note: let currency spacing be a weak match. Don't update chars consumed.
- }
- maybeMore = maybeMore || overlap == segment.length();
- }
-
- // Match the currency string, and reset if we didn't find one.
- maybeMore = maybeMore || matchCurrency(segment, result, status);
- if (result.currencyCode[0] == 0) {
- segment.setOffset(initialOffset);
- return maybeMore;
- }
-
- // Try to match a currency spacing separator.
- if (!result.seenNumber() && !afterPrefixInsert.isEmpty()) {
- int32_t overlap = segment.getCommonPrefixLength(afterPrefixInsert);
- if (overlap == afterPrefixInsert.length()) {
- segment.adjustOffset(overlap);
- // Note: let currency spacing be a weak match. Don't update chars consumed.
- }
- maybeMore = maybeMore || overlap == segment.length();
- }
-
- return maybeMore;
-}
-
-bool CombinedCurrencyMatcher::matchCurrency(StringSegment& segment, ParsedNumber& result,
- UErrorCode& status) const {
- bool maybeMore = false;
-
- int32_t overlap1;
- if (!fCurrency1.isEmpty()) {
- overlap1 = segment.getCaseSensitivePrefixLength(fCurrency1);
- } else {
- overlap1 = -1;
- }
- maybeMore = maybeMore || overlap1 == segment.length();
- if (overlap1 == fCurrency1.length()) {
- utils::copyCurrencyCode(result.currencyCode, fCurrencyCode);
- segment.adjustOffset(overlap1);
- result.setCharsConsumed(segment);
- return maybeMore;
- }
-
- int32_t overlap2;
- if (!fCurrency2.isEmpty()) {
- // ISO codes should be accepted case-insensitive.
- // https://unicode-org.atlassian.net/browse/ICU-13696
- overlap2 = segment.getCommonPrefixLength(fCurrency2);
- } else {
- overlap2 = -1;
- }
- maybeMore = maybeMore || overlap2 == segment.length();
- if (overlap2 == fCurrency2.length()) {
- utils::copyCurrencyCode(result.currencyCode, fCurrencyCode);
- segment.adjustOffset(overlap2);
- result.setCharsConsumed(segment);
- return maybeMore;
- }
-
- if (fUseFullCurrencyData) {
- // Use the full currency data.
- // NOTE: This call site should be improved with #13584.
- const UnicodeString segmentString = segment.toTempUnicodeString();
-
- // Try to parse the currency
- ParsePosition ppos(0);
- int32_t partialMatchLen = 0;
- uprv_parseCurrency(
- fLocaleName.data(),
- segmentString,
- ppos,
- UCURR_SYMBOL_NAME, // checks for both UCURR_SYMBOL_NAME and UCURR_LONG_NAME
- &partialMatchLen,
- result.currencyCode,
- status);
- maybeMore = maybeMore || partialMatchLen == segment.length();
-
- if (U_SUCCESS(status) && ppos.getIndex() != 0) {
- // Complete match.
- // NOTE: The currency code should already be saved in the ParsedNumber.
- segment.adjustOffset(ppos.getIndex());
- result.setCharsConsumed(segment);
- return maybeMore;
- }
-
- } else {
- // Use the locale long names.
- int32_t longestFullMatch = 0;
- for (int32_t i=0; i<StandardPlural::COUNT; i++) {
- const UnicodeString& name = fLocalLongNames[i];
- int32_t overlap = segment.getCommonPrefixLength(name);
- if (overlap == name.length() && name.length() > longestFullMatch) {
- longestFullMatch = name.length();
- }
- maybeMore = maybeMore || overlap > 0;
- }
- if (longestFullMatch > 0) {
- utils::copyCurrencyCode(result.currencyCode, fCurrencyCode);
- segment.adjustOffset(longestFullMatch);
- result.setCharsConsumed(segment);
- return maybeMore;
- }
- }
-
- // No match found.
- return maybeMore;
-}
-
-bool CombinedCurrencyMatcher::smokeTest(const StringSegment&) const {
- // TODO: See constructor
- return true;
- //return segment.startsWith(fLeadCodePoints);
-}
-
-UnicodeString CombinedCurrencyMatcher::toString() const {
- return u"<CombinedCurrencyMatcher>";
-}
-
-
-#endif /* #if !UCONFIG_NO_FORMATTING */