src/share/classes/sun/io/ByteToCharDBCS_ASCII.java

Print this page

        

*** 22,50 **** * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ package sun.io; public abstract class ByteToCharDBCS_ASCII extends ByteToCharConverter { private boolean savedBytePresent; ! private byte savedByte; ! protected String singleByteToChar; ! protected boolean leadByte[]; ! protected short index1[]; ! protected String index2; ! protected int mask1; ! protected int mask2; ! protected int shift; ! ! public ByteToCharDBCS_ASCII() { super(); savedBytePresent = false; } public int flush(char [] output, int outStart, int outEnd) throws MalformedInputException { if (savedBytePresent) { --- 22,55 ---- * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ package sun.io; + import sun.nio.cs.ext.DoubleByte; + import static sun.nio.cs.CharsetMapping.*; + public abstract class ByteToCharDBCS_ASCII extends ByteToCharConverter { private boolean savedBytePresent; ! private int savedByte; ! private DoubleByte.Decoder dec; ! public ByteToCharDBCS_ASCII(DoubleByte.Decoder dec) { super(); savedBytePresent = false; + this.dec = dec; } + char decodeSingle(int b) { + return dec.decodeSingle(b); + } + + char decodeDouble(int b1, int b2) { + return dec.decodeDouble(b1, b2); + } + public int flush(char [] output, int outStart, int outEnd) throws MalformedInputException { if (savedBytePresent) {
*** 64,119 **** char[] output, int outOff, int outEnd) throws UnknownCharacterException, MalformedInputException, ConversionBufferFullException { int inputSize; ! char outputChar = '\uFFFD'; charOff = outOff; byteOff = inOff; while(byteOff < inEnd) { ! int byte1, byte2; ! int v; if (!savedBytePresent) { ! byte1 = input[byteOff]; inputSize = 1; } else { byte1 = savedByte; savedBytePresent = false; inputSize = 0; } ! if (byte1 < 0) ! byte1 += 256; - if (!leadByte[byte1]) - { - outputChar = singleByteToChar.charAt(byte1); - } else { - if (byteOff + inputSize >= inEnd) { ! savedByte = (byte)byte1; savedBytePresent = true; byteOff += inputSize; break; } ! byte2 = input[byteOff+inputSize]; ! if (byte2 < 0) ! byte2 += 256; ! inputSize++; - - // Lookup in the two level index - v = byte1 * 256 + byte2; - outputChar = index2.charAt(index1[((v & mask1) >> shift)] + (v & mask2)); } ! if (outputChar == '\uFFFD') { if (subMode) outputChar = subChars[0]; else { badInputLength = inputSize; throw new UnknownCharacterException(); --- 69,111 ---- char[] output, int outOff, int outEnd) throws UnknownCharacterException, MalformedInputException, ConversionBufferFullException { int inputSize; ! char outputChar = UNMAPPABLE_DECODING; charOff = outOff; byteOff = inOff; while(byteOff < inEnd) { ! int byte1; if (!savedBytePresent) { ! byte1 = input[byteOff] & 0xff; inputSize = 1; } else { byte1 = savedByte; savedBytePresent = false; inputSize = 0; } ! outputChar = decodeSingle(byte1); ! if (outputChar == UNMAPPABLE_DECODING) { if (byteOff + inputSize >= inEnd) { ! savedByte = byte1; savedBytePresent = true; byteOff += inputSize; break; } ! outputChar = decodeDouble(byte1, input[byteOff+inputSize] & 0xff); inputSize++; } ! if (outputChar == UNMAPPABLE_DECODING) { if (subMode) outputChar = subChars[0]; else { badInputLength = inputSize; throw new UnknownCharacterException();