jdk/src/share/classes/sun/nio/cs/ext/IBM942C.java
changeset 2921 d9d491a5a169
parent 2 90ce3da70b43
child 5506 202f599c92aa
--- a/jdk/src/share/classes/sun/nio/cs/ext/IBM942C.java	Wed May 20 13:55:50 2009 -0700
+++ b/jdk/src/share/classes/sun/nio/cs/ext/IBM942C.java	Thu May 21 23:32:46 2009 -0700
@@ -23,20 +23,17 @@
  * have any questions.
  */
 
-/*
- */
-
 package sun.nio.cs.ext;
 
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetDecoder;
 import java.nio.charset.CharsetEncoder;
-import java.nio.charset.CharacterCodingException;
+import java.util.Arrays;
 import sun.nio.cs.HistoricallyNamedCharset;
+import static sun.nio.cs.CharsetMapping.*;
 
 public class IBM942C extends Charset implements HistoricallyNamedCharset
 {
-
     public IBM942C() {
         super("x-IBM942C", ExtendedCharsets.aliasesFor("x-IBM942C"));
     }
@@ -51,51 +48,45 @@
     }
 
     public CharsetDecoder newDecoder() {
-        return new Decoder(this);
+        return new DoubleByte.Decoder(this,
+                                      IBM942.b2c,
+                                      b2cSB,
+                                      0x40,
+                                      0xfc);
     }
 
     public CharsetEncoder newEncoder() {
-        return new Encoder(this);
-    }
-
-    private static class Decoder extends IBM942.Decoder {
-        protected static final String singleByteToChar;
-
-        static {
-          String indexs = "";
-          for (char c = '\0'; c < '\u0080'; ++c) indexs += c;
-              singleByteToChar = indexs +
-                                 IBM942.Decoder.singleByteToChar.substring(indexs.length());
-        }
-
-        public Decoder(Charset cs) {
-            super(cs, singleByteToChar);
-        }
+        return new DoubleByte.Encoder(this, c2b, c2bIndex);
     }
 
-    private static class Encoder extends IBM942.Encoder {
+    final static char[] b2cSB;
+    final static char[] c2b;
+    final static char[] c2bIndex;
 
-   protected static final short index1[];
-   protected static final String index2a;
-   protected static final int shift = 5;
+    static {
+        IBM942.initb2c();
 
-        static {
-
-            String indexs = "";
-            for (char c = '\0'; c < '\u0080'; ++c) indexs += c;
-                index2a = IBM942.Encoder.index2a + indexs;
+        // the mappings need udpate are
+        //    u+001a  <-> 0x1a
+        //    u+001c  <-> 0x1c
+        //    u+005c  <-> 0x5c
+        //    u+007e  <-> 0x7e
+        //    u+007f  <-> 0x7f
 
-            int o = IBM942.Encoder.index2a.length() + 15000;
-            index1 = new short[IBM942.Encoder.index1.length];
-            System.arraycopy(IBM942.Encoder.index1, 0, index1, 0, IBM942.Encoder.index1.length);
+        b2cSB = Arrays.copyOf(IBM942.b2cSB, IBM942.b2cSB.length);
+        b2cSB[0x1a] = 0x1a;
+        b2cSB[0x1c] = 0x1c;
+        b2cSB[0x5c] = 0x5c;
+        b2cSB[0x7e] = 0x7e;
+        b2cSB[0x7f] = 0x7f;
 
-            for (int i = 0; i * (1<<shift) < 128; ++i) {
-                index1[i] = (short)(o + i * (1<<shift));
-            }
-        }
-
-        public Encoder(Charset cs) {
-            super(cs, index1, index2a);
-        }
+        IBM942.initc2b();
+        c2b = Arrays.copyOf(IBM942.c2b, IBM942.c2b.length);
+        c2bIndex = Arrays.copyOf(IBM942.c2bIndex, IBM942.c2bIndex.length);
+        c2b[c2bIndex[0] + 0x1a] = 0x1a;
+        c2b[c2bIndex[0] + 0x1c] = 0x1c;
+        c2b[c2bIndex[0] + 0x5c] = 0x5c;
+        c2b[c2bIndex[0] + 0x7e] = 0x7e;
+        c2b[c2bIndex[0] + 0x7f] = 0x7f;
     }
 }