--- a/jdk/src/share/classes/sun/io/ByteToCharISO2022.java Mon Aug 29 14:27:21 2011 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,276 +0,0 @@
-/*
- * Copyright (c) 1997, 2010, 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.io;
-
-/**
- * An algorithmic conversion from ISO 2022 to Unicode
- *
- * @author Tom Zhou
- */
-public abstract class ByteToCharISO2022 extends ByteToCharConverter
-{
- // Value to be filled by subclass
- protected String SODesignator[];
- protected String SS2Designator[] = null;
- protected String SS3Designator[] = null;
-
- protected ByteToCharConverter SOConverter[];
- protected ByteToCharConverter SS2Converter[] = null;
- protected ByteToCharConverter SS3Converter[] = null;
-
- private static final byte ISO_ESC = 0x1b;
- private static final byte ISO_SI = 0x0f;
- private static final byte ISO_SO = 0x0e;
- private static final byte ISO_SS2_7 = 0x4e;
- private static final byte ISO_SS3_7 = 0x4f;
- private static final byte MSB = (byte)0x80;
- private static final char REPLACE_CHAR = '\uFFFD';
- private static final byte maximumDesignatorLength = 3;
-
- private static final byte SOFlag = 0;
- private static final byte SS2Flag = 1;
- private static final byte SS3Flag = 2;
- private static final byte G0 = 0;
- private static final byte G1 = 1;
-
- private ByteToCharConverter tmpConverter[];
-
- private int curSODes, curSS2Des, curSS3Des;
- private boolean shiftout;
-
- private byte remainByte[] = new byte[10];
- private int remainIndex = -1;
- private byte state, firstByte;
-
- public void reset()
- {
- int i = 0;
-
- shiftout = false;
- state = G0;
- firstByte = 0;
-
- curSODes = 0;
- curSS2Des = 0;
- curSS3Des = 0;
-
- charOff = byteOff = 0;
- remainIndex = -1;
-
- for(i = 0; i < remainByte.length; i++)
- remainByte[i] = 0;
- }
-
- public int flush(char[] output, int outStart, int outEnd)
- throws MalformedInputException
- {
- int i;
- if (state != G0) {
- badInputLength = 0;
- throw new MalformedInputException();
- }
- reset();
- return 0;
- }
-
- private byte[] savetyGetSrc(byte[] input, int inOff, int inEnd, int nbytes)
- {
- int i;
- byte tmp[];
-
- if(inOff <= (inEnd-nbytes+1))
- tmp = new byte[nbytes];
- else
- tmp = new byte[inEnd-inOff];
-
- for(i = 0; i < tmp.length; i++)
- tmp[i] = input[inOff+i];
- return tmp;
- }
-
- private char getUnicode(byte byte1, byte byte2, byte shiftFlag)
- {
- byte1 |= MSB;
- byte2 |= MSB;
-
- byte[] tmpByte = {byte1,byte2};
- char[] tmpChar = new char[1];
- int i = 0,
- tmpIndex = 0;
-
- switch(shiftFlag) {
- case SOFlag:
- tmpIndex = curSODes;
- tmpConverter = SOConverter;
- break;
- case SS2Flag:
- tmpIndex = curSS2Des;
- tmpConverter = SS2Converter;
- break;
- case SS3Flag:
- tmpIndex = curSS3Des;
- tmpConverter = SS3Converter;
- break;
- }
-
- for(i = 0; i < tmpConverter.length; i++) {
- if(tmpIndex == i) {
- try {
- tmpConverter[i].convert(tmpByte, 0, 2, tmpChar, 0, 1);
- } catch (Exception e) {}
- return tmpChar[0];
- }
- }
- return REPLACE_CHAR;
- }
-
- public final int convert(byte[] input, int inOff, int inEnd,
- char[] output, int outOff, int outEnd)
- throws ConversionBufferFullException,
- MalformedInputException
- {
- int i;
- int DesignatorLength = 0;
- charOff = outOff;
- byteOff = inOff;
-
- // Loop until we hit the end of the input
- while (byteOff < inEnd) {
- // If we don't have room for the output, throw an exception
- if (charOff >= outEnd)
- throw new ConversionBufferFullException();
- if(remainIndex < 0) {
- remainByte[0] = input[byteOff];
- remainIndex = 0;
- byteOff++;
- }
- switch (remainByte[0]) {
- case ISO_SO:
- shiftout = true;
- if(remainIndex > 0)
- System.arraycopy(remainByte, 1, remainByte, 0, remainIndex);
- remainIndex--;
- break;
- case ISO_SI:
- shiftout = false;
- if(remainIndex > 0)
- System.arraycopy(remainByte, 1, remainByte, 0, remainIndex);
- remainIndex--;
- break;
- case ISO_ESC:
- byte tmp[] = savetyGetSrc(input, byteOff, inEnd,
- (maximumDesignatorLength-remainIndex));
- System.arraycopy(tmp, 0, remainByte, remainIndex+1, tmp.length);
- remainIndex += tmp.length;
- byteOff += tmp.length;
- if(tmp.length<(maximumDesignatorLength-remainIndex))
- break;
- String tmpString = new String(remainByte, 1, remainIndex);
- for (i = 0; i < SODesignator.length; i++) {
- if(tmpString.indexOf(SODesignator[i]) == 0) {
- curSODes = i;
- DesignatorLength = SODesignator[i].length();
- break;
- }
- }
-
- if (DesignatorLength == 0 ) { // Designator not recognized
- badInputLength = tmp.length;
- throw new MalformedInputException();
- }
-
- if (i == SODesignator.length) {
- for (i = 0; i < SS2Designator.length; i++) {
- if(tmpString.indexOf(SS2Designator[i]) == 0) {
- curSS2Des = i;
- DesignatorLength = SS2Designator[i].length();
- break;
- }
- }
- if(i == SS2Designator.length) {
- for(i = 0; i < SS3Designator.length; i++) {
- if (tmpString.indexOf(SS3Designator[i]) == 0) {
- curSS3Des = i;
- DesignatorLength = SS3Designator[i].length();
- break;
- }
- }
- if (i == SS3Designator.length) {
- switch(remainByte[1]) {
- case ISO_SS2_7:
- output[charOff] = getUnicode(remainByte[2],
- remainByte[3],
- SS2Flag);
- charOff++;
- DesignatorLength = 3;
- break;
- case ISO_SS3_7:
- output[charOff] = getUnicode(remainByte[2],
- remainByte[3],
- SS3Flag);
- charOff++;
- DesignatorLength = 3;
- break;
- default:
- DesignatorLength = 0;
- }
- }
- }
- }
- if (remainIndex > DesignatorLength) {
- for(i = 0; i < remainIndex-DesignatorLength; i++)
- remainByte[i] = remainByte[DesignatorLength+1+i];
- remainIndex = i-1;
- } else {
- remainIndex = -1;
- }
- break;
- default:
- if (!shiftout) {
- output[charOff] = (char)remainByte[0];
- charOff++;
- } else {
- switch (state) {
- case G0:
- firstByte = remainByte[0];
- state = G1;
- break;
- case G1:
- output[charOff] = getUnicode(firstByte, remainByte[0],
- SOFlag);
- charOff++;
- state = G0;
- break;
- }
- }
- if (remainIndex > 0)
- System.arraycopy(remainByte, 1, remainByte, 0, remainIndex);
- remainIndex--;
- }
- }
- return charOff - outOff;
- }
-}