Merge missing JIS X 0208 code points.
[chise/xemacs-chise.git] / src / mule-charset.c
index 84a9de9..832911a 100644 (file)
@@ -20,10 +20,10 @@ along with XEmacs; see the file COPYING.  If not, write to
 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
-/* Synched up with: FSF 20.3.  Not in FSF. */
-
 /* Rewritten by Ben Wing <ben@xemacs.org>. */
 
+/* Rewritten by MORIOKA Tomohiko <tomo@m17n.org> for XEmacs UTF-2000. */
+
 #include <config.h>
 #ifdef UTF2000
 #include <limits.h>
@@ -56,6 +56,7 @@ Lisp_Object Vcharset_cyrillic_iso8859_5;
 Lisp_Object Vcharset_latin_iso8859_9;
 Lisp_Object Vcharset_japanese_jisx0208_1978;
 Lisp_Object Vcharset_chinese_gb2312;
+Lisp_Object Vcharset_chinese_gb12345;
 Lisp_Object Vcharset_japanese_jisx0208;
 Lisp_Object Vcharset_japanese_jisx0208_1990;
 Lisp_Object Vcharset_korean_ksc5601;
@@ -66,6 +67,7 @@ Lisp_Object Vcharset_chinese_cns11643_2;
 Lisp_Object Vcharset_ucs;
 Lisp_Object Vcharset_ucs_bmp;
 Lisp_Object Vcharset_ucs_cns;
+Lisp_Object Vcharset_ucs_big5;
 Lisp_Object Vcharset_latin_viscii;
 Lisp_Object Vcharset_latin_tcvn5712;
 Lisp_Object Vcharset_latin_viscii_lower;
@@ -1586,6 +1588,7 @@ Lisp_Object Qascii,
   Qlatin_iso8859_9,
   Qjapanese_jisx0208_1978,
   Qchinese_gb2312,
+  Qchinese_gb12345,
   Qjapanese_jisx0208,
   Qjapanese_jisx0208_1990,
   Qkorean_ksc5601,
@@ -1595,6 +1598,7 @@ Lisp_Object Qascii,
 #ifdef UTF2000
   Qucs_bmp,
   Qucs_cns,
+  Qucs_big5,
   Qlatin_viscii,
   Qlatin_tcvn5712,
   Qlatin_viscii_lower,
