UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, ParsePosition& pos, uint32_t options, const SymbolTable* symbols, UErrorCode& status) { if (U_FAILURE(status)) { return *this; } if (isFrozen()) { status = U_NO_WRITE_PERMISSION; return *this; } // Need to build the pattern in a temporary string because // _applyPattern calls add() etc., which set pat to empty. UnicodeString rebuiltPat; RuleCharacterIterator chars(pattern, symbols, pos); applyPattern(chars, symbols, rebuiltPat, options, &UnicodeSet::closeOver, status); if (U_FAILURE(status)) return *this; if (chars.inVariable()) { // syntaxError(chars, "Extra chars in variable value"); status = U_MALFORMED_SET; return *this; } setPattern(rebuiltPat); return *this; }
void ChoiceFormat::applyPattern(const UnicodeString& pattern, UErrorCode& status) { UParseError parseError; applyPattern(pattern, parseError, status); }
ChoiceFormat::ChoiceFormat(const UnicodeString& newPattern, UErrorCode& status) : constructorErrorCode(status), msgPattern(status) { applyPattern(newPattern, status); }
U_NAMESPACE_BEGIN // TODO memory debugging provided inside uniset.cpp // could be made available here but probably obsolete with use of modern // memory leak checker tools #define _dbgct(me) //---------------------------------------------------------------- // Constructors &c //---------------------------------------------------------------- UnicodeSet::UnicodeSet(const UnicodeString& pattern, uint32_t options, const SymbolTable* symbols, UErrorCode& status) : len(0), capacity(START_EXTRA), list(0), bmpSet(0), buffer(0), bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), fFlags(0) { if(U_SUCCESS(status)){ list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); /* test for NULL */ if(list == NULL) { status = U_MEMORY_ALLOCATION_ERROR; }else{ allocateStrings(status); applyPattern(pattern, options, symbols, status); } } _dbgct(this); }
void MessageFormat::applyPattern(const UnicodeString& newPattern, UErrorCode& status) { UParseError parseError; applyPattern(newPattern,parseError,status); }
SelectFormat::SelectFormat(const UnicodeString& pat, UErrorCode& status) : parsedValuesHash(NULL) { if (U_FAILURE(status)) { return; } initHashTable(status); applyPattern(pat, status); }
SelectFormat::SelectFormat(const UnicodeString& pat, UErrorCode& status) { if (U_FAILURE(status)) { return; } init(status); applyPattern(pat, status); }
PluralFormat::PluralFormat(const UnicodeString& pat, UErrorCode& status) : locale(Locale::getDefault()), msgPattern(status), numberFormat(NULL), offset(0) { init(NULL, UPLURAL_TYPE_CARDINAL, status); applyPattern(pat, status); }
ChoiceFormat::ChoiceFormat(const UnicodeString& newPattern, UErrorCode& status) : fChoiceLimits(0), fClosures(0), fChoiceFormats(0), fCount(0) { applyPattern(newPattern, status); }
PluralFormat::PluralFormat(const Locale& loc, const PluralRules& rules, const UnicodeString& pat, UErrorCode& status) : locale(loc), msgPattern(status), numberFormat(NULL), offset(0) { init(&rules, UPLURAL_TYPE_COUNT, status); applyPattern(pat, status); }
PluralFormat::PluralFormat(const Locale& loc, UPluralType type, const UnicodeString& pat, UErrorCode& status) : locale(loc), msgPattern(status), numberFormat(NULL), offset(0) { init(NULL, type, status); applyPattern(pat, status); }
/** * Constructs a set from the given pattern, optionally ignoring * white space. See the class description for the syntax of the * pattern language. * @param pattern a string specifying what characters are in the set */ UnicodeSet::UnicodeSet(const UnicodeString& pattern, UErrorCode& status) : len(0), capacity(START_EXTRA), bufferCapacity(0), list(0), buffer(0), strings(0) { if(U_SUCCESS(status)){ list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); /* test for NULL */ if(list == NULL) { status = U_MEMORY_ALLOCATION_ERROR; }else{ allocateStrings(); applyPattern(pattern, USET_IGNORE_SPACE, NULL, status); } } _dbgct(this); }
UnicodeSet::UnicodeSet(const UnicodeString& pattern, ParsePosition& pos, uint32_t options, const SymbolTable* symbols, UErrorCode& status) : len(0), capacity(START_EXTRA), bufferCapacity(0), list(0), buffer(0), strings(0) { if(U_SUCCESS(status)){ list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); /* test for NULL */ if(list == NULL) { status = U_MEMORY_ALLOCATION_ERROR; }else{ allocateStrings(); applyPattern(pattern, pos, options, symbols, status); } } _dbgct(this); }
UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, uint32_t options, const SymbolTable* symbols, UErrorCode& status) { ParsePosition pos(0); applyPattern(pattern, pos, options, symbols, status); if (U_FAILURE(status)) return *this; int32_t i = pos.getIndex(); if (options & USET_IGNORE_SPACE) { // Skip over trailing whitespace ICU_Utility::skipWhitespace(pattern, i, TRUE); } if (i != pattern.length()) { status = U_ILLEGAL_ARGUMENT_ERROR; } return *this; }
MessageFormat::MessageFormat(const UnicodeString& pattern, UErrorCode& success) : fLocale(Locale::getDefault()), // Uses the default locale formatAliases(NULL), formatAliasesCapacity(0), subformats(NULL), subformatCount(0), subformatCapacity(0), argTypes(NULL), argTypeCount(0), argTypeCapacity(0), defaultNumberFormat(NULL), defaultDateFormat(NULL) { if (!allocateSubformats(DEFAULT_INITIAL_CAPACITY) || !allocateArgTypes(DEFAULT_INITIAL_CAPACITY)) { success = U_MEMORY_ALLOCATION_ERROR; return; } applyPattern(pattern, success); setLocaleIDs(fLocale.getName(), fLocale.getName()); }
SelectFormat::SelectFormat(const UnicodeString& pat, UErrorCode& status) : msgPattern(status) { applyPattern(pat, status); }
void ChoiceFormat::setChoices(const double* limits, const UBool* closures, const UnicodeString* formats, int32_t count, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return; } if (limits == NULL || formats == NULL) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; return; } // Reconstruct the original input pattern. // Modified version of the pre-ICU 4.8 toPattern() implementation. UnicodeString result; for (int32_t i = 0; i < count; ++i) { if (i != 0) { result += VERTICAL_BAR; } UnicodeString buf; if (uprv_isPositiveInfinity(limits[i])) { result += INFINITY; } else if (uprv_isNegativeInfinity(limits[i])) { result += MINUS; result += INFINITY; } else { result += dtos(limits[i], buf); } if (closures != NULL && closures[i]) { result += LESS_THAN; } else { result += LESS_EQUAL; } // Append formats[i], using quotes if there are special // characters. Single quotes themselves must be escaped in // either case. const UnicodeString& text = formats[i]; int32_t textLength = text.length(); int32_t nestingLevel = 0; for (int32_t j = 0; j < textLength; ++j) { UChar c = text[j]; if (c == SINGLE_QUOTE && nestingLevel == 0) { // Double each top-level apostrophe. result.append(c); } else if (c == VERTICAL_BAR && nestingLevel == 0) { // Surround each pipe symbol with apostrophes for quoting. // If the next character is an apostrophe, then that will be doubled, // and although the parser will see the apostrophe pairs beginning // and ending one character earlier than our doubling, the result // is as desired. // | -> '|' // |' -> '|''' // |'' -> '|''''' etc. result.append(SINGLE_QUOTE).append(c).append(SINGLE_QUOTE); continue; // Skip the append(c) at the end of the loop body. } else if (c == LEFT_CURLY_BRACE) { ++nestingLevel; } else if (c == RIGHT_CURLY_BRACE && nestingLevel > 0) { --nestingLevel; } result.append(c); } } // Apply the reconstructed pattern. applyPattern(result, errorCode); }
PluralFormat::PluralFormat(const PluralRules& rules, const UnicodeString& pat, UErrorCode& status) { init(&rules, Locale::getDefault(), status); applyPattern(pat, status); }
PluralFormat::PluralFormat(const Locale& loc, const PluralRules& rules, const UnicodeString& pat, UErrorCode& status) { init(&rules, loc, status); applyPattern(pat, status); }
/** * Modifies this set to represent the set specified by the given * pattern, optionally ignoring white space. See the class * description for the syntax of the pattern language. * @param pattern a string specifying what characters are in the set * @param ignoreSpaces if <code>true</code>, all spaces in the * pattern are ignored. Spaces are those characters for which * <code>uprv_isRuleWhiteSpace()</code> is <code>true</code>. * Characters preceded by '\\' are escaped, losing any special * meaning they otherwise have. Spaces may be included by * escaping them. * @exception <code>IllegalArgumentException</code> if the pattern * contains a syntax error. */ UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, UErrorCode& status) { return applyPattern(pattern, USET_IGNORE_SPACE, NULL, status); }