ICU-6117 Whoops, created some problems, so I made them ok. Also changed some underflow-overflow checks around for the sake of performance, and reverted a test that I shouldn't have changed some time ago.

X-SVN-Rev: 23232
This commit is contained in:
Andrew J Macheret 2008-01-14 21:50:17 +00:00
parent 35ec4512fc
commit 5d4a3a7589
3 changed files with 28 additions and 21 deletions

View file

@ -35,7 +35,7 @@ class CharsetUTF16 extends CharsetICU {
private byte[] bom;
private byte[] fromUSubstitution;
protected CharsetUTF16(String icuCanonicalName, String javaCanonicalName, String[] aliases) {
public CharsetUTF16(String icuCanonicalName, String javaCanonicalName, String[] aliases) {
super(icuCanonicalName, javaCanonicalName, aliases);
this.isEndianSpecified = (this instanceof CharsetUTF16BE || this instanceof CharsetUTF16LE);
@ -201,12 +201,12 @@ class CharsetUTF16 extends CharsetICU {
public CharsetEncoderUTF16(CharsetICU cs) {
super(cs, fromUSubstitution);
fromUnicodeStatus = isEndianSpecified ? NEED_TO_WRITE_BOM : 0;
fromUnicodeStatus = isEndianSpecified ? 0 : NEED_TO_WRITE_BOM;
}
protected void implReset() {
super.implReset();
fromUnicodeStatus = isEndianSpecified ? NEED_TO_WRITE_BOM : 0;
fromUnicodeStatus = isEndianSpecified ? 0 : NEED_TO_WRITE_BOM;
}
protected CoderResult encodeLoop(CharBuffer source, ByteBuffer target, IntBuffer offsets, boolean flush) {
@ -214,8 +214,6 @@ class CharsetUTF16 extends CharsetICU {
/* write the BOM if necessary */
if (fromUnicodeStatus == NEED_TO_WRITE_BOM) {
if (!source.hasRemaining())
return CoderResult.UNDERFLOW;
if (!target.hasRemaining())
return CoderResult.OVERFLOW;
@ -226,6 +224,9 @@ class CharsetUTF16 extends CharsetICU {
}
if (fromUChar32 != 0) {
if (!target.hasRemaining())
return CoderResult.OVERFLOW;
// a note: fromUChar32 will either be 0 or a lead surrogate
cr = encodeChar(source, target, offsets, (char) fromUChar32);
if (cr != null)
@ -233,6 +234,11 @@ class CharsetUTF16 extends CharsetICU {
}
while (true) {
if (!source.hasRemaining())
return CoderResult.UNDERFLOW;
if (!target.hasRemaining())
return CoderResult.OVERFLOW;
cr = encodeChar(source, target, offsets, source.get());
if (cr != null)
return cr;
@ -240,11 +246,6 @@ class CharsetUTF16 extends CharsetICU {
}
private final CoderResult encodeChar(CharBuffer source, ByteBuffer target, IntBuffer offsets, char ch) {
if (!source.hasRemaining())
return CoderResult.UNDERFLOW;
if (!target.hasRemaining())
return CoderResult.OVERFLOW;
int sourceIndex = source.position() - 1;
CoderResult cr;

View file

@ -35,7 +35,7 @@ class CharsetUTF32 extends CharsetICU {
private byte[] bom;
private byte[] fromUSubstitution;
protected CharsetUTF32(String icuCanonicalName, String javaCanonicalName, String[] aliases) {
public CharsetUTF32(String icuCanonicalName, String javaCanonicalName, String[] aliases) {
super(icuCanonicalName, javaCanonicalName, aliases);
this.isEndianSpecified = (this instanceof CharsetUTF32BE || this instanceof CharsetUTF32LE);
@ -57,7 +57,7 @@ class CharsetUTF32 extends CharsetICU {
}
class CharsetDecoderUTF32 extends CharsetDecoderICU {
private boolean isBOMReadYet;
private int actualEndianXOR;
private byte[] actualBOM;
@ -165,24 +165,22 @@ class CharsetUTF32 extends CharsetICU {
public CharsetEncoderUTF32(CharsetICU cs) {
super(cs, fromUSubstitution);
fromUnicodeStatus = isEndianSpecified ? NEED_TO_WRITE_BOM : 0;
fromUnicodeStatus = isEndianSpecified ? 0 : NEED_TO_WRITE_BOM;
}
protected void implReset() {
super.implReset();
fromUnicodeStatus = isEndianSpecified ? NEED_TO_WRITE_BOM : 0;
fromUnicodeStatus = isEndianSpecified ? 0 : NEED_TO_WRITE_BOM;
}
protected CoderResult encodeLoop(CharBuffer source, ByteBuffer target, IntBuffer offsets, boolean flush) {
if (!source.hasRemaining())
return CoderResult.UNDERFLOW;
if (!target.hasRemaining())
return CoderResult.OVERFLOW;
CoderResult cr;
/* write the BOM if necessary */
if (fromUnicodeStatus == NEED_TO_WRITE_BOM) {
if (!target.hasRemaining())
return CoderResult.OVERFLOW;
fromUnicodeStatus = 0;
cr = fromUWriteBytes(this, bom, 0, bom.length, target, offsets, -1);
if (cr.isOverflow())
@ -190,6 +188,9 @@ class CharsetUTF32 extends CharsetICU {
}
if (fromUChar32 != 0) {
if (!target.hasRemaining())
return CoderResult.OVERFLOW;
// a note: fromUChar32 will either be 0 or a lead surrogate
cr = encodeChar(source, target, offsets, (char) fromUChar32);
if (cr != null)

View file

@ -66,6 +66,10 @@ public class TestCharset extends TestFmwk {
protected void init(){
try{
if ("UTF-16".equals(m_encoding)) {
int x = 2;
x++;
}
CharsetProviderICU provider = new CharsetProviderICU();
//Charset charset = CharsetICU.forName(encoding);
m_charset = provider.charsetForName(m_encoding);
@ -3842,8 +3846,9 @@ public class TestCharset extends TestFmwk {
result = encoder.encode(us, bs, true);
if (!result.isOverflow()) {
errln("Overflow while encoding UTF-16LE (1) should have occured.");
if (!result.isMalformed()) {
// LE should not output BOM, so this should be malformed
errln("Malformed while encoding UTF-16LE (1) should have occured.");
}
// Test for malform surrogate from previous buffer