--- old/src/jdk.charsets/share/classes/sun/nio/cs/ext/SimpleEUCEncoder.java 2018-10-26 11:50:58 +0000 +++ /dev/null 2018-10-26 11:50:58 +0000 @@ -1,276 +0,0 @@ -/* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * 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.CharsetEncoder; -import java.nio.charset.CoderResult; -import sun.nio.cs.Surrogate; - - -public abstract class SimpleEUCEncoder - extends CharsetEncoder -{ - - protected short index1[]; - protected String index2; - protected String index2a; - protected String index2b; - protected String index2c; - protected int mask1; - protected int mask2; - protected int shift; - - private byte[] outputByte = new byte[4]; - private final Surrogate.Parser sgp = new Surrogate.Parser(); - - protected SimpleEUCEncoder(Charset cs) - { - super(cs, 3.0f, 4.0f); - } - - /** - * Returns true if the given character can be converted to the - * target character encoding. - */ - - public boolean canEncode(char ch) { - int index; - String theChars; - - index = index1[((ch & mask1) >> shift)] + (ch & mask2); - - if (index < 7500) - theChars = index2; - else - if (index < 15000) { - index = index - 7500; - theChars = index2a; - } - else - if (index < 22500){ - index = index - 15000; - theChars = index2b; - } - else { - index = index - 22500; - theChars = index2c; - } - - if (theChars.charAt(2*index) != '\u0000' || - theChars.charAt(2*index + 1) != '\u0000') - return (true); - - // only return true if input char was unicode null - all others are - // undefined - return( ch == '\u0000'); - - } - 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); - - int index; - int spaceNeeded; - int i; - - try { - while (sp < sl) { - boolean allZeroes = true; - char inputChar = sa[sp]; - if (Character.isSurrogate(inputChar)) { - if (sgp.parse(inputChar, sa, sp, sl) < 0) - return sgp.error(); - return sgp.unmappableResult(); - } - - if (inputChar >= '\uFFFE') - return CoderResult.unmappableForLength(1); - - String theChars; - char aChar; - - // We have a valid character, get the bytes for it - index = index1[((inputChar & mask1) >> shift)] + (inputChar & mask2); - - if (index < 7500) - theChars = index2; - else if (index < 15000) { - index = index - 7500; - theChars = index2a; - } else if (index < 22500){ - index = index - 15000; - theChars = index2b; - } - else { - index = index - 22500; - theChars = index2c; - } - - aChar = theChars.charAt(2*index); - outputByte[0] = (byte)((aChar & 0xff00)>>8); - outputByte[1] = (byte)(aChar & 0x00ff); - aChar = theChars.charAt(2*index + 1); - outputByte[2] = (byte)((aChar & 0xff00)>>8); - outputByte[3] = (byte)(aChar & 0x00ff); - - for (i = 0; i < outputByte.length; i++) { - if (outputByte[i] != 0x00) { - allZeroes = false; - break; - } - } - - if (allZeroes && inputChar != '\u0000') { - return CoderResult.unmappableForLength(1); - } - - int oindex = 0; - - for (spaceNeeded = outputByte.length; - spaceNeeded > 1; spaceNeeded--){ - if (outputByte[oindex++] != 0x00 ) - break; - } - - if (dp + spaceNeeded > dl) - return CoderResult.OVERFLOW; - - for (i = outputByte.length - spaceNeeded; - i < outputByte.length; 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) { - int index; - int spaceNeeded; - int i; - int mark = src.position(); - try { - while (src.hasRemaining()) { - char inputChar = src.get(); - boolean allZeroes = true; - if (Character.isSurrogate(inputChar)) { - if (sgp.parse(inputChar, src) < 0) - return sgp.error(); - return sgp.unmappableResult(); - } - - if (inputChar >= '\uFFFE') - return CoderResult.unmappableForLength(1); - - String theChars; - char aChar; - - // We have a valid character, get the bytes for it - index = index1[((inputChar & mask1) >> shift)] + (inputChar & mask2); - - if (index < 7500) - theChars = index2; - else if (index < 15000) { - index = index - 7500; - theChars = index2a; - } else if (index < 22500){ - index = index - 15000; - theChars = index2b; - } - else { - index = index - 22500; - theChars = index2c; - } - - aChar = theChars.charAt(2*index); - outputByte[0] = (byte)((aChar & 0xff00)>>8); - outputByte[1] = (byte)(aChar & 0x00ff); - aChar = theChars.charAt(2*index + 1); - outputByte[2] = (byte)((aChar & 0xff00)>>8); - outputByte[3] = (byte)(aChar & 0x00ff); - - for (i = 0; i < outputByte.length; i++) { - if (outputByte[i] != 0x00) { - allZeroes = false; - break; - } - } - if (allZeroes && inputChar != '\u0000') { - return CoderResult.unmappableForLength(1); - } - - int oindex = 0; - - for (spaceNeeded = outputByte.length; - spaceNeeded > 1; spaceNeeded--){ - if (outputByte[oindex++] != 0x00 ) - break; - } - if (dst.remaining() < spaceNeeded) - return CoderResult.OVERFLOW; - - for (i = outputByte.length - spaceNeeded; - i < outputByte.length; i++) { - dst.put(outputByte[i]); - } - mark++; - } - return CoderResult.UNDERFLOW; - } finally { - src.position(mark); - } - } - - protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst) { - if (true && src.hasArray() && dst.hasArray()) - return encodeArrayLoop(src, dst); - else - return encodeBufferLoop(src, dst); - } - - public byte encode(char inputChar) { - return (byte)index2.charAt(index1[(inputChar & mask1) >> shift] + - (inputChar & mask2)); - } -} --- /dev/null 2018-10-26 11:50:58 +0000 +++ new/src/jdk.charsets/share/classes/sun/nio/cs/ext/SimpleEUCEncoder.java.template 2018-10-26 11:50:57 +0000 @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * 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 $PACKAGE$; + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CoderResult; +import sun.nio.cs.Surrogate; + + +public abstract class SimpleEUCEncoder + extends CharsetEncoder +{ + + protected short index1[]; + protected String index2; + protected String index2a; + protected String index2b; + protected String index2c; + protected int mask1; + protected int mask2; + protected int shift; + + private byte[] outputByte = new byte[4]; + private final Surrogate.Parser sgp = new Surrogate.Parser(); + + protected SimpleEUCEncoder(Charset cs) + { + super(cs, 3.0f, 4.0f); + } + + /** + * Returns true if the given character can be converted to the + * target character encoding. + */ + + public boolean canEncode(char ch) { + int index; + String theChars; + + index = index1[((ch & mask1) >> shift)] + (ch & mask2); + + if (index < 7500) + theChars = index2; + else + if (index < 15000) { + index = index - 7500; + theChars = index2a; + } + else + if (index < 22500){ + index = index - 15000; + theChars = index2b; + } + else { + index = index - 22500; + theChars = index2c; + } + + if (theChars.charAt(2*index) != '\u0000' || + theChars.charAt(2*index + 1) != '\u0000') + return (true); + + // only return true if input char was unicode null - all others are + // undefined + return( ch == '\u0000'); + + } + 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); + + int index; + int spaceNeeded; + int i; + + try { + while (sp < sl) { + boolean allZeroes = true; + char inputChar = sa[sp]; + if (Character.isSurrogate(inputChar)) { + if (sgp.parse(inputChar, sa, sp, sl) < 0) + return sgp.error(); + return sgp.unmappableResult(); + } + + if (inputChar >= '\uFFFE') + return CoderResult.unmappableForLength(1); + + String theChars; + char aChar; + + // We have a valid character, get the bytes for it + index = index1[((inputChar & mask1) >> shift)] + (inputChar & mask2); + + if (index < 7500) + theChars = index2; + else if (index < 15000) { + index = index - 7500; + theChars = index2a; + } else if (index < 22500){ + index = index - 15000; + theChars = index2b; + } + else { + index = index - 22500; + theChars = index2c; + } + + aChar = theChars.charAt(2*index); + outputByte[0] = (byte)((aChar & 0xff00)>>8); + outputByte[1] = (byte)(aChar & 0x00ff); + aChar = theChars.charAt(2*index + 1); + outputByte[2] = (byte)((aChar & 0xff00)>>8); + outputByte[3] = (byte)(aChar & 0x00ff); + + for (i = 0; i < outputByte.length; i++) { + if (outputByte[i] != 0x00) { + allZeroes = false; + break; + } + } + + if (allZeroes && inputChar != '\u0000') { + return CoderResult.unmappableForLength(1); + } + + int oindex = 0; + + for (spaceNeeded = outputByte.length; + spaceNeeded > 1; spaceNeeded--){ + if (outputByte[oindex++] != 0x00 ) + break; + } + + if (dp + spaceNeeded > dl) + return CoderResult.OVERFLOW; + + for (i = outputByte.length - spaceNeeded; + i < outputByte.length; 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) { + int index; + int spaceNeeded; + int i; + int mark = src.position(); + try { + while (src.hasRemaining()) { + char inputChar = src.get(); + boolean allZeroes = true; + if (Character.isSurrogate(inputChar)) { + if (sgp.parse(inputChar, src) < 0) + return sgp.error(); + return sgp.unmappableResult(); + } + + if (inputChar >= '\uFFFE') + return CoderResult.unmappableForLength(1); + + String theChars; + char aChar; + + // We have a valid character, get the bytes for it + index = index1[((inputChar & mask1) >> shift)] + (inputChar & mask2); + + if (index < 7500) + theChars = index2; + else if (index < 15000) { + index = index - 7500; + theChars = index2a; + } else if (index < 22500){ + index = index - 15000; + theChars = index2b; + } + else { + index = index - 22500; + theChars = index2c; + } + + aChar = theChars.charAt(2*index); + outputByte[0] = (byte)((aChar & 0xff00)>>8); + outputByte[1] = (byte)(aChar & 0x00ff); + aChar = theChars.charAt(2*index + 1); + outputByte[2] = (byte)((aChar & 0xff00)>>8); + outputByte[3] = (byte)(aChar & 0x00ff); + + for (i = 0; i < outputByte.length; i++) { + if (outputByte[i] != 0x00) { + allZeroes = false; + break; + } + } + if (allZeroes && inputChar != '\u0000') { + return CoderResult.unmappableForLength(1); + } + + int oindex = 0; + + for (spaceNeeded = outputByte.length; + spaceNeeded > 1; spaceNeeded--){ + if (outputByte[oindex++] != 0x00 ) + break; + } + if (dst.remaining() < spaceNeeded) + return CoderResult.OVERFLOW; + + for (i = outputByte.length - spaceNeeded; + i < outputByte.length; i++) { + dst.put(outputByte[i]); + } + mark++; + } + return CoderResult.UNDERFLOW; + } finally { + src.position(mark); + } + } + + protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst) { + if (true && src.hasArray() && dst.hasArray()) + return encodeArrayLoop(src, dst); + else + return encodeBufferLoop(src, dst); + } + + public byte encode(char inputChar) { + return (byte)index2.charAt(index1[(inputChar & mask1) >> shift] + + (inputChar & mask2)); + } +}