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

Print this page

        

*** 21,43 **** * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ - /* - */ - package sun.nio.cs.ext; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import java.nio.charset.CoderResult; import sun.nio.cs.HistoricallyNamedCharset; - import sun.nio.cs.Surrogate; public class EUC_JP_LINUX extends Charset implements HistoricallyNamedCharset { --- 21,39 ----
*** 61,370 **** public CharsetEncoder newEncoder() { return new Encoder(this); } ! private static class Decoder extends CharsetDecoder { ! JIS_X_0201.Decoder decoderJ0201; ! protected final char REPLACE_CHAR='\uFFFD'; ! ! private static final int start = 0xa1; ! private static final int end = 0xfe; ! private static final short[] jis0208Index1 = ! JIS_X_0208_Decoder.getIndex1(); ! private static final String[] jis0208Index2 = ! JIS_X_0208_Decoder.getIndex2(); ! private Decoder(Charset cs) { ! super(cs, 1.0f, 1.0f); ! decoderJ0201 = new JIS_X_0201.Decoder(cs); ! } ! ! protected char convSingleByte(int b) { ! if (b < 0 || b > 0x7f) ! return REPLACE_CHAR; ! return decoderJ0201.decode(b); ! } ! ! protected char decodeDouble(int byte1, int byte2) { ! if (byte1 == 0x8e) { ! return decoderJ0201.decode(byte2 - 256); ! } ! ! if (((byte1 < 0) || (byte1 > jis0208Index1.length)) ! || ((byte2 < start) || (byte2 > end))) ! return REPLACE_CHAR; ! ! int n = (jis0208Index1[byte1 - 0x80] & 0xf) * (end - start + 1) ! + (byte2 - start); ! return jis0208Index2[jis0208Index1[byte1 - 0x80] >> 4].charAt(n); ! } ! ! private CoderResult decodeArrayLoop(ByteBuffer src, ! CharBuffer dst) ! { ! byte[] sa = src.array(); ! int sp = src.arrayOffset() + src.position(); ! int sl = src.arrayOffset() + src.limit(); ! assert (sp <= sl); ! sp = (sp <= sl ? sp : sl); ! ! char[] da = dst.array(); ! int dp = dst.arrayOffset() + dst.position(); ! int dl = dst.arrayOffset() + dst.limit(); ! assert (dp <= dl); ! dp = (dp <= dl ? dp : dl); ! ! int b1 = 0, b2 = 0; ! int inputSize = 0; ! char outputChar = REPLACE_CHAR; // U+FFFD; ! ! try { ! while (sp < sl) { ! b1 = sa[sp] & 0xff; ! inputSize = 1; ! if ((b1 & 0x80) == 0) { ! outputChar = (char)b1; ! } ! else { // Multibyte char ! if ((b1 & 0xff) == 0x8f) { // JIS0212 ! if (sp + 3 > sl) ! return CoderResult.UNDERFLOW; ! inputSize = 3; ! return CoderResult.unmappableForLength(inputSize); // substitute ! } else { ! // JIS0208 ! if (sp + 2 > sl) ! return CoderResult.UNDERFLOW; ! b2 = sa[sp + 1] & 0xff; ! inputSize = 2; ! outputChar = decodeDouble(b1, b2); ! } ! } ! if (outputChar == REPLACE_CHAR) { // can't be decoded ! return CoderResult.unmappableForLength(inputSize); ! } ! if (dp + 1 > dl) ! return CoderResult.OVERFLOW; ! da[dp++] = outputChar; ! sp += inputSize; } - return CoderResult.UNDERFLOW; - } finally { - src.position(sp - src.arrayOffset()); - dst.position(dp - dst.arrayOffset()); } - } - - private CoderResult decodeBufferLoop(ByteBuffer src, - CharBuffer dst) - { - int mark = src.position(); - char outputChar = REPLACE_CHAR; // U+FFFD; - - try { - while (src.hasRemaining()) { - int b1 = src.get() & 0xff; - int inputSize = 1; - - if ((b1 & 0x80) == 0) { - outputChar = (char)b1; - } else { // Multibyte char - - if ((b1 & 0xff) == 0x8f) { // JIS0212 not supported - if (src.remaining() < 2) - return CoderResult.UNDERFLOW; - return CoderResult.unmappableForLength(3); - } else { - // JIS0208 - if (src.remaining() < 1) - return CoderResult.UNDERFLOW; - int b2 = src.get() & 0xff; - inputSize++; - outputChar = decodeDouble(b1, b2); - } - } - - if (outputChar == REPLACE_CHAR) - return CoderResult.unmappableForLength(inputSize); - if (dst.remaining() < 1) - return CoderResult.OVERFLOW; - dst.put(outputChar); - mark += inputSize; - } - return CoderResult.UNDERFLOW; - } finally { - src.position(mark); - } - } - - protected CoderResult decodeLoop(ByteBuffer src, - CharBuffer dst) - { - if (src.hasArray() && dst.hasArray()) - return decodeArrayLoop(src, dst); - else - return decodeBufferLoop(src, dst); - } - } - - - private static class Encoder extends CharsetEncoder { - - JIS_X_0201.Encoder encoderJ0201; - - private final Surrogate.Parser sgp = new Surrogate.Parser(); - private static final short[] jis0208Index1 = - JIS_X_0208_Encoder.getIndex1(); - private static final String[] jis0208Index2 = - JIS_X_0208_Encoder.getIndex2(); private Encoder(Charset cs) { ! super(cs, 2.0f, 2.0f); ! encoderJ0201 = new JIS_X_0201.Encoder(cs); ! } ! ! public boolean canEncode(char c) { ! byte[] encodedBytes = new byte[2]; ! ! if (encodeSingle(c, encodedBytes) == 0) { //doublebyte ! if (encodeDouble(c) == 0) ! return false; ! } ! return true; ! } ! ! protected int encodeSingle(char inputChar, byte[] outputByte) { ! byte b; ! ! if (inputChar == 0) { ! outputByte[0] = (byte)0; ! return 1; ! } ! ! if ((b = encoderJ0201.encode(inputChar)) == 0) ! return 0; ! ! if (b > 0 && b < 128) { ! outputByte[0] = b; ! return 1; ! } ! outputByte[0] = (byte)0x8e; ! outputByte[1] = b; ! return 2; ! } ! ! protected int encodeDouble(char ch) { ! int offset = jis0208Index1[((ch & 0xff00) >> 8 )] << 8; ! int r = jis0208Index2[offset >> 12].charAt((offset & 0xfff) + (ch & 0xff)); ! if (r != 0) ! return r + 0x8080; ! return r; ! } ! ! private CoderResult encodeArrayLoop(CharBuffer src, ! ByteBuffer dst) ! { ! char[] sa = src.array(); ! int sp = src.arrayOffset() + src.position(); ! int sl = src.arrayOffset() + src.limit(); ! assert (sp <= sl); ! sp = (sp <= sl ? sp : sl); ! byte[] da = dst.array(); ! int dp = dst.arrayOffset() + dst.position(); ! int dl = dst.arrayOffset() + dst.limit(); ! assert (dp <= dl); ! dp = (dp <= dl ? dp : dl); ! ! final byte[] outputByte = new byte[2]; ! ! try { ! while (sp < sl) { ! char c = sa[sp]; ! ! if (Character.isSurrogate(c)) { ! if (sgp.parse(c, sa, sp, sl) < 0) ! return sgp.error(); ! return sgp.unmappableResult(); ! } ! ! int outputSize = encodeSingle(c, outputByte); ! if (outputSize == 0) { // DoubleByte ! int ncode = encodeDouble(c); ! if (ncode != 0 && ((ncode & 0xFF0000) == 0)) { ! outputByte[0] = (byte) ((ncode & 0xff00) >> 8); ! outputByte[1] = (byte) (ncode & 0xff); ! outputSize = 2; ! } else { ! return CoderResult.unmappableForLength(1); ! } ! } ! ! if (dl - dp < outputSize) ! return CoderResult.OVERFLOW; ! // Put the byte in the output buffer ! for (int i = 0; i < outputSize; i++) { ! da[dp++] = outputByte[i]; ! } ! sp++; ! } ! return CoderResult.UNDERFLOW; ! } finally { ! src.position(sp - src.arrayOffset()); ! dst.position(dp - dst.arrayOffset()); ! } ! } ! ! private CoderResult encodeBufferLoop(CharBuffer src, ! ByteBuffer dst) ! { ! final byte[] outputByte = new byte[4]; ! int mark = src.position(); ! ! try { ! while (src.hasRemaining()) { ! char c = src.get(); ! if (Character.isSurrogate(c)) { ! if (sgp.parse(c, src) < 0) ! return sgp.error(); ! return sgp.unmappableResult(); ! } ! ! int outputSize = encodeSingle(c, outputByte); ! if (outputSize == 0) { // DoubleByte ! int ncode = encodeDouble(c); ! if (ncode != 0 ) { ! if ((ncode & 0xFF0000) == 0) { ! outputByte[0] = (byte) ((ncode & 0xff00) >> 8); ! outputByte[1] = (byte) (ncode & 0xff); ! outputSize = 2; ! } ! } else { ! return CoderResult.unmappableForLength(1); ! } ! } ! ! if (dst.remaining() < outputSize) ! return CoderResult.OVERFLOW; ! ! // Put the byte in the output buffer ! for (int i = 0; i < outputSize; i++) { ! dst.put(outputByte[i]); ! } ! mark++; ! } ! return CoderResult.UNDERFLOW; ! } finally { ! src.position(mark); ! } ! } ! ! protected CoderResult encodeLoop(CharBuffer src, ! ByteBuffer dst) ! { ! if (src.hasArray() && dst.hasArray()) ! return encodeArrayLoop(src, dst); ! else ! return encodeBufferLoop(src, dst); } } } --- 57,73 ---- public CharsetEncoder newEncoder() { return new Encoder(this); } ! private static class Decoder extends EUC_JP.Decoder { private Decoder(Charset cs) { ! super(cs, 1.0f, 1.0f, DEC0201, DEC0208, null); } } + private static class Encoder extends EUC_JP.Encoder { private Encoder(Charset cs) { ! super(cs, 2.0f, 2.0f, ENC0201, ENC0208, null); } } }