summaryrefslogtreecommitdiff
path: root/deps/node/deps/icu-small/source/i18n/number_affixutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'deps/node/deps/icu-small/source/i18n/number_affixutils.cpp')
-rw-r--r--deps/node/deps/icu-small/source/i18n/number_affixutils.cpp438
1 files changed, 0 insertions, 438 deletions
diff --git a/deps/node/deps/icu-small/source/i18n/number_affixutils.cpp b/deps/node/deps/icu-small/source/i18n/number_affixutils.cpp
deleted file mode 100644
index 8da29a03..00000000
--- a/deps/node/deps/icu-small/source/i18n/number_affixutils.cpp
+++ /dev/null
@@ -1,438 +0,0 @@
-// © 2017 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_FORMATTING
-
-#include "number_affixutils.h"
-#include "unicode/utf16.h"
-#include "unicode/uniset.h"
-
-using namespace icu;
-using namespace icu::number;
-using namespace icu::number::impl;
-
-TokenConsumer::~TokenConsumer() = default;
-SymbolProvider::~SymbolProvider() = default;
-
-int32_t AffixUtils::estimateLength(const UnicodeString &patternString, UErrorCode &status) {
- AffixPatternState state = STATE_BASE;
- int32_t offset = 0;
- int32_t length = 0;
- for (; offset < patternString.length();) {
- UChar32 cp = patternString.char32At(offset);
-
- switch (state) {
- case STATE_BASE:
- if (cp == u'\'') {
- // First quote
- state = STATE_FIRST_QUOTE;
- } else {
- // Unquoted symbol
- length++;
- }
- break;
- case STATE_FIRST_QUOTE:
- if (cp == u'\'') {
- // Repeated quote
- length++;
- state = STATE_BASE;
- } else {
- // Quoted code point
- length++;
- state = STATE_INSIDE_QUOTE;
- }
- break;
- case STATE_INSIDE_QUOTE:
- if (cp == u'\'') {
- // End of quoted sequence
- state = STATE_AFTER_QUOTE;
- } else {
- // Quoted code point
- length++;
- }
- break;
- case STATE_AFTER_QUOTE:
- if (cp == u'\'') {
- // Double quote inside of quoted sequence
- length++;
- state = STATE_INSIDE_QUOTE;
- } else {
- // Unquoted symbol
- length++;
- }
- break;
- default:
- U_ASSERT(false);
- }
-
- offset += U16_LENGTH(cp);
- }
-
- switch (state) {
- case STATE_FIRST_QUOTE:
- case STATE_INSIDE_QUOTE:
- status = U_ILLEGAL_ARGUMENT_ERROR;
- break;
- default:
- break;
- }
-
- return length;
-}
-
-UnicodeString AffixUtils::escape(const UnicodeString &input) {
- AffixPatternState state = STATE_BASE;
- int32_t offset = 0;
- UnicodeString output;
- for (; offset < input.length();) {
- UChar32 cp = input.char32At(offset);
-
- switch (cp) {
- case u'\'':
- output.append(u"''", -1);
- break;
-
- case u'-':
- case u'+':
- case u'%':
- case u'‰':
- case u'¤':
- if (state == STATE_BASE) {
- output.append(u'\'');
- output.append(cp);
- state = STATE_INSIDE_QUOTE;
- } else {
- output.append(cp);
- }
- break;
-
- default:
- if (state == STATE_INSIDE_QUOTE) {
- output.append(u'\'');
- output.append(cp);
- state = STATE_BASE;
- } else {
- output.append(cp);
- }
- break;
- }
- offset += U16_LENGTH(cp);
- }
-
- if (state == STATE_INSIDE_QUOTE) {
- output.append(u'\'');
- }
-
- return output;
-}
-
-Field AffixUtils::getFieldForType(AffixPatternType type) {
- switch (type) {
- case TYPE_MINUS_SIGN:
- return Field::UNUM_SIGN_FIELD;
- case TYPE_PLUS_SIGN:
- return Field::UNUM_SIGN_FIELD;
- case TYPE_PERCENT:
- return Field::UNUM_PERCENT_FIELD;
- case TYPE_PERMILLE:
- return Field::UNUM_PERMILL_FIELD;
- case TYPE_CURRENCY_SINGLE:
- return Field::UNUM_CURRENCY_FIELD;
- case TYPE_CURRENCY_DOUBLE:
- return Field::UNUM_CURRENCY_FIELD;
- case TYPE_CURRENCY_TRIPLE:
- return Field::UNUM_CURRENCY_FIELD;
- case TYPE_CURRENCY_QUAD:
- return Field::UNUM_CURRENCY_FIELD;
- case TYPE_CURRENCY_QUINT:
- return Field::UNUM_CURRENCY_FIELD;
- case TYPE_CURRENCY_OVERFLOW:
- return Field::UNUM_CURRENCY_FIELD;
- default:
- U_ASSERT(false);
- return Field::UNUM_FIELD_COUNT; // suppress "control reaches end of non-void function"
- }
-}
-
-int32_t
-AffixUtils::unescape(const UnicodeString &affixPattern, NumberStringBuilder &output, int32_t position,
- const SymbolProvider &provider, UErrorCode &status) {
- int32_t length = 0;
- AffixTag tag;
- while (hasNext(tag, affixPattern)) {
- tag = nextToken(tag, affixPattern, status);
- if (U_FAILURE(status)) { return length; }
- if (tag.type == TYPE_CURRENCY_OVERFLOW) {
- // Don't go to the provider for this special case
- length += output.insertCodePoint(position + length, 0xFFFD, UNUM_CURRENCY_FIELD, status);
- } else if (tag.type < 0) {
- length += output.insert(
- position + length, provider.getSymbol(tag.type), getFieldForType(tag.type), status);
- } else {
- length += output.insertCodePoint(position + length, tag.codePoint, UNUM_FIELD_COUNT, status);
- }
- }
- return length;
-}
-
-int32_t AffixUtils::unescapedCodePointCount(const UnicodeString &affixPattern,
- const SymbolProvider &provider, UErrorCode &status) {
- int32_t length = 0;
- AffixTag tag;
- while (hasNext(tag, affixPattern)) {
- tag = nextToken(tag, affixPattern, status);
- if (U_FAILURE(status)) { return length; }
- if (tag.type == TYPE_CURRENCY_OVERFLOW) {
- length += 1;
- } else if (tag.type < 0) {
- length += provider.getSymbol(tag.type).length();
- } else {
- length += U16_LENGTH(tag.codePoint);
- }
- }
- return length;
-}
-
-bool
-AffixUtils::containsType(const UnicodeString &affixPattern, AffixPatternType type, UErrorCode &status) {
- if (affixPattern.length() == 0) {
- return false;
- }
- AffixTag tag;
- while (hasNext(tag, affixPattern)) {
- tag = nextToken(tag, affixPattern, status);
- if (U_FAILURE(status)) { return false; }
- if (tag.type == type) {
- return true;
- }
- }
- return false;
-}
-
-bool AffixUtils::hasCurrencySymbols(const UnicodeString &affixPattern, UErrorCode &status) {
- if (affixPattern.length() == 0) {
- return false;
- }
- AffixTag tag;
- while (hasNext(tag, affixPattern)) {
- tag = nextToken(tag, affixPattern, status);
- if (U_FAILURE(status)) { return false; }
- if (tag.type < 0 && getFieldForType(tag.type) == UNUM_CURRENCY_FIELD) {
- return true;
- }
- }
- return false;
-}
-
-UnicodeString AffixUtils::replaceType(const UnicodeString &affixPattern, AffixPatternType type,
- char16_t replacementChar, UErrorCode &status) {
- UnicodeString output(affixPattern); // copy
- if (affixPattern.length() == 0) {
- return output;
- };
- AffixTag tag;
- while (hasNext(tag, affixPattern)) {
- tag = nextToken(tag, affixPattern, status);
- if (U_FAILURE(status)) { return output; }
- if (tag.type == type) {
- output.replace(tag.offset - 1, 1, replacementChar);
- }
- }
- return output;
-}
-
-bool AffixUtils::containsOnlySymbolsAndIgnorables(const UnicodeString& affixPattern,
- const UnicodeSet& ignorables, UErrorCode& status) {
- if (affixPattern.length() == 0) {
- return true;
- };
- AffixTag tag;
- while (hasNext(tag, affixPattern)) {
- tag = nextToken(tag, affixPattern, status);
- if (U_FAILURE(status)) { return false; }
- if (tag.type == TYPE_CODEPOINT && !ignorables.contains(tag.codePoint)) {
- return false;
- }
- }
- return true;
-}
-
-void AffixUtils::iterateWithConsumer(const UnicodeString& affixPattern, TokenConsumer& consumer,
- UErrorCode& status) {
- if (affixPattern.length() == 0) {
- return;
- };
- AffixTag tag;
- while (hasNext(tag, affixPattern)) {
- tag = nextToken(tag, affixPattern, status);
- if (U_FAILURE(status)) { return; }
- consumer.consumeToken(tag.type, tag.codePoint, status);
- if (U_FAILURE(status)) { return; }
- }
-}
-
-AffixTag AffixUtils::nextToken(AffixTag tag, const UnicodeString &patternString, UErrorCode &status) {
- int32_t offset = tag.offset;
- int32_t state = tag.state;
- for (; offset < patternString.length();) {
- UChar32 cp = patternString.char32At(offset);
- int32_t count = U16_LENGTH(cp);
-
- switch (state) {
- case STATE_BASE:
- switch (cp) {
- case u'\'':
- state = STATE_FIRST_QUOTE;
- offset += count;
- // continue to the next code point
- break;
- case u'-':
- return makeTag(offset + count, TYPE_MINUS_SIGN, STATE_BASE, 0);
- case u'+':
- return makeTag(offset + count, TYPE_PLUS_SIGN, STATE_BASE, 0);
- case u'%':
- return makeTag(offset + count, TYPE_PERCENT, STATE_BASE, 0);
- case u'‰':
- return makeTag(offset + count, TYPE_PERMILLE, STATE_BASE, 0);
- case u'¤':
- state = STATE_FIRST_CURR;
- offset += count;
- // continue to the next code point
- break;
- default:
- return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
- }
- break;
- case STATE_FIRST_QUOTE:
- if (cp == u'\'') {
- return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
- } else {
- return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
- }
- case STATE_INSIDE_QUOTE:
- if (cp == u'\'') {
- state = STATE_AFTER_QUOTE;
- offset += count;
- // continue to the next code point
- break;
- } else {
- return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
- }
- case STATE_AFTER_QUOTE:
- if (cp == u'\'') {
- return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
- } else {
- state = STATE_BASE;
- // re-evaluate this code point
- break;
- }
- case STATE_FIRST_CURR:
- if (cp == u'¤') {
- state = STATE_SECOND_CURR;
- offset += count;
- // continue to the next code point
- break;
- } else {
- return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0);
- }
- case STATE_SECOND_CURR:
- if (cp == u'¤') {
- state = STATE_THIRD_CURR;
- offset += count;
- // continue to the next code point
- break;
- } else {
- return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0);
- }
- case STATE_THIRD_CURR:
- if (cp == u'¤') {
- state = STATE_FOURTH_CURR;
- offset += count;
- // continue to the next code point
- break;
- } else {
- return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0);
- }
- case STATE_FOURTH_CURR:
- if (cp == u'¤') {
- state = STATE_FIFTH_CURR;
- offset += count;
- // continue to the next code point
- break;
- } else {
- return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0);
- }
- case STATE_FIFTH_CURR:
- if (cp == u'¤') {
- state = STATE_OVERFLOW_CURR;
- offset += count;
- // continue to the next code point
- break;
- } else {
- return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0);
- }
- case STATE_OVERFLOW_CURR:
- if (cp == u'¤') {
- offset += count;
- // continue to the next code point and loop back to this state
- break;
- } else {
- return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
- }
- default:
- U_ASSERT(false);
- }
- }
- // End of string
- switch (state) {
- case STATE_BASE:
- // No more tokens in string.
- return {-1};
- case STATE_FIRST_QUOTE:
- case STATE_INSIDE_QUOTE:
- // For consistent behavior with the JDK and ICU 58, set an error here.
- status = U_ILLEGAL_ARGUMENT_ERROR;
- return {-1};
- case STATE_AFTER_QUOTE:
- // No more tokens in string.
- return {-1};
- case STATE_FIRST_CURR:
- return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0);
- case STATE_SECOND_CURR:
- return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0);
- case STATE_THIRD_CURR:
- return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0);
- case STATE_FOURTH_CURR:
- return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0);
- case STATE_FIFTH_CURR:
- return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0);
- case STATE_OVERFLOW_CURR:
- return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
- default:
- U_ASSERT(false);
- return {-1}; // suppress "control reaches end of non-void function"
- }
-}
-
-bool AffixUtils::hasNext(const AffixTag &tag, const UnicodeString &string) {
- // First check for the {-1} and default initializer syntax.
- if (tag.offset < 0) {
- return false;
- } else if (tag.offset == 0) {
- return string.length() > 0;
- }
- // The rest of the fields are safe to use now.
- // Special case: the last character in string is an end quote.
- if (tag.state == STATE_INSIDE_QUOTE && tag.offset == string.length() - 1 &&
- string.charAt(tag.offset) == u'\'') {
- return false;
- } else if (tag.state != STATE_BASE) {
- return true;
- } else {
- return tag.offset < string.length();
- }
-}
-
-#endif /* #if !UCONFIG_NO_FORMATTING */