src/java.base/share/classes/sun/nio/cs/SingleByte.java

Print this page

        

*** 47,60 **** --- 47,68 ---- } public static final class Decoder extends CharsetDecoder implements ArrayDecoder { private final char[] b2c; + private final boolean isASCIICompatible; public Decoder(Charset cs, char[] b2c) { super(cs, 1.0f, 1.0f); this.b2c = b2c; + this.isASCIICompatible = false; + } + + public Decoder(Charset cs, char[] b2c, boolean isASCIICompatible) { + super(cs, 1.0f, 1.0f); + this.b2c = b2c; + this.isASCIICompatible = isASCIICompatible; } private CoderResult decodeArrayLoop(ByteBuffer src, CharBuffer dst) { byte[] sa = src.array(); int sp = src.arrayOffset() + src.position();
*** 114,123 **** --- 122,132 ---- private char repl = '\uFFFD'; protected void implReplaceWith(String newReplacement) { repl = newReplacement.charAt(0); } + @Override public int decode(byte[] src, int sp, int len, char[] dst) { if (len > dst.length) len = dst.length; int dp = 0; while (dp < len) {
*** 127,148 **** } dp++; } return dp; } } public static final class Encoder extends CharsetEncoder implements ArrayEncoder { private Surrogate.Parser sgp; private final char[] c2b; private final char[] c2bIndex; ! public Encoder(Charset cs, char[] c2b, char[] c2bIndex) { super(cs, 1.0f, 1.0f); this.c2b = c2b; this.c2bIndex = c2bIndex; } public boolean canEncode(char c) { return encode(c) != UNMAPPABLE_ENCODING; } --- 136,164 ---- } dp++; } return dp; } + + @Override + public boolean isASCIICompatible() { + return isASCIICompatible; + } } public static final class Encoder extends CharsetEncoder implements ArrayEncoder { private Surrogate.Parser sgp; private final char[] c2b; private final char[] c2bIndex; + private final boolean isASCIICompatible; ! public Encoder(Charset cs, char[] c2b, char[] c2bIndex, boolean isASCIICompatible) { super(cs, 1.0f, 1.0f); this.c2b = c2b; this.c2bIndex = c2bIndex; + this.isASCIICompatible = isASCIICompatible; } public boolean canEncode(char c) { return encode(c) != UNMAPPABLE_ENCODING; }
*** 250,259 **** --- 266,320 ---- } dst[dp++] = repl; } return dp; } + + @Override + public int encodeFromLatin1(byte[] src, int sp, int len, byte[] dst) { + int dp = 0; + int sl = sp + Math.min(len, dst.length); + while (sp < sl) { + char c = (char)(src[sp++] & 0xff); + int b = encode(c); + if (b == UNMAPPABLE_ENCODING) { + dst[dp++] = repl; + } else { + dst[dp++] = (byte)b; + } + } + return dp; + } + + @Override + public int encodeFromUTF16(byte[] src, int sp, int len, byte[] dst) { + int dp = 0; + int sl = sp + Math.min(len, dst.length); + while (sp < sl) { + char c = StringUTF16.getChar(src, sp++); + int b = encode(c); + if (b != UNMAPPABLE_ENCODING) { + dst[dp++] = (byte)b; + continue; + } + if (Character.isHighSurrogate(c) && sp < sl && + Character.isLowSurrogate(StringUTF16.getChar(src, sp))) { + if (len > dst.length) { + sl++; + len--; + } + sp++; + } + dst[dp++] = repl; + } + return dp; + } + + @Override + public boolean isASCIICompatible() { + return isASCIICompatible; + } } // init the c2b and c2bIndex tables from b2c. public static void initC2B(char[] b2c, char[] c2bNR, char[] c2b, char[] c2bIndex) {