src/share/classes/sun/nio/cs/ext/ISO2022_JP.java

Print this page

        

*** 33,42 **** --- 33,43 ---- import java.nio.charset.CoderResult; import java.nio.charset.CodingErrorAction; import sun.nio.cs.HistoricallyNamedCharset; import sun.nio.cs.Surrogate; import sun.nio.cs.US_ASCII; + import static sun.nio.cs.CharsetMapping.*; /* * Implementation notes: * * (1)"Standard based" (ASCII, JIS_X_0201 and JIS_X_0208) ISO2022-JP charset
*** 152,239 **** || (cs instanceof JIS_X_0208) || (cs instanceof ISO2022_JP)); } public CharsetDecoder newDecoder() { ! return new Decoder(this, ! getDecIndex1(), ! getDecIndex2(), ! get0212Decoder()); } public CharsetEncoder newEncoder() { ! return new Encoder(this, ! getEncIndex1(), ! getEncIndex2(), ! get0212Encoder(), ! doSBKANA()); ! } ! ! protected short[] getDecIndex1() { ! return JIS_X_0208_Decoder.getIndex1(); ! } ! ! protected String[] getDecIndex2() { ! return JIS_X_0208_Decoder.getIndex2(); ! } ! ! protected DoubleByteDecoder get0212Decoder() { ! return null; ! } ! ! protected short[] getEncIndex1() { ! return JIS_X_0208_Encoder.getIndex1(); ! } ! ! protected String[] getEncIndex2() { ! return JIS_X_0208_Encoder.getIndex2(); ! } ! ! protected DoubleByteEncoder get0212Encoder() { ! return null; } protected boolean doSBKANA() { return true; } ! private static class Decoder extends DoubleByteDecoder implements DelegatableDecoder { private int currentState; private int previousState; ! private DoubleByteDecoder decoder0212; protected Decoder(Charset cs, ! short[] index1, ! String[] index2, ! DoubleByteDecoder decoder0212) { ! super(cs, ! index1, ! index2, ! 0x21, ! 0x7e); ! this.decoder0212 = decoder0212; currentState = ASCII; previousState = ASCII; } - protected char convSingleByte(int b) { - return REPLACE_CHAR; - } - public void implReset() { currentState = ASCII; previousState = ASCII; } private CoderResult decodeArrayLoop(ByteBuffer src, CharBuffer dst) { int inputSize = 0; int b1 = 0, b2 = 0, b3 = 0, b4 = 0; ! char c = REPLACE_CHAR; byte[] sa = src.array(); int sp = src.arrayOffset() + src.position(); int sl = src.arrayOffset() + src.limit(); assert (sp <= sl); sp = (sp <= sl ? sp : sl); --- 153,210 ---- || (cs instanceof JIS_X_0208) || (cs instanceof ISO2022_JP)); } public CharsetDecoder newDecoder() { ! return new Decoder(this); } public CharsetEncoder newEncoder() { ! return new Encoder(this); } protected boolean doSBKANA() { return true; } ! static class Decoder extends CharsetDecoder implements DelegatableDecoder { + final static DoubleByte.Decoder DEC0208 = + (DoubleByte.Decoder)new JIS_X_0208().newDecoder(); + private int currentState; private int previousState; ! ! private DoubleByte.Decoder dec0208; ! private DoubleByte.Decoder dec0212; ! ! private Decoder(Charset cs) { ! this(cs, DEC0208, null); ! } protected Decoder(Charset cs, ! DoubleByte.Decoder dec0208, ! DoubleByte.Decoder dec0212) { ! super(cs, 0.5f, 1.0f); ! this.dec0208 = dec0208; ! this.dec0212 = dec0212; currentState = ASCII; previousState = ASCII; } public void implReset() { currentState = ASCII; previousState = ASCII; } private CoderResult decodeArrayLoop(ByteBuffer src, CharBuffer dst) { int inputSize = 0; int b1 = 0, b2 = 0, b3 = 0, b4 = 0; ! char c = UNMAPPABLE_DECODING; byte[] sa = src.array(); int sp = src.arrayOffset() + src.position(); int sl = src.arrayOffset() + src.limit(); assert (sp <= sl); sp = (sp <= sl ? sp : sl);
*** 271,281 **** b3 = sa[sp + inputSize++] & 0xff; if (b3 == '@'){ currentState = JISX0208_1978; } else if (b3 == 'B'){ currentState = JISX0208_1983; ! } else if (b3 == '(' && decoder0212 != null) { if (sp + inputSize + 1 > sl) return CoderResult.UNDERFLOW; b4 = sa[sp + inputSize++] & 0xff; if (b4 == 'D') { currentState = JISX0212_1990; --- 242,252 ---- b3 = sa[sp + inputSize++] & 0xff; if (b3 == '@'){ currentState = JISX0208_1978; } else if (b3 == 'B'){ currentState = JISX0208_1983; ! } else if (b3 == '(' && dec0212 != null) { if (sp + inputSize + 1 > sl) return CoderResult.UNDERFLOW; b4 = sa[sp + inputSize++] & 0xff; if (b4 == 'D') { currentState = JISX0212_1990;
*** 320,340 **** case JISX0208_1978: case JISX0208_1983: if (sp + inputSize + 1 > sl) return CoderResult.UNDERFLOW; b2 = sa[sp + inputSize++] & 0xff; ! c = decodeDouble(b1,b2); ! if (c == REPLACE_CHAR) return CoderResult.unmappableForLength(inputSize); da[dp++] = c; break; case JISX0212_1990: if (sp + inputSize + 1 > sl) return CoderResult.UNDERFLOW; b2 = sa[sp + inputSize++] & 0xff; ! c = decoder0212.decodeDouble(b1,b2); ! if (c == REPLACE_CHAR) return CoderResult.unmappableForLength(inputSize); da[dp++] = c; break; case JISX0201_1976_KANA: case SHIFTOUT: --- 291,311 ---- case JISX0208_1978: case JISX0208_1983: if (sp + inputSize + 1 > sl) return CoderResult.UNDERFLOW; b2 = sa[sp + inputSize++] & 0xff; ! c = dec0208.decodeDouble(b1,b2); ! if (c == UNMAPPABLE_DECODING) return CoderResult.unmappableForLength(inputSize); da[dp++] = c; break; case JISX0212_1990: if (sp + inputSize + 1 > sl) return CoderResult.UNDERFLOW; b2 = sa[sp + inputSize++] & 0xff; ! c = dec0212.decodeDouble(b1,b2); ! if (c == UNMAPPABLE_DECODING) return CoderResult.unmappableForLength(inputSize); da[dp++] = c; break; case JISX0201_1976_KANA: case SHIFTOUT:
*** 356,366 **** private CoderResult decodeBufferLoop(ByteBuffer src, CharBuffer dst) { int mark = src.position(); int b1 = 0, b2 = 0, b3 = 0, b4=0; ! char c = REPLACE_CHAR; int inputSize = 0; try { while (src.hasRemaining()) { b1 = src.get() & 0xff; inputSize = 1; --- 327,337 ---- private CoderResult decodeBufferLoop(ByteBuffer src, CharBuffer dst) { int mark = src.position(); int b1 = 0, b2 = 0, b3 = 0, b4=0; ! char c = UNMAPPABLE_DECODING; int inputSize = 0; try { while (src.hasRemaining()) { b1 = src.get() & 0xff; inputSize = 1;
*** 389,399 **** inputSize++; if (b3 == '@'){ currentState = JISX0208_1978; } else if (b3 == 'B'){ currentState = JISX0208_1983; ! } else if (b3 == '(' && decoder0212 != null) { if (!src.hasRemaining()) return CoderResult.UNDERFLOW; b4 = src.get() & 0xff; inputSize++; if (b4 == 'D') { --- 360,370 ---- inputSize++; if (b3 == '@'){ currentState = JISX0208_1978; } else if (b3 == 'B'){ currentState = JISX0208_1983; ! } else if (b3 == '(' && dec0212 != null) { if (!src.hasRemaining()) return CoderResult.UNDERFLOW; b4 = src.get() & 0xff; inputSize++; if (b4 == 'D') {
*** 440,461 **** case JISX0208_1983: if (!src.hasRemaining()) return CoderResult.UNDERFLOW; b2 = src.get() & 0xff; inputSize++; ! c = decodeDouble(b1,b2); ! if (c == REPLACE_CHAR) return CoderResult.unmappableForLength(inputSize); dst.put(c); break; case JISX0212_1990: if (!src.hasRemaining()) return CoderResult.UNDERFLOW; b2 = src.get() & 0xff; inputSize++; ! c = decoder0212.decodeDouble(b1,b2); ! if (c == REPLACE_CHAR) return CoderResult.unmappableForLength(inputSize); dst.put(c); break; case JISX0201_1976_KANA: case SHIFTOUT: --- 411,432 ---- case JISX0208_1983: if (!src.hasRemaining()) return CoderResult.UNDERFLOW; b2 = src.get() & 0xff; inputSize++; ! c = dec0208.decodeDouble(b1,b2); ! if (c == UNMAPPABLE_DECODING) return CoderResult.unmappableForLength(inputSize); dst.put(c); break; case JISX0212_1990: if (!src.hasRemaining()) return CoderResult.UNDERFLOW; b2 = src.get() & 0xff; inputSize++; ! c = dec0212.decodeDouble(b1,b2); ! if (c == UNMAPPABLE_DECODING) return CoderResult.unmappableForLength(inputSize); dst.put(c); break; case JISX0201_1976_KANA: case SHIFTOUT:
*** 484,512 **** public CoderResult implFlush(CharBuffer out) { return super.implFlush(out); } } ! private static class Encoder extends DoubleByteEncoder { private static byte[] repl = { (byte)0x21, (byte)0x29 }; private int currentMode = ASCII; private int replaceMode = JISX0208_1983; ! private DoubleByteEncoder encoder0212 = null; private boolean doSBKANA; ! private Encoder(Charset cs, ! short[] index1, ! String[] index2, ! DoubleByteEncoder encoder0212, boolean doSBKANA) { ! super(cs, ! index1, ! index2, ! repl, ! 4.0f, ! (encoder0212 != null)? 9.0f : 8.0f); ! this.encoder0212 = encoder0212; this.doSBKANA = doSBKANA; } protected int encodeSingle(char inputChar) { return -1; --- 455,487 ---- public CoderResult implFlush(CharBuffer out) { return super.implFlush(out); } } ! static class Encoder extends CharsetEncoder { ! ! final static DoubleByte.Encoder ENC0208 = ! (DoubleByte.Encoder)new JIS_X_0208().newEncoder(); ! private static byte[] repl = { (byte)0x21, (byte)0x29 }; private int currentMode = ASCII; private int replaceMode = JISX0208_1983; ! private DoubleByte.Encoder enc0208; ! private DoubleByte.Encoder enc0212; private boolean doSBKANA; ! private Encoder(Charset cs) { ! this(cs, ENC0208, null, true); ! } ! ! Encoder(Charset cs, ! DoubleByte.Encoder enc0208, ! DoubleByte.Encoder enc0212, boolean doSBKANA) { ! super(cs, 4.0f, (enc0212 != null)? 9.0f : 8.0f, repl); ! this.enc0208 = enc0208; ! this.enc0212 = enc0212; this.doSBKANA = doSBKANA; } protected int encodeSingle(char inputChar) { return -1;
*** 543,554 **** public boolean canEncode(char c) { return ((c <= '\u007F') || (c >= 0xFF61 && c <= 0xFF9F) || (c == '\u00A5') || (c == '\u203E') || ! super.canEncode(c) || ! (encoder0212!=null && encoder0212.canEncode(c))); } private final Surrogate.Parser sgp = new Surrogate.Parser(); private CoderResult encodeArrayLoop(CharBuffer src, --- 518,529 ---- public boolean canEncode(char c) { return ((c <= '\u007F') || (c >= 0xFF61 && c <= 0xFF9F) || (c == '\u00A5') || (c == '\u203E') || ! enc0208.canEncode(c) || ! (enc0212!=null && enc0212.canEncode(c))); } private final Surrogate.Parser sgp = new Surrogate.Parser(); private CoderResult encodeArrayLoop(CharBuffer src,
*** 605,616 **** } if (dl - dp < 1) return CoderResult.OVERFLOW; da[dp++] = (c == '\u00A5')?(byte)0x5C:(byte)0x7e; } else { ! int index = encodeDouble(c); ! if (index != 0) { if (currentMode != JISX0208_1983) { if (dl - dp < 3) return CoderResult.OVERFLOW; da[dp++] = (byte)0x1b; da[dp++] = (byte)0x24; --- 580,591 ---- } if (dl - dp < 1) return CoderResult.OVERFLOW; da[dp++] = (c == '\u00A5')?(byte)0x5C:(byte)0x7e; } else { ! int index = enc0208.encodeChar(c); ! if (index != UNMAPPABLE_ENCODING) { if (currentMode != JISX0208_1983) { if (dl - dp < 3) return CoderResult.OVERFLOW; da[dp++] = (byte)0x1b; da[dp++] = (byte)0x24;
*** 619,630 **** } if (dl - dp < 2) return CoderResult.OVERFLOW; da[dp++] = (byte)(index >> 8); da[dp++] = (byte)(index & 0xff); ! } else if (encoder0212 != null && ! (index = encoder0212.encodeDouble(c)) != 0) { if (currentMode != JISX0212_1990) { if (dl - dp < 4) return CoderResult.OVERFLOW; da[dp++] = (byte)0x1b; da[dp++] = (byte)0x24; --- 594,605 ---- } if (dl - dp < 2) return CoderResult.OVERFLOW; da[dp++] = (byte)(index >> 8); da[dp++] = (byte)(index & 0xff); ! } else if (enc0212 != null && ! (index = enc0212.encodeChar(c)) != UNMAPPABLE_ENCODING) { if (currentMode != JISX0212_1990) { if (dl - dp < 4) return CoderResult.OVERFLOW; da[dp++] = (byte)0x1b; da[dp++] = (byte)0x24;
*** 713,724 **** } if (dst.remaining() < 1) return CoderResult.OVERFLOW; dst.put((c == '\u00A5')?(byte)0x5C:(byte)0x7e); } else { ! int index = encodeDouble(c); ! if (index != 0) { if (currentMode != JISX0208_1983) { if (dst.remaining() < 3) return CoderResult.OVERFLOW; dst.put((byte)0x1b); dst.put((byte)0x24); --- 688,699 ---- } if (dst.remaining() < 1) return CoderResult.OVERFLOW; dst.put((c == '\u00A5')?(byte)0x5C:(byte)0x7e); } else { ! int index = enc0208.encodeChar(c); ! if (index != UNMAPPABLE_ENCODING) { if (currentMode != JISX0208_1983) { if (dst.remaining() < 3) return CoderResult.OVERFLOW; dst.put((byte)0x1b); dst.put((byte)0x24);
*** 727,738 **** } if (dst.remaining() < 2) return CoderResult.OVERFLOW; dst.put((byte)(index >> 8)); dst.put((byte)(index & 0xff)); ! } else if (encoder0212 != null && ! (index = encoder0212.encodeDouble(c)) != 0) { if (currentMode != JISX0212_1990) { if (dst.remaining() < 4) return CoderResult.OVERFLOW; dst.put((byte)0x1b); dst.put((byte)0x24); --- 702,713 ---- } if (dst.remaining() < 2) return CoderResult.OVERFLOW; dst.put((byte)(index >> 8)); dst.put((byte)(index & 0xff)); ! } else if (enc0212 != null && ! (index = enc0212.encodeChar(c)) != UNMAPPABLE_ENCODING) { if (currentMode != JISX0212_1990) { if (dst.remaining() < 4) return CoderResult.OVERFLOW; dst.put((byte)0x1b); dst.put((byte)0x24);