mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-20 20:19:32 +00:00
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:
parent
35ec4512fc
commit
5d4a3a7589
3 changed files with 28 additions and 21 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue