From eff9454c7677a271f908192a89599de5a6c21a40 Mon Sep 17 00:00:00 2001 From: Alan Liu Date: Thu, 29 Jun 2000 00:18:43 +0000 Subject: [PATCH] ICU-474 fix UTransPosition handling X-SVN-Rev: 1688 --- icu4c/source/i18n/rbt.cpp | 26 +++++++++----------------- icu4c/source/i18n/rbt_rule.cpp | 26 ++++++++++++-------------- icu4c/source/i18n/rbt_rule.h | 15 +++++++-------- icu4c/source/i18n/rbt_set.cpp | 15 ++++++--------- icu4c/source/i18n/rbt_set.h | 7 +++---- 5 files changed, 37 insertions(+), 52 deletions(-) diff --git a/icu4c/source/i18n/rbt.cpp b/icu4c/source/i18n/rbt.cpp index 574c970d331..aec9c7b3565 100644 --- a/icu4c/source/i18n/rbt.cpp +++ b/icu4c/source/i18n/rbt.cpp @@ -88,10 +88,6 @@ RuleBasedTransliterator::handleTransliterate(Replaceable& text, UTransPosition& * exzd| done */ - int32_t contextStart = index.contextStart; - int32_t limit = index.limit; - int32_t cursor = index.start; - /* A rule like * a>b|a * creates an infinite loop. To prevent that, we put an arbitrary @@ -102,7 +98,7 @@ RuleBasedTransliterator::handleTransliterate(Replaceable& text, UTransPosition& * uint32_t. */ uint32_t loopCount = 0; - uint32_t loopLimit = limit - cursor; + uint32_t loopLimit = index.limit - index.start; if (loopLimit >= 0x10000000) { loopLimit = 0xFFFFFFFF; } else { @@ -111,13 +107,11 @@ RuleBasedTransliterator::handleTransliterate(Replaceable& text, UTransPosition& UBool isPartial = FALSE; - while (cursor < limit && loopCount <= loopLimit) { + while (index.start < index.limit && loopCount <= loopLimit) { TransliterationRule* r = isIncremental ? - data->ruleSet.findIncrementalMatch(text, contextStart, limit, cursor, - *data, isPartial, + data->ruleSet.findIncrementalMatch(text, index, *data, isPartial, getFilter()) : - data->ruleSet.findMatch(text, contextStart, limit, - cursor, *data, + data->ruleSet.findMatch(text, index, *data, getFilter()); /* If we match a rule then apply it by replacing the key @@ -132,17 +126,15 @@ RuleBasedTransliterator::handleTransliterate(Replaceable& text, UTransPosition& if (isPartial) { // always FALSE unless isIncremental break; } else { - ++cursor; + ++index.start; } } else { // Delegate replacement to TransliterationRule object - limit += r->replace(text, cursor, *data); - cursor += r->getCursorPos(); + int32_t lenDelta = r->replace(text, index.start, *data); + index.limit += lenDelta; + index.contextLimit += lenDelta; + index.start += r->getCursorPos(); ++loopCount; } } - - index.contextLimit += limit - index.limit; - index.limit = limit; - index.start = cursor; } diff --git a/icu4c/source/i18n/rbt_rule.cpp b/icu4c/source/i18n/rbt_rule.cpp index 99cfbd04359..8c19a1edc4a 100644 --- a/icu4c/source/i18n/rbt_rule.cpp +++ b/icu4c/source/i18n/rbt_rule.cpp @@ -297,13 +297,13 @@ UBool TransliterationRule::masks(const TransliterationRule& r2) const { * null then no filtering is applied. */ UBool TransliterationRule::matches(const Replaceable& text, - int32_t start, int32_t limit, - int32_t cursor, - const TransliterationRuleData& data, - const UnicodeFilter* filter) const { + const UTransPosition& pos, + const TransliterationRuleData& data, + const UnicodeFilter* filter) const { // Match anteContext, key, and postContext - cursor -= anteContextLength; - if (cursor < start || (cursor + pattern.length()) > limit) { + int32_t cursor = pos.start - anteContextLength; + if (cursor < pos.contextStart || + (cursor + pattern.length()) > pos.contextLimit) { return FALSE; } for (int32_t i=0; inull then no filtering is applied. */ virtual UBool matches(const Replaceable& text, - int32_t start, int32_t limit, - int32_t cursor, - const TransliterationRuleData& data, - const UnicodeFilter* filter) const; + const UTransPosition& pos, + const TransliterationRuleData& data, + const UnicodeFilter* filter) const; /** * Return the degree of match between this rule and the given text. The @@ -287,8 +287,7 @@ public: * @see #FULL_MATCH */ virtual int32_t getMatchDegree(const Replaceable& text, - int32_t start, int32_t limit, - int32_t cursor, + const UTransPosition& pos, const TransliterationRuleData& data, const UnicodeFilter* filter) const; @@ -315,8 +314,8 @@ public: * match any characters, otherwise the number of characters of text that * match this rule. */ - virtual int32_t getRegionMatchLength(const Replaceable& text, int32_t start, - int32_t limit, int32_t cursor, + virtual int32_t getRegionMatchLength(const Replaceable& text, + const UTransPosition& pos, const UnicodeString& templ, const TransliterationRuleData& data, const UnicodeFilter* filter) const; diff --git a/icu4c/source/i18n/rbt_set.cpp b/icu4c/source/i18n/rbt_set.cpp index 70de29712ac..709164eeb2f 100644 --- a/icu4c/source/i18n/rbt_set.cpp +++ b/icu4c/source/i18n/rbt_set.cpp @@ -203,16 +203,15 @@ void TransliterationRuleSet::freeze(const TransliterationRuleData& data, */ TransliterationRule* TransliterationRuleSet::findMatch(const Replaceable& text, - int32_t start, int32_t limit, - int32_t cursor, + const UTransPosition& pos, const TransliterationRuleData& data, const UnicodeFilter* filter) const { /* We only need to check our indexed bin of the rule table, * based on the low byte of the first key character. */ - int16_t x = text.charAt(cursor) & 0xFF; + int16_t x = text.charAt(pos.start) & 0xFF; for (int32_t i=index[x]; imatches(text, start, limit, cursor, data, filter)) { + if (rules[i]->matches(text, pos, data, filter)) { return rules[i]; } } @@ -248,8 +247,7 @@ TransliterationRuleSet::findMatch(const Replaceable& text, */ TransliterationRule* TransliterationRuleSet::findIncrementalMatch(const Replaceable& text, - int32_t start, - int32_t limit, int32_t cursor, + const UTransPosition& pos, const TransliterationRuleData& data, UBool& isPartial, const UnicodeFilter* filter) const { @@ -258,10 +256,9 @@ TransliterationRuleSet::findIncrementalMatch(const Replaceable& text, * based on the low byte of the first key character. */ isPartial = FALSE; - int16_t x = text.charAt(cursor) & 0xFF; + int16_t x = text.charAt(pos.start) & 0xFF; for (int32_t i=index[x]; igetMatchDegree(text, start, limit, cursor, - data, filter); + int32_t match = rules[i]->getMatchDegree(text, pos, data, filter); switch (match) { case TransliterationRule::FULL_MATCH: return rules[i]; diff --git a/icu4c/source/i18n/rbt_set.h b/icu4c/source/i18n/rbt_set.h index 8812893d878..fa82f83e27b 100644 --- a/icu4c/source/i18n/rbt_set.h +++ b/icu4c/source/i18n/rbt_set.h @@ -9,6 +9,7 @@ #define RBT_SET_H #include "uvector.h" +#include "unicode/utrans.h" class Replaceable; class TransliterationRule; @@ -110,8 +111,7 @@ public: * @return the matching rule, or null if none found. */ virtual TransliterationRule* findMatch(const Replaceable& text, - int32_t start, int32_t limit, - int32_t cursor, + const UTransPosition& pos, const TransliterationRuleData& data, const UnicodeFilter* filter) const; @@ -143,8 +143,7 @@ public: * does not have enough text yet to unambiguously match a rule. */ virtual TransliterationRule* findIncrementalMatch(const Replaceable& text, - int32_t start, - int32_t limit, int32_t cursor, + const UTransPosition& pos, const TransliterationRuleData& data, UBool& isPartial, const UnicodeFilter* filter) const;