src/share/classes/sun/nio/cs/ext/IBM834.java

Print this page

        

@@ -32,14 +32,14 @@
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetDecoder;
 import java.nio.charset.CharsetEncoder;
 import java.nio.charset.CoderResult;
+import static sun.nio.cs.CharsetMapping.*;
 
 // EBCDIC DBCS-only Korean
-public class IBM834
-    extends Charset
+public class IBM834 extends Charset
 {
     public IBM834() {
         super("x-IBM834", ExtendedCharsets.aliasesFor("x-IBM834"));
     }
 

@@ -46,66 +46,48 @@
     public boolean contains(Charset cs) {
         return (cs instanceof IBM834);
     }
 
     public CharsetDecoder newDecoder() {
-        return new Decoder(this);
+        IBM933.initb2c();
+        return new DoubleByte.Decoder_EBCDIC_DBCSONLY(
+            this, IBM933.b2c, 0x40, 0xfe);  // hardcode the b2min/max
     }
 
     public CharsetEncoder newEncoder() {
+        IBM933.initc2b();
         return new Encoder(this);
     }
 
-    protected static class Decoder extends DBCS_ONLY_IBM_EBCDIC_Decoder {
-        public Decoder(Charset cs) {
-            super(cs);
-            super.mask1 = 0xFFF0;
-            super.mask2 = 0x000F;
-            super.shift = 4;
-            super.index1 = IBM933.getDecoderIndex1();
-            super.index2 = IBM933.getDecoderIndex2();
-        }
-    }
-
-    protected static class Encoder extends IBM933.Encoder {
+    protected static class Encoder extends DoubleByte.Encoder_EBCDIC_DBCSONLY {
         public Encoder(Charset cs) {
-            super(cs, new byte[] {(byte)0xfe, (byte)0xfe}, false);
+            super(cs, new byte[] {(byte)0xfe, (byte)0xfe},
+                  IBM933.c2b, IBM933.c2bIndex);
         }
 
-        protected CoderResult implFlush(ByteBuffer out) {
-            implReset();
-            return CoderResult.UNDERFLOW;
-        }
-
-        protected byte[] encodeHangul(char ch) {
-            byte[] bytes = super.encodeHangul(ch);
-            if (bytes.length == 0) {
+        public int encodeChar(char ch) {
+            int bb = super.encodeChar(ch);
+            if (bb == UNMAPPABLE_ENCODING) {
                 // Cp834 has 6 additional non-roundtrip char->bytes
                 // mappings, see#6379808
                 if (ch == '\u00b7') {
-                    return new byte[] {(byte)0x41, (byte)0x43 };
+                    return 0x4143;
                 } else if (ch == '\u00ad') {
-                    return new byte[] {(byte)0x41, (byte)0x48 };
+                    return 0x4148;
                 } else if (ch == '\u2015') {
-                    return new byte[] {(byte)0x41, (byte)0x49 };
+                    return 0x4149;
                 } else if (ch == '\u223c') {
-                    return new byte[] {(byte)0x42, (byte)0xa1 };
+                    return 0x42a1;
                 } else if (ch == '\uff5e') {
-                    return new byte[] {(byte)0x49, (byte)0x54 };
+                    return 0x4954;
                 } else if (ch == '\u2299') {
-                    return new byte[] {(byte)0x49, (byte)0x6f };
+                    return 0x496f;
                 }
-            } else if (bytes[0] == 0) {
-                return EMPTYBA;
             }
-            return bytes;
+            return bb;
         }
 
-        public boolean canEncode(char ch) {
-            return encodeHangul(ch).length != 0;
-        }
-
         public boolean isLegalReplacement(byte[] repl) {
             if (repl.length == 2 &&
                 repl[0] == (byte)0xfe && repl[1] == (byte)0xfe)
                 return true;
             return super.isLegalReplacement(repl);