@@ -2170,20 +2174,27 @@ decode_builtin_char (Lisp_Object charset, int code_point)
     {
       int c1 = code_point >> 8;
       int c2 = code_point & 0xFF;
-      unsigned int I
-       = (c1 - 0xA1) * BIG5_SAME_ROW
-       + c2 - (c2 < 0x7F ? 0x40 : 0x62);
+      unsigned int I;
 
-      if (c1 < 0xC9)
-       {
-         charset = Vcharset_chinese_big5_1;
-       }
-      else
+      if ( (  (0xA1 <= c1) && (c1 <= 0xFE)  )
+          &&
+          ( ((0x40 <= c2) && (c2 <= 0x7E)) ||
+            ((0xA1 <= c2) && (c2 <= 0xFE)) ) )
        {
-         charset = Vcharset_chinese_big5_2;
-         I -= (BIG5_SAME_ROW) * (0xC9 - 0xA1);
+         I = (c1 - 0xA1) * BIG5_SAME_ROW
+           + c2 - (c2 < 0x7F ? 0x40 : 0x62);
+
+         if (c1 < 0xC9)
+           {
+             charset = Vcharset_chinese_big5_1;
+           }
+         else
+           {
+             charset = Vcharset_chinese_big5_2;
+             I -= (BIG5_SAME_ROW) * (0xC9 - 0xA1);
+           }
+         code_point = ((I / 94 + 33) << 8) | (I % 94 + 33);
        }
-      code_point = ((I / 94 + 33) << 8) | (I % 94 + 33);
     }
   if ((final = XCHARSET_FINAL (charset)) >= '0')
     {
@@ -3152,7 +3163,7 @@ Make a character from CHARSET and code-point CODE.
   if (XCHARSET_GRAPHIC (charset) == 1)
     c &= 0x7F7F7F7F;
   c = DECODE_CHAR (charset, c);
-  return c ? make_char (c) : Qnil;
+  return c >= 0 ? make_char (c) : Qnil;
 }
 
 DEFUN ("decode-builtin-char", Fdecode_builtin_char, 2, 2, 0, /*
@@ -3195,7 +3206,7 @@ Make a builtin character from CHARSET and code-point CODE.
     c &= 0x7F7F7F7F;
 #endif
   c = decode_builtin_char (charset, c);
-  return c ? make_char (c) : Fdecode_char (charset, code);
+  return c >= 0 ? make_char (c) : Fdecode_char (charset, code);
 }
 #endif
 
@@ -3502,6 +3513,7 @@ syms_of_mule_charset (void)
   defsymbol (&Qlatin_iso8859_9,                "latin-iso8859-9");
   defsymbol (&Qjapanese_jisx0208_1978, "japanese-jisx0208-1978");
   defsymbol (&Qchinese_gb2312,         "chinese-gb2312");
+  defsymbol (&Qchinese_gb12345,                "chinese-gb12345");
   defsymbol (&Qjapanese_jisx0208,      "japanese-jisx0208");
   defsymbol (&Qjapanese_jisx0208_1990,         "japanese-jisx0208-1990");
   defsymbol (&Qkorean_ksc5601,         "korean-ksc5601");
@@ -3530,6 +3542,7 @@ syms_of_mule_charset (void)
   defsymbol (&Qucs,                    "ucs");
   defsymbol (&Qucs_bmp,                        "ucs-bmp");
   defsymbol (&Qucs_cns,                        "ucs-cns");
+  defsymbol (&Qucs_big5,               "ucs-big5");
   defsymbol (&Qlatin_viscii,           "latin-viscii");
   defsymbol (&Qlatin_tcvn5712,         "latin-tcvn5712");
   defsymbol (&Qlatin_viscii_lower,     "latin-viscii-lower");
@@ -3686,6 +3699,15 @@ complex_vars_of_mule_charset (void)
                  build_string ("ISO/IEC 10646 for CNS 11643"),
                  build_string (""),
                  Qnil, 0, 0, 0, 0);
+  staticpro (&Vcharset_ucs_big5);
+  Vcharset_ucs_big5 =
+    make_charset (LEADING_BYTE_UCS_BIG5, Qucs_big5, 256, 3,
+                 1, 2, 0, CHARSET_LEFT_TO_RIGHT,
+                 build_string ("UCS for Big5"),
+                 build_string ("UCS for Big5"),
+                 build_string ("ISO/IEC 10646 for Big5"),
+                 build_string (""),
+                 Qnil, 0, 0, 0, 0);
 #else
 # define MIN_CHAR_THAI 0
 # define MAX_CHAR_THAI 0
@@ -3844,6 +3866,15 @@ complex_vars_of_mule_charset (void)
                  build_string ("GB2312 Chinese simplified"),
                  build_string ("gb2312"),
                  Qnil, 0, 0, 0, 33);
+  staticpro (&Vcharset_chinese_gb12345);
+  Vcharset_chinese_gb12345 =
+    make_charset (LEADING_BYTE_CHINESE_GB12345, Qchinese_gb12345, 94, 2,
+                 2, 0, 0, CHARSET_LEFT_TO_RIGHT,
+                 build_string ("G1"),
+                 build_string ("GB 12345)"),
+                 build_string ("GB 12345-1990"),
+                 build_string ("GB12345\\(\\.1990\\)?-0"),
+                 Qnil, 0, 0, 0, 33);
   staticpro (&Vcharset_japanese_jisx0208);
   Vcharset_japanese_jisx0208 =
     make_charset (LEADING_BYTE_JAPANESE_JISX0208, Qjapanese_jisx0208, 94, 2,
@@ -3915,7 +3946,7 @@ complex_vars_of_mule_charset (void)
                  build_string ("TCVN 5712"),
                  build_string ("TCVN 5712 (VSCII-2)"),
                  build_string ("Vietnamese TCVN 5712:1983 (VSCII-2)"),
-                 build_string ("tcvn5712-1"),
+                 build_string ("tcvn5712\\(\\.1993\\)?-1"),
                  Qnil, 0, 0, 0, 32);
   staticpro (&Vcharset_latin_viscii_lower);
   Vcharset_latin_viscii_lower =