From 0ac7284cadf754b3ddb5edf9d172ec79b25199c0 Mon Sep 17 00:00:00 2001 From: Vladimir Weinstein Date: Fri, 22 Jul 2005 22:52:21 +0000 Subject: [PATCH] ICU-4355 Port of no UCA runtime X-SVN-Rev: 18337 --- .../icu/text/CollationElementIterator.java | 21 +++++++++++----- .../com/ibm/icu/text/RuleBasedCollator.java | 24 +++++++++++++------ 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/icu4j/src/com/ibm/icu/text/CollationElementIterator.java b/icu4j/src/com/ibm/icu/text/CollationElementIterator.java index 0c6d4f79044..450e3e5566d 100755 --- a/icu4j/src/com/ibm/icu/text/CollationElementIterator.java +++ b/icu4j/src/com/ibm/icu/text/CollationElementIterator.java @@ -290,7 +290,7 @@ public final class CollationElementIterator // surrogate leads are handled as special ces result = nextSpecial(m_collator_, result, ch); } - if (result == CE_NOT_FOUND_) { + if (result == CE_NOT_FOUND_ && RuleBasedCollator.UCA_ != null) { // couldn't find a good CE in the tailoring // if we got here, the codepoint MUST be over 0xFF - so we look // directly in the UCA @@ -301,6 +301,10 @@ public final class CollationElementIterator } } } + if(result == CE_NOT_FOUND_) { + // maybe there is no UCA, unlikely in Java, but ported for consistency + result = nextImplicit(ch); + } return result; } @@ -370,16 +374,21 @@ public final class CollationElementIterator result = CE_CONTRACTION_; } else { - result - = RuleBasedCollator.UCA_.m_trie_.getLeadValue(ch); + if(RuleBasedCollator.UCA_ != null) { + result = RuleBasedCollator.UCA_.m_trie_.getLeadValue(ch); + } } if (RuleBasedCollator.isSpecial(result)) { - result = previousSpecial(RuleBasedCollator.UCA_, - result, ch); + if(RuleBasedCollator.UCA_ != null) { + result = previousSpecial(RuleBasedCollator.UCA_, result, ch); + } } } } + if(result == CE_NOT_FOUND_) { + result = previousImplicit(ch); + } return result; } @@ -1625,7 +1634,7 @@ public final class CollationElementIterator private int nextContraction(RuleBasedCollator collator, int ce) { backupInternalState(m_utilSpecialBackUp_); - int entryce = CE_NOT_FOUND_; + int entryce = collator.m_contractionCE_[getContractionOffset(collator, ce)]; //CE_NOT_FOUND_; while (true) { int entryoffset = getContractionOffset(collator, ce); int offset = entryoffset; diff --git a/icu4j/src/com/ibm/icu/text/RuleBasedCollator.java b/icu4j/src/com/ibm/icu/text/RuleBasedCollator.java index a8cb0fa5866..015d8d52181 100755 --- a/icu4j/src/com/ibm/icu/text/RuleBasedCollator.java +++ b/icu4j/src/com/ibm/icu/text/RuleBasedCollator.java @@ -1713,6 +1713,14 @@ public final class RuleBasedCollator extends Collator // static final byte SORT_LEVEL_TERMINATOR_ = 1; +// These are values from UCA required for +// implicit generation and supressing sort key compression +// they should regularly be in the UCA, but if one +// is running without UCA, it could be a problem + static final int maxRegularPrimary = 0xA0; + static final int minImplicitPrimary = 0xE0; + static final int maxImplicitPrimary = 0xE4; + // block to initialise character property database static @@ -1737,7 +1745,8 @@ public final class RuleBasedCollator extends Collator iUCA_CONTRACTIONS_ = CollatorReader.read(iUCA_, iUCA_CONSTANTS_); // called before doing canonical closure for the UCA. - iimpCEGen_ = new ImplicitCEGenerator(iUCA_CONSTANTS_.PRIMARY_IMPLICIT_MIN_, iUCA_CONSTANTS_.PRIMARY_IMPLICIT_MAX_); + iimpCEGen_ = new ImplicitCEGenerator(minImplicitPrimary, maxImplicitPrimary); + //iimpCEGen_ = new ImplicitCEGenerator(iUCA_CONSTANTS_.PRIMARY_IMPLICIT_MIN_, iUCA_CONSTANTS_.PRIMARY_IMPLICIT_MAX_); iUCA_.init(); ICUResourceBundle rb = (ICUResourceBundle)UResourceBundle.getBundleInstance(ICUResourceBundle.ICU_COLLATION_BASE_NAME, ULocale.ENGLISH); iUCA_.m_rules_ = (String)rb.getObject("UCARules"); @@ -2406,12 +2415,13 @@ public final class RuleBasedCollator extends Collator leadPrimary = 0; } else if (p1 < BYTE_FIRST_NON_LATIN_PRIMARY_ - || (p1 - > (RuleBasedCollator.UCA_CONSTANTS_.LAST_NON_VARIABLE_[0] - >>> 24) - && p1 - < (RuleBasedCollator.UCA_CONSTANTS_.FIRST_IMPLICIT_[0] - >>> 24))) { + || (p1 > maxRegularPrimary + //> (RuleBasedCollator.UCA_CONSTANTS_.LAST_NON_VARIABLE_[0] + // >>> 24) + && p1 < minImplicitPrimary + //< (RuleBasedCollator.UCA_CONSTANTS_.FIRST_IMPLICIT_[0] + // >>> 24) + )) { // not compressible leadPrimary = 0; m_utilBytes1_ = append(m_utilBytes1_,