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);