StringBuffer.java (ensureCapacity): Don't resize vector when shared.

* java/lang/StringBuffer.java (ensureCapacity): Don't resize
	vector when shared.
	* java/util/Locale.java (Locale(String,String)): Implement in
	terms of 3-argument version; variant now defaults to empty
	string.
	(toString): Assume variant is not null.
	(equals): Assume all strings are not null.
	(Locale): Throw NullPointerException if any argument is null.
	* java/util/ResourceBundle.java (getBundle): Don't try the base
	name; now implicit in partialGetBundle call.
	(trySomeGetBundle): Search for parent bundles and call setParent
	as required.
	(partialGetBundle): Added `langStop' argument.  Use
	`Locale.toString' to compute bundleName.
	(resource_cache): New static field.
	(partialGetBundle): Cache the returned resource bundle.  Now
	synchronized.
	* gnu/gcj/text/LocaleData_en.java (contents): [collatorRule] Added
	missing `<'.
	* mauve-libgcj: Enable Collator and RuleBasedCollator.
	* java/text/natCollator.cc (decomposeCharacter): `base' now
	`const'.
	* Makefile.in: Rebuilt.
	* Makefile.am (ordinary_java_source_files): Added
	CollationElementIterator, CollationKey, Collator,
	RuleBasedCollator.
	(nat_source_files): Added natCollator.cc.
	* java/text/RuleBasedCollator.java (ceiNext): No longer static.
	(compare): Pass `this' to CollationElementIterator constructor.
	(getCollationElementIterator): Likewise.
	(ceiNext): Fix off-by-one error when finding initial substring.
	(next): Correctly mask off bits when computing return value.
	Fixed return values when one string is shorter than the other.
	* java/text/CollationElementIterator.java (collator): New field.
	(CollationElementIterator): Added collator argument.
	(next): Call ceiNext on collator object.

From-SVN: r26707
This commit is contained in:
Tom Tromey 1999-04-30 09:31:00 +00:00 committed by Tom Tromey
parent 1c609c4cbe
commit a0e894a8cc
11 changed files with 216 additions and 114 deletions

View file

@ -98,7 +98,13 @@ public final class StringBuffer implements Serializable
{
if (shared || minimumCapacity > value.length)
{
minimumCapacity = Math.max(minimumCapacity, value.length*2+2);
// We don't want to make a larger vector when `shared' is
// set. If we do, then setLength becomes very inefficient
// when repeatedly reusing a StringBuffer in a loop.
int max = (minimumCapacity > value.length
? value.length*2+2
: value.length);
minimumCapacity = Math.max(minimumCapacity, max);
char[] nb = new char[minimumCapacity];
System.arraycopy(value, 0, nb, 0, count);
value = nb;

View file

@ -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;
}

View file

@ -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. */
case SECONDARY:
c |= CollationElementIterator.secondaryOrder(os);
/* Fall through. */
case TERTIARY:
c |= CollationElementIterator.tertiaryOrder(os);
c = os & ~0xffff;
break;
case SECONDARY:
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)

View file

@ -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)

View file

@ -36,33 +36,34 @@ public final class Locale implements java.io.Serializable, Cloneable
public Locale (String languageCode, String countryCode)
{
language = languageCode.toLowerCase();
country = countryCode.toUpperCase();
hashcode = languageCode.hashCode() ^ countryCode.hashCode();
this (languageCode, countryCode, "");
}
public Locale (String languageCode, String countryCode,
String variantCode)
{
this (languageCode, countryCode);
variant = variantCode;
hashcode ^= variantCode.hashCode();
// We must explicitly check the arguments.
if (languageCode == null || countryCode == null
|| variantCode == null)
throw new NullPointerException ();
language = languageCode.toLowerCase();
country = countryCode.toUpperCase();
variant = variantCode.toUpperCase();
hashcode = (languageCode.hashCode()
^ countryCode.hashCode()
^ variantCode.hashCode());
}
public Object clone ()
{
return (Object) new Locale (language, country, variant);
}
{
return (Object) new Locale (language, country, variant);
}
public boolean equals (Object obj)
{
if (! (obj instanceof Locale))
return false;
Locale loc = (Locale) obj;
if ((language == null && loc.language != null)
|| (country == null && loc.country != null)
|| (variant == null && loc.variant != null))
return false;
return (language.equals(loc.language)
&& country.equals(loc.country)
&& variant.equals(loc.variant));
@ -115,7 +116,7 @@ public final class Locale implements java.io.Serializable, Cloneable
result.append(language);
result.append('_');
result.append(country);
if (variant != null && variant.length() > 0)
if (variant.length() > 0)
{
result.append('_');
result.append(variant);

View file

@ -20,6 +20,9 @@ public abstract class ResourceBundle
{
protected ResourceBundle parent;
// This is used to cache resource bundles.
private static Hashtable resource_cache = new Hashtable ();
public ResourceBundle ()
{
}
@ -65,15 +68,17 @@ public abstract class ResourceBundle
String stopHere)
{
Class rbc;
ResourceBundle needs_parent = null, r, result = null;
while (true)
{
try
{
rbc = Class.forName(bundleName);
r = null;
try
{
return (ResourceBundle) rbc.newInstance();
r = (ResourceBundle) rbc.newInstance();
}
catch (IllegalAccessException ex)
{
@ -83,45 +88,61 @@ public abstract class ResourceBundle
{
// Fall through
}
return null;
if (r != null)
{
if (result == null)
result = r;
if (needs_parent != null)
{
// We've been through the loop one or more times
// already. Set the parent and keep going.
needs_parent.setParent(r);
}
needs_parent = r;
}
}
catch (ClassNotFoundException ex)
{
if (bundleName.compareTo(stopHere) == 0)
return null;
else
{
int last = bundleName.lastIndexOf('_');
// Fall through.
}
if (bundleName.equals(stopHere))
return result;
else
{
int last = bundleName.lastIndexOf('_');
// No more underscores?
if (last == -1)
return null;
// Loop around, testing this new shorter name.
bundleName = bundleName.substring(0, last);
}
// No more underscores?
if (last == -1)
return result;
// Loop around, testing this new shorter name.
bundleName = bundleName.substring(0, last);
}
}
}
// Search for bundles, but stop at baseName_language.
private static final ResourceBundle partialGetBundle (String baseName,
Locale locale)
// Search for bundles, but stop at baseName_language (if required).
// This is synchronized so that the cache works correctly.
private static final synchronized ResourceBundle
partialGetBundle (String baseName, Locale locale, boolean langStop)
{
ResourceBundle rb;
String bundleName = (baseName
+ "_"
+ locale.getLanguage() + "_"
+ locale.getCountry() + "_"
+ locale.getVariant());
String bundleName = baseName + "_" + locale;
// Check the cache.
Object obj = resource_cache.get(bundleName);
if (obj != null)
return (ResourceBundle) obj;
String stopHere = (baseName
+ "_"
+ locale.getLanguage());
+ (langStop ? ("_" + locale.getLanguage()) : ""));
rb = trySomeGetBundle(bundleName, stopHere);
if (rb != null)
resource_cache.put(bundleName, rb);
return rb;
}
@ -138,39 +159,18 @@ public abstract class ResourceBundle
if (locale == null)
throw new NullPointerException ();
rb = partialGetBundle(baseName, locale);
rb = partialGetBundle(baseName, locale, false);
if (rb != null)
return rb;
// Finally, try the default locale.
if (! locale.equals(Locale.getDefault()))
{
rb = partialGetBundle(baseName, Locale.getDefault());
rb = partialGetBundle(baseName, Locale.getDefault(), true);
if (rb != null)
return rb;
}
// Try just the baseName.
try
{
rbc = Class.forName (baseName);
try
{
return (ResourceBundle) rbc.newInstance();
}
catch (IllegalAccessException ex)
{
// Fall through.
}
catch (InstantiationException ex)
{
// Fall through.
}
}
catch (ClassNotFoundException ex)
{
// Fall through.
}
throw new MissingResourceException("can't load bundle",
baseName,
"bundle");