src/java.desktop/unix/classes/sun/awt/motif/X11JIS0201.java

Print this page

        

@@ -26,19 +26,25 @@
 package sun.awt.motif;
 
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.*;
-import sun.nio.cs.*;
-import sun.nio.cs.ext.JIS_X_0201;
-import static sun.nio.cs.CharsetMapping.*;
+import static sun.awt.motif.DoubleByte.*;
 
 public class X11JIS0201 extends Charset {
 
-    private static Charset jis0201 = new JIS_X_0201();
-    private static SingleByte.Encoder enc =
-        (SingleByte.Encoder)jis0201.newEncoder();
+    private static Charset jis0201 = null;
+    private static CharsetEncoder enc = null;
+
+    static {
+        jis0201 = Charset.forName("JIS_X0201");
+        if (jis0201 != null) {
+           enc = jis0201.newEncoder();
+           enc.onMalformedInput(CodingErrorAction.REPORT);
+           enc.onUnmappableCharacter(CodingErrorAction.REPORT);
+        }
+    }
 
     public X11JIS0201 () {
         super("X11JIS0201", null);
     }
 

@@ -67,43 +73,63 @@
                 return true;
             }
             return false;
         }
 
-        private Surrogate.Parser sgp;
+        private SurrogateParser sgp;
         protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst) {
+
+            CoderResult cr = CoderResult.UNDERFLOW;
+            if (enc == null) { /* essentially bail */
+                return cr;
+            }
             char[] sa = src.array();
             int sp = src.arrayOffset() + src.position();
             int sl = src.arrayOffset() + src.limit();
 
             byte[] da = dst.array();
             int dp = dst.arrayOffset() + dst.position();
             int dl = dst.arrayOffset() + dst.limit();
-            CoderResult cr = CoderResult.UNDERFLOW;
             if ((dl - dp) < (sl - sp)) {
                 sl = sp + (dl - dp);
                 cr = CoderResult.OVERFLOW;
             }
             try {
+                char[] buf = new char[1];
                 while (sp < sl) {
+                    boolean mapped = false;
                     char c = sa[sp];
-                    int b = enc.encode(c);
-                    if (b == UNMAPPABLE_ENCODING) {
+                    ByteBuffer bb = null;
+                    /* CharsetEncoders may not be thread safe */
+                    synchronized (enc) {
+                        if (enc.canEncode(c)) {
+                            buf[0] = c;
+                            CharBuffer cb = CharBuffer.wrap(buf);
+                            try {
+                                bb = enc.encode(cb);
+                                mapped = true;
+                            } catch (CharacterCodingException cce) {
+                            }
+                        }
+                    }
+                    if (mapped && bb != null) {
+                        da[dp++] = bb.get();
+                        sp++;
+                    } else {
                         if (Character.isSurrogate(c)) {
                             if (sgp == null)
-                                sgp = new Surrogate.Parser();
+                                sgp = new SurrogateParser();
                             if (sgp.parse(c, sa, sp, sl) >= 0)
                                 return CoderResult.unmappableForLength(2);
                         }
                         return CoderResult.unmappableForLength(1);
                     }
-                    da[dp++] = (byte)b;
-                    sp++;
                 }
                 return cr;
             } finally {
                 src.position(sp - src.arrayOffset());
                 dst.position(dp - dst.arrayOffset());
             }
         }
     }
 }
+