(Qutf_8_mcs): New variable.
[chise/xemacs-chise.git] / src / mule-charset.c
index 46d12c8..901925b 100644 (file)
@@ -906,12 +906,52 @@ get_unallocated_leading_byte (int dimension)
 #define BIG5_SAME_ROW (0xFF - 0xA1 + 0x7F - 0x40)
 
 Emchar
+decode_defined_char (Lisp_Object ccs, int code_point)
+{
+  int dim = XCHARSET_DIMENSION (ccs);
+  Lisp_Object decoding_table = XCHARSET_DECODING_TABLE (ccs);
+  Emchar char_id = -1;
+  Lisp_Object mother;
+
+  while (dim > 0)
+    {
+      dim--;
+      decoding_table
+       = get_ccs_octet_table (decoding_table, ccs,
+                              (code_point >> (dim * 8)) & 255);
+    }
+  if (CHARP (decoding_table))
+    return XCHAR (decoding_table);
+#ifdef HAVE_DATABASE
+  if (EQ (decoding_table, Qunloaded) ||
+      EQ (decoding_table, Qunbound) ||
+      NILP (decoding_table) )
+    {
+      char_id = load_char_decoding_entry_maybe (ccs, code_point);
+    }
+#endif
+  if (char_id >= 0)
+    return char_id;
+  else if ( CHARSETP (mother = XCHARSET_MOTHER (ccs)) )
+    {
+      if ( XCHARSET_CONVERSION (ccs) == CONVERSION_IDENTICAL )
+       {
+         if ( EQ (mother, Vcharset_ucs) )
+           return DECODE_CHAR (mother, code_point);
+         else
+           return decode_defined_char (mother, code_point);
+       }
+    }
+  return -1;
+}
+
+Emchar
 decode_builtin_char (Lisp_Object charset, int code_point)
 {
   Lisp_Object mother = XCHARSET_MOTHER (charset);
   int final;
 
-  if ( CHARSETP (mother) )
+  if ( CHARSETP (mother) && (XCHARSET_MAX_CODE (charset) > 0) )
     {
       int code = code_point;
 
@@ -1059,11 +1099,18 @@ charset_code_point (Lisp_Object charset, Emchar ch)
        code = charset_code_point (mother, ch);
       else
        code = ch;
-      if ( (min <= code) && (code <= max) )
+      if ( ((max == 0) && CHARSETP (mother)) ||
+          ((min <= code) && (code <= max)) )
        {
          int d = code - XCHARSET_CODE_OFFSET (charset);
 
-         if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x60 )
+         if ( XCHARSET_CONVERSION (charset) == CONVERSION_IDENTICAL )
+           return d;
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94 )
+           return d + 33;
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_96 )
+           return d + 32;
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x60 )
            {
              int row  = d / 94;
              int cell = d % 94 + 33;
@@ -1074,6 +1121,10 @@ charset_code_point (Lisp_Object charset, Emchar ch)
                row += 18 + 32;
              return (row << 8) | cell;
            }
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x94 )
+           return ((d / 94 + 33) << 8) | (d % 94 + 33);
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_96x96 )
+           return ((d / 96 + 32) << 8) | (d % 96 + 32);
          else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x94x60 )
            {
              int plane =  d / (94 * 60) + 33;
@@ -1086,44 +1137,34 @@ charset_code_point (Lisp_Object charset, Emchar ch)
                row += 18 + 32;
              return (plane << 16) | (row << 8) | cell;
            }
-         else if (XCHARSET_CHARS (charset) == 94)
-           {
-             if (XCHARSET_DIMENSION (charset) == 1)
-               return d + 33;
-             else if (XCHARSET_DIMENSION (charset) == 2)
-               return ((d / 94 + 33) << 8) | (d % 94 + 33);
-             else if (XCHARSET_DIMENSION (charset) == 3)
-               return
-                 (   (d / (94 * 94) + 33) << 16)
-                 |  ((d / 94 % 94   + 33) <<  8)
-                 |   (d % 94        + 33);
-             else /* if (XCHARSET_DIMENSION (charset) == 4) */
-               return
-                 (  (d / (94 * 94 * 94) + 33) << 24)
-                 | ((d / (94 * 94) % 94 + 33) << 16)
-                 | ((d / 94 % 94        + 33) <<  8)
-                 |  (d % 94             + 33);
-           }
-         else if (XCHARSET_CHARS (charset) == 96)
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x94x94 )
+           return
+             (   (d / (94 * 94) + 33) << 16)
+             |  ((d / 94 % 94   + 33) <<  8)
+             |   (d % 94        + 33);
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_96x96x96 )
+           return
+             (   (d / (96 * 96) + 32) << 16)
+             |  ((d / 96 % 96   + 32) <<  8)
+             |   (d % 96        + 32);
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x94x94x94 )
+           return
+             (  (d / (94 * 94 * 94) + 33) << 24)
+             | ((d / (94 * 94) % 94 + 33) << 16)
+             | ((d / 94 % 94        + 33) <<  8)
+             |  (d % 94             + 33);
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_96x96x96x96 )
+           return
+             (  (d / (96 * 96 * 96) + 32) << 24)
+             | ((d / (96 * 96) % 96 + 32) << 16)
+             | ((d / 96 % 96        + 32) <<  8)
+             |  (d % 96             + 32);
+         else
            {
-             if (XCHARSET_DIMENSION (charset) == 1)
-               return d + 32;
-             else if (XCHARSET_DIMENSION (charset) == 2)
-               return ((d / 96 + 32) << 8) | (d % 96 + 32);
-             else if (XCHARSET_DIMENSION (charset) == 3)
-               return
-                 (   (d / (96 * 96) + 32) << 16)
-                 |  ((d / 96 % 96   + 32) <<  8)
-                 |   (d % 96        + 32);
-             else /* if (XCHARSET_DIMENSION (charset) == 4) */
-               return
-                 (  (d / (96 * 96 * 96) + 32) << 24)
-                 | ((d / (96 * 96) % 96 + 32) << 16)
-                 | ((d / 96 % 96        + 32) <<  8)
-                 |  (d % 96             + 32);
+             printf ("Unknown CCS-conversion %d is specified!",
+                     XCHARSET_CONVERSION (charset));
+             exit (-1);
            }
