| Index: icu46/source/i18n/quant.cpp
|
| ===================================================================
|
| --- icu46/source/i18n/quant.cpp (revision 0)
|
| +++ icu46/source/i18n/quant.cpp (revision 0)
|
| @@ -0,0 +1,146 @@
|
| +/*
|
| +**********************************************************************
|
| +* Copyright (C) 2001-2008, International Business Machines
|
| +* Corporation and others. All Rights Reserved.
|
| +**********************************************************************
|
| +* Date Name Description
|
| +* 07/26/01 aliu Creation.
|
| +**********************************************************************
|
| +*/
|
| +
|
| +#include "unicode/utypes.h"
|
| +
|
| +#if !UCONFIG_NO_TRANSLITERATION
|
| +
|
| +#include "quant.h"
|
| +#include "unicode/unistr.h"
|
| +#include "util.h"
|
| +
|
| +U_NAMESPACE_BEGIN
|
| +
|
| +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Quantifier)
|
| +
|
| +Quantifier::Quantifier(UnicodeFunctor *adoptedMatcher,
|
| + uint32_t _minCount, uint32_t _maxCount) {
|
| + // assert(adopted != 0);
|
| + // assert(minCount <= maxCount);
|
| + matcher = adoptedMatcher;
|
| + this->minCount = _minCount;
|
| + this->maxCount = _maxCount;
|
| +}
|
| +
|
| +Quantifier::Quantifier(const Quantifier& o) :
|
| + UnicodeFunctor(o),
|
| + UnicodeMatcher(o),
|
| + matcher(o.matcher->clone()),
|
| + minCount(o.minCount),
|
| + maxCount(o.maxCount)
|
| +{
|
| +}
|
| +
|
| +Quantifier::~Quantifier() {
|
| + delete matcher;
|
| +}
|
| +
|
| +/**
|
| + * Implement UnicodeFunctor
|
| + */
|
| +UnicodeFunctor* Quantifier::clone() const {
|
| + return new Quantifier(*this);
|
| +}
|
| +
|
| +/**
|
| + * UnicodeFunctor API. Cast 'this' to a UnicodeMatcher* pointer
|
| + * and return the pointer.
|
| + */
|
| +UnicodeMatcher* Quantifier::toMatcher() const {
|
| + return (UnicodeMatcher*) this;
|
| +}
|
| +
|
| +UMatchDegree Quantifier::matches(const Replaceable& text,
|
| + int32_t& offset,
|
| + int32_t limit,
|
| + UBool incremental) {
|
| + int32_t start = offset;
|
| + uint32_t count = 0;
|
| + while (count < maxCount) {
|
| + int32_t pos = offset;
|
| + UMatchDegree m = matcher->toMatcher()->matches(text, offset, limit, incremental);
|
| + if (m == U_MATCH) {
|
| + ++count;
|
| + if (pos == offset) {
|
| + // If offset has not moved we have a zero-width match.
|
| + // Don't keep matching it infinitely.
|
| + break;
|
| + }
|
| + } else if (incremental && m == U_PARTIAL_MATCH) {
|
| + return U_PARTIAL_MATCH;
|
| + } else {
|
| + break;
|
| + }
|
| + }
|
| + if (incremental && offset == limit) {
|
| + return U_PARTIAL_MATCH;
|
| + }
|
| + if (count >= minCount) {
|
| + return U_MATCH;
|
| + }
|
| + offset = start;
|
| + return U_MISMATCH;
|
| +}
|
| +
|
| +/**
|
| + * Implement UnicodeMatcher
|
| + */
|
| +UnicodeString& Quantifier::toPattern(UnicodeString& result,
|
| + UBool escapeUnprintable) const {
|
| + result.truncate(0);
|
| + matcher->toMatcher()->toPattern(result, escapeUnprintable);
|
| + if (minCount == 0) {
|
| + if (maxCount == 1) {
|
| + return result.append((UChar)63); /*?*/
|
| + } else if (maxCount == MAX) {
|
| + return result.append((UChar)42); /***/
|
| + }
|
| + // else fall through
|
| + } else if (minCount == 1 && maxCount == MAX) {
|
| + return result.append((UChar)43); /*+*/
|
| + }
|
| + result.append((UChar)123); /*{*/
|
| + ICU_Utility::appendNumber(result, minCount);
|
| + result.append((UChar)44); /*,*/
|
| + if (maxCount != MAX) {
|
| + ICU_Utility::appendNumber(result, maxCount);
|
| + }
|
| + result.append((UChar)125); /*}*/
|
| + return result;
|
| +}
|
| +
|
| +/**
|
| + * Implement UnicodeMatcher
|
| + */
|
| +UBool Quantifier::matchesIndexValue(uint8_t v) const {
|
| + return (minCount == 0) || matcher->toMatcher()->matchesIndexValue(v);
|
| +}
|
| +
|
| +/**
|
| + * Implement UnicodeMatcher
|
| + */
|
| +void Quantifier::addMatchSetTo(UnicodeSet& toUnionTo) const {
|
| + if (maxCount > 0) {
|
| + matcher->toMatcher()->addMatchSetTo(toUnionTo);
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * Implement UnicodeFunctor
|
| + */
|
| +void Quantifier::setData(const TransliterationRuleData* d) {
|
| + matcher->setData(d);
|
| +}
|
| +
|
| +U_NAMESPACE_END
|
| +
|
| +#endif /* #if !UCONFIG_NO_TRANSLITERATION */
|
| +
|
| +//eof
|
|
|
| Property changes on: icu46/source/i18n/quant.cpp
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|