jdk/src/share/classes/sun/io/ByteToCharDBCS_EBCDIC.java
changeset 2921 d9d491a5a169
parent 2 90ce3da70b43
child 5506 202f599c92aa
--- a/jdk/src/share/classes/sun/io/ByteToCharDBCS_EBCDIC.java	Wed May 20 13:55:50 2009 -0700
+++ b/jdk/src/share/classes/sun/io/ByteToCharDBCS_EBCDIC.java	Thu May 21 23:32:46 2009 -0700
@@ -24,6 +24,9 @@
  */
 package sun.io;
 
+import sun.nio.cs.ext.DoubleByte;
+import static sun.nio.cs.CharsetMapping.*;
+
 public abstract class ByteToCharDBCS_EBCDIC extends ByteToCharConverter
 {
 
@@ -35,20 +38,23 @@
 
     private int  currentState;
     private boolean savedBytePresent;
-    private byte savedByte;
+    private int savedByte;
 
-    protected String singleByteToChar;
-    protected short index1[];
-    protected String index2;
-    protected int   mask1;
-    protected int   mask2;
-    protected int   shift;
+    private DoubleByte.Decoder dec;
 
-
-    public ByteToCharDBCS_EBCDIC() {
+    public ByteToCharDBCS_EBCDIC(DoubleByte.Decoder dec) {
        super();
        currentState = SBCS;
        savedBytePresent = false;
+       this.dec = dec;
+    }
+
+    char decodeSingle(int b) {
+        return dec.decodeSingle(b);
+    }
+
+    char decodeDouble(int b1, int b2) {
+        return dec.decodeDouble(b1, b2);
     }
 
     public int flush(char [] output, int outStart, int outEnd)
@@ -74,17 +80,16 @@
                ConversionBufferFullException
     {
        int  inputSize;
-       char outputChar = '\uFFFD';
+       char outputChar = UNMAPPABLE_DECODING;
 
        charOff = outOff;
        byteOff = inOff;
 
        while(byteOff < inEnd) {
           int byte1, byte2;
-          int v;
 
           if (!savedBytePresent) {
-            byte1 = input[byteOff];
+            byte1 = input[byteOff] & 0xff;
             inputSize = 1;
           } else {
             byte1 = savedByte;
@@ -122,11 +127,8 @@
 
                 // Process the real data characters
 
-                if (byte1 < 0)
-                   byte1 += 256;
-
                 if (currentState == SBCS) {
-                   outputChar = singleByteToChar.charAt(byte1);
+                   outputChar = decodeSingle(byte1);
                 } else {
 
                    // for a DBCS character - architecture dictates the
@@ -141,16 +143,13 @@
                       // We have been split in the middle if a character
                       // save the first byte for next time around
 
-                      savedByte = (byte)byte1;
+                      savedByte = byte1;
                       savedBytePresent = true;
                       byteOff += inputSize;
                       break;
                    }
 
-                   byte2 = input[byteOff+inputSize];
-                   if (byte2 < 0)
-                      byte2 += 256;
-
+                   byte2 = input[byteOff+inputSize] & 0xff;
                    inputSize++;
 
                    // validate the pair of bytes meet the architecture
@@ -161,12 +160,10 @@
                       throw new MalformedInputException();
                    }
 
-                   // Lookup in the two level index
-                   v = byte1 * 256 + byte2;
-                   outputChar = index2.charAt(index1[((v & mask1) >> shift)] + (v & mask2));
+                   outputChar = decodeDouble(byte1, byte2);
                 }
 
-                if (outputChar == '\uFFFD') {
+                if (outputChar == UNMAPPABLE_DECODING) {
                    if (subMode)
                       outputChar = subChars[0];
                    else {