-         else
-           return code - XCHARSET_CODE_OFFSET (charset);
        }
       else if ( (XCHARSET_CODE_OFFSET (charset) == 0) ||
                (XCHARSET_CODE_OFFSET (charset)
@@ -2227,7 +2268,7 @@ If corresponding character is not found, nil is returned.
   if (NILP (defined_only))
     c = DECODE_CHAR (charset, c);
   else
-    c = DECODE_DEFINED_CHAR (charset, c);
+    c = decode_defined_char (charset, c);
   return c >= 0 ? make_char (c) : Qnil;
 }
 
@@ -2723,7 +2764,7 @@ complex_vars_of_mule_charset (void)
                  build_string ("UCS"),
                  build_string ("ISO/IEC 10646"),
                  build_string (""),
-                 Qnil, 0, 0xFFFFFFF, 0, 0, Qnil, CONVERSION_IDENTICAL);
+                 Qnil, 0, 0x7FFFFFFF, 0, 0, Qnil, CONVERSION_IDENTICAL);
   staticpro (&Vcharset_ucs_bmp);
   Vcharset_ucs_bmp =
     make_charset (LEADING_BYTE_UCS_BMP, Qucs_bmp, 256, 2,
@@ -2762,17 +2803,17 @@ complex_vars_of_mule_charset (void)
                  build_string ("UCS for CNS 11643"),
                  build_string ("ISO/IEC 10646 for CNS 11643"),
                  build_string (""),
-                 Qnil, 0, 0, 0, 0,
-                 Qnil, CONVERSION_IDENTICAL);
+                 Qnil, 0, 0, 0, 0, Vcharset_ucs, CONVERSION_IDENTICAL);
   staticpro (&Vcharset_ucs_jis);
   Vcharset_ucs_jis =
     make_charset (LEADING_BYTE_UCS_JIS, Qucs_jis, 256, 3,
                  2, 2, 0, CHARSET_LEFT_TO_RIGHT,
                  build_string ("UCS for JIS"),
                  build_string ("UCS for JIS X 0208, 0212 and 0213"),
-                 build_string ("ISO/IEC 10646 for JIS X 0208, 0212 and 0213"),
+                 build_string
+                 ("ISO/IEC 10646 for JIS X 0208, 0212 and 0213"),
                  build_string (""),
-                 Qnil, 0, 0, 0, 0, Qnil, CONVERSION_IDENTICAL);
+                 Qnil, 0, 0, 0, 0, Vcharset_ucs, CONVERSION_IDENTICAL);
   staticpro (&Vcharset_ucs_ks);
   Vcharset_ucs_ks =
     make_charset (LEADING_BYTE_UCS_KS, Qucs_ks, 256, 3,
@@ -2781,7 +2822,7 @@ complex_vars_of_mule_charset (void)
                  build_string ("UCS for CCS defined by KS"),
                  build_string ("ISO/IEC 10646 for Korean Standards"),
                  build_string (""),
-                 Qnil, 0, 0, 0, 0, Qnil, CONVERSION_IDENTICAL);
+                 Qnil, 0, 0, 0, 0, Vcharset_ucs, CONVERSION_IDENTICAL);
   staticpro (&Vcharset_ucs_big5);
   Vcharset_ucs_big5 =
     make_charset (LEADING_BYTE_UCS_BIG5, Qucs_big5, 256, 3,
@@ -2790,7 +2831,7 @@ complex_vars_of_mule_charset (void)
                  build_string ("UCS for Big5"),
                  build_string ("ISO/IEC 10646 for Big5"),
                  build_string (""),
-                 Qnil, 0, 0, 0, 0, Qnil, CONVERSION_IDENTICAL);
+                 Qnil, 0, 0, 0, 0, Vcharset_ucs, CONVERSION_IDENTICAL);
 #else
 # define MIN_CHAR_THAI 0
 # define MAX_CHAR_THAI 0
@@ -2862,7 +2903,7 @@ complex_vars_of_mule_charset (void)
                  build_string ("TIS620.2529 (Thai)"),
                  build_string ("tis620"),
                  Qnil, MIN_CHAR_THAI, MAX_CHAR_THAI,
-                 MIN_CHAR_THAI, 32, Qnil, CONVERSION_IDENTICAL);
+                 MIN_CHAR_THAI, 32, Qnil, CONVERSION_96);
   staticpro (&Vcharset_greek_iso8859_7);
   Vcharset_greek_iso8859_7 =
     make_charset (LEADING_BYTE_GREEK_ISO8859_7, Qgreek_iso8859_7, 96, 1,
@@ -2980,7 +3021,7 @@ complex_vars_of_mule_charset (void)
                  Qnil,
                  MIN_CHAR_JIS_X0208_1990,
                  MAX_CHAR_JIS_X0208_1990, MIN_CHAR_JIS_X0208_1990, 33,
-                 Qnil, CONVERSION_IDENTICAL);
+                 Qnil, CONVERSION_94x94);
 #endif
   staticpro (&Vcharset_korean_ksc5601);
   Vcharset_korean_ksc5601 =