summaryrefslogtreecommitdiffstats
path: root/libjava/java/text
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/text')
-rw-r--r--libjava/java/text/CollationElementIterator.java8
-rw-r--r--libjava/java/text/RuleBasedCollator.java31
-rw-r--r--libjava/java/text/natCollator.cc2
3 files changed, 25 insertions, 16 deletions
diff --git a/libjava/java/text/CollationElementIterator.java b/libjava/java/text/CollationElementIterator.java
index a6546294b87..15e60560189 100644
--- a/libjava/java/text/CollationElementIterator.java
+++ b/libjava/java/text/CollationElementIterator.java
@@ -27,7 +27,7 @@ public final class CollationElementIterator
{
if (index == text.length())
return NULLORDER;
- return RuleBasedCollator.ceiNext(this);
+ return collator.ceiNext(this);
}
// This one returns int while the others return short.
@@ -55,12 +55,13 @@ public final class CollationElementIterator
}
// Non-public constructor.
- CollationElementIterator (String text)
+ CollationElementIterator (String text, RuleBasedCollator collator)
{
this.text = text;
this.index = 0;
this.lookahead_set = false;
this.lookahead = 0;
+ this.collator = collator;
}
// Text over which we iterate.
@@ -72,4 +73,7 @@ public final class CollationElementIterator
// A piece of lookahead.
boolean lookahead_set;
int lookahead;
+
+ // The RuleBasedCollator which created this object.
+ RuleBasedCollator collator;
}
diff --git a/libjava/java/text/RuleBasedCollator.java b/libjava/java/text/RuleBasedCollator.java
index 18046adf9e5..fd4002b1a9f 100644
--- a/libjava/java/text/RuleBasedCollator.java
+++ b/libjava/java/text/RuleBasedCollator.java
@@ -43,7 +43,7 @@ public class RuleBasedCollator extends Collator
}
// A helper for CollationElementIterator.next().
- static int ceiNext (CollationElementIterator cei)
+ int ceiNext (CollationElementIterator cei)
{
if (cei.lookahead_set)
{
@@ -61,7 +61,7 @@ public class RuleBasedCollator extends Collator
boolean found = false;
int i;
- for (i = save; i < max; ++i)
+ for (i = save + 1; i <= max; ++i)
{
s = cei.text.substring(save, i);
if (prefixes.get(s) == null)
@@ -108,16 +108,15 @@ public class RuleBasedCollator extends Collator
switch (strength)
{
case PRIMARY:
- c |= CollationElementIterator.primaryOrder(os);
- /* Fall through. */
+ c = os & ~0xffff;
+ break;
case SECONDARY:
- c |= CollationElementIterator.secondaryOrder(os);
- /* Fall through. */
- case TERTIARY:
- c |= CollationElementIterator.tertiaryOrder(os);
+ c = os & ~0x00ff;
break;
+ case TERTIARY:
case IDENTICAL:
c = os;
+ break;
}
if (c != 0)
return c;
@@ -128,8 +127,8 @@ public class RuleBasedCollator extends Collator
{
CollationElementIterator cs, ct;
- cs = new CollationElementIterator (source);
- ct = new CollationElementIterator (target);
+ cs = new CollationElementIterator (source, this);
+ ct = new CollationElementIterator (target, this);
while (true)
{
@@ -140,9 +139,15 @@ public class RuleBasedCollator extends Collator
&& ot == CollationElementIterator.NULLORDER)
break;
else if (os == CollationElementIterator.NULLORDER)
- return 1;
+ {
+ // Source string is shorter, so return "less than".
+ return -1;
+ }
else if (ot == CollationElementIterator.NULLORDER)
- return -1;
+ {
+ // Target string is shorter, so return "greater than".
+ return 1;
+ }
if (os != ot)
return os - ot;
@@ -168,7 +173,7 @@ public class RuleBasedCollator extends Collator
int max = source.length();
for (int i = 0; i < max; ++i)
decomposeCharacter (source.charAt(i), expand);
- return new CollationElementIterator (expand.toString());
+ return new CollationElementIterator (expand.toString(), this);
}
public CollationKey getCollationKey (String source)
diff --git a/libjava/java/text/natCollator.cc b/libjava/java/text/natCollator.cc
index 7624b7c973a..378ac5c448c 100644
--- a/libjava/java/text/natCollator.cc
+++ b/libjava/java/text/natCollator.cc
@@ -30,7 +30,7 @@ java::text::Collator::decomposeCharacter (jchar c,
return;
}
- struct decomp_entry *base;
+ const struct decomp_entry *base;
int high;
if (decmp == FULL_DECOMPOSITION)
OpenPOWER on IntegriCloud