2005-08-23 Roman Kennke <roman@kennke.org>

* java/lang/Character.java
	(toChars(int)): New JDK1.5 method.
	(toChars(int, char[], int)): New JDK1.5 method.
	(charCount): New JDK1.5 method.
	(isSupplementaryCodePoint): New JDK1.5 method.
	(isValidCodePoint): New JDK1.5 method.

From-SVN: r103413
This commit is contained in:
Roman Kennke 2005-08-23 22:19:17 +00:00 committed by Tom Tromey
parent 7d04db3f0f
commit daa6fb4110
2 changed files with 175 additions and 1 deletions

View File

@ -1,3 +1,12 @@
2005-08-23 Roman Kennke <roman@kennke.org>
* java/lang/Character.java
(toChars(int)): New JDK1.5 method.
(toChars(int, char[], int)): New JDK1.5 method.
(charCount): New JDK1.5 method.
(isSupplementaryCodePoint): New JDK1.5 method.
(isValidCodePoint): New JDK1.5 method.
2005-08-23 Tom Tromey <tromey@redhat.com>
* aclocal.m4, Makefile.in: Rebuilt.

View File

@ -1,5 +1,5 @@
/* java.lang.Character -- Wrapper class for char, and Unicode subsets
Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2001, 2002, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -1410,6 +1410,57 @@ public final class Character implements Serializable, Comparable
*/
private static final int MIRROR_MASK = 0x40;
/**
* Min value for supplementary code point.
*
* @since 1.5
*/
public static final int MIN_SUPPLEMENTARY_CODE_POINT = 0x10000;
/**
* Min value for code point.
*
* @since 1.5
*/
public static final int MIN_CODE_POINT = 0;
/**
* Max value for code point.
*
* @since 1.5
*/
public static final int MAX_CODE_POINT = 0x010ffff;
/**
* Minimum high surrrogate code in UTF-16 encoding.
*
* @since 1.5
*/
public static final char MIN_HIGH_SURROGATE = '\ud800';
/**
* Maximum high surrrogate code in UTF-16 encoding.
*
* @since 1.5
*/
public static final char MAX_HIGH_SURROGATE = '\udbff';
/**
* Minimum low surrrogate code in UTF-16 encoding.
*
* @since 1.5
*/
public static final char MIN_LOW_SURROGATE = '\udc00';
/**
* Maximum low surrrogate code in UTF-16 encoding.
*
* @since 1.5
*/
public static final char MAX_LOW_SURROGATE = '\udfff';
/**
* Grabs an attribute offset from the Unicode attribute database. The lower
* 5 bits are the character type, the next 2 bits are flags, and the top
@ -2160,4 +2211,118 @@ public final class Character implements Serializable, Comparable
{
return compareTo((Character) o);
}
/**
* Converts a unicode code point to a UTF-16 representation of that
* code point.
*
* @param codePoint the unicode code point
*
* @return the UTF-16 representation of that code point
*
* @throws IllegalArgumentException if the code point is not a valid
* unicode code point
*
* @since 1.5
*/
public static char[] toChars(int codePoint)
{
char[] result = new char[charCount(codePoint)];
int ignore = toChars(codePoint, result, 0);
return result;
}
/**
* Converts a unicode code point to its UTF-16 representation.
*
* @param codePoint the unicode code point
* @param dst the target char array
* @param dstIndex the start index for the target
*
* @return number of characters written to <code>dst</code>
*
* @throws IllegalArgumentException if <code>codePoint</code> is not a
* valid unicode code point
* @throws NullPointerException if <code>dst</code> is <code>null</code>
* @throws IndexOutOfBoundsException if <code>dstIndex</code> is not valid
* in <code>dst</code> or if the UTF-16 representation does not
* fit into <code>dst</code>
*
* @since 1.5
*/
public static int toChars(int codePoint, char[] dst, int dstIndex)
{
if (!isValidCodePoint(codePoint))
{
throw new IllegalArgumentException("not a valid code point: "
+ codePoint);
}
int result;
if (isSupplementaryCodePoint(codePoint))
{
// Write second char first to cause IndexOutOfBoundsException
// immediately.
dst[dstIndex + 1] = (char) ((codePoint & 0x3ff)
+ (int) MIN_LOW_SURROGATE );
dst[dstIndex] = (char) ((codePoint >> 10) + (int) MIN_HIGH_SURROGATE);
result = 2;
}
else
{
dst[dstIndex] = (char) codePoint;
result = 1;
}
return result;
}
/**
* Return number of 16-bit characters required to represent the given
* code point.
*
* @param codePoint a uncode code point
*
* @return 2 if codePoint >= 0x10000, 1 otherwise.
*
* @since 1.5
*/
public static int charCount(int codePoint)
{
return
(codePoint >= MIN_SUPPLEMENTARY_CODE_POINT)
? 2
: 1;
}
/**
* Determines whether the specified code point is
* in the range 0x10000 .. 0x10FFFF, i.e. the character is within the Unicode
* supplementary character range.
*
* @param codePoint a Unicode code point
*
* @return <code>true</code> if code point is in supplementary range
*
* @since 1.5
*/
public static boolean isSupplementaryCodePoint(int codePoint)
{
return codePoint >= MIN_SUPPLEMENTARY_CODE_POINT
&& codePoint <= MAX_CODE_POINT;
}
/**
* Determines whether the specified code point is
* in the range 0x0000 .. 0x10FFFF, i.e. it is a valid Unicode code point.
*
* @param codePoint a Unicode code point
*
* @return <code>true</code> if code point is valid
*
* @since 1.5
*/
public static boolean isValidCodePoint(int codePoint)
{
return codePoint >= MIN_CODE_POINT && codePoint <= MAX_CODE_POINT;
}
} // class Character