This commit was manufactured by cvs2svn to create branch 'utf-2000'.
[chise/xemacs-chise.git-] / src / mule-charset.c
index 4a14a21..f184a29 100644 (file)
@@ -308,7 +308,7 @@ Lisp_Object Qleading_byte;
 Lisp_Object Qshort_name, Qlong_name;
 #ifdef UTF2000
 Lisp_Object Qmin_code, Qmax_code, Qcode_offset;
-Lisp_Object Qmother, Qconversion, Q94x60, Q94x94x60;
+Lisp_Object Qmother, Qconversion, Q94x60, Q94x94x60, Qbig5_1, Qbig5_2;
 #endif
 
 Lisp_Object Qascii,
@@ -941,6 +941,29 @@ decode_defined_char (Lisp_Object ccs, int code_point)
          else
            return decode_defined_char (mother, code_point);
        }
+      else if ( XCHARSET_CONVERSION (ccs) == CONVERSION_BIG5_1 )
+       {
+         unsigned int I
+           = (((code_point >> 8) & 0x7F) - 33) * 94
+           + (( code_point       & 0x7F) - 33);
+         unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
+         unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
+
+         b2 += b2 < 0x3F ? 0x40 : 0x62;
+         return decode_defined_char (mother, (b1 << 8) | b2);
+       }
+      else if ( XCHARSET_CONVERSION (ccs) == CONVERSION_BIG5_2 )
+       {
+         unsigned int I
+           = (((code_point >> 8) & 0x7F) - 33) * 94
+           + (( code_point       & 0x7F) - 33)
+           + BIG5_SAME_ROW * (0xC9 - 0xA1);
+         unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
+         unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
+
+         b2 += b2 < 0x3F ? 0x40 : 0x62;
+         return decode_defined_char (mother, (b1 << 8) | b2);
+       }
     }
   return -1;
 }
@@ -990,6 +1013,29 @@ decode_builtin_char (Lisp_Object charset, int code_point)
              + (row - (18 + 32)) * 94
              + cell - 33;
        }
+      else if ( XCHARSET_CONVERSION (charset) == CONVERSION_BIG5_1 )
+       {
+         unsigned int I
+           = (((code_point >> 8) & 0x7F) - 33) * 94
+           + (( code_point       & 0x7F) - 33);
+         unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
+         unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
+
+         b2 += b2 < 0x3F ? 0x40 : 0x62;
+         code = (b1 << 8) | b2;
+       }
+      else if ( XCHARSET_CONVERSION (charset) == CONVERSION_BIG5_2 )
+       {
+         unsigned int I
+           = (((code_point >> 8) & 0x7F) - 33) * 94
+           + (( code_point       & 0x7F) - 33)
+           + BIG5_SAME_ROW * (0xC9 - 0xA1);
+         unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
+         unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
+
+         b2 += b2 < 0x3F ? 0x40 : 0x62;
+         code = (b1 << 8) | b2;
+       }
       return
        decode_builtin_char (mother, code + XCHARSET_CODE_OFFSET(charset));
     }
@@ -1104,7 +1150,13 @@ charset_code_point (Lisp_Object charset, Emchar ch)
        {
          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;
@@ -1115,6 +1167,35 @@ charset_code_point (Lisp_Object charset, Emchar ch)
                row += 18 + 32;
              return (row << 8) | cell;
            }
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_BIG5_1 )
+           {
+             int B1 = d >> 8, B2 = d & 0xFF;
+             unsigned int I
+               = (B1 - 0xA1) * BIG5_SAME_ROW + B2
+               - (B2 < 0x7F ? 0x40 : 0x62);
+
+             if (B1 < 0xC9)
+               {
+                 return ((I / 94 + 33) << 8) | (I % 94 + 33);
+               }
+           }
+         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_BIG5_2 )
+           {
+             int B1 = d >> 8, B2 = d & 0xFF;
+             unsigned int I
+               = (B1 - 0xA1) * BIG5_SAME_ROW + B2
+               - (B2 < 0x7F ? 0x40 : 0x62);
+
+             if (B1 >= 0xC9)
+               {
+                 I -= (BIG5_SAME_ROW) * (0xC9 - 0xA1);
+                 return ((I / 94 + 33) << 8) | (I % 94 + 33);
+               }
+           }
+         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;
@@ -1127,44 +1208,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)
@@ -1499,7 +1570,7 @@ character set.  Recognized properties are:
 'code-offset   [UTF-2000 only] Offset for a code-point of a base
                coded-charset.
 'conversion    [UTF-2000 only] Conversion for a code-point of a base
-               coded-charset (94x60 or 94x94x60).
+               coded-charset (94x60, 94x94x60, big5-1 or big5-2).
 */
        (name, doc_string, props))
 {
@@ -1639,6 +1710,10 @@ character set.  Recognized properties are:
              conversion = CONVERSION_94x60;
            else if (EQ (value, Q94x94x60))
              conversion = CONVERSION_94x94x60;
+           else if (EQ (value, Qbig5_1))
+             conversion = CONVERSION_BIG5_1;
+           else if (EQ (value, Qbig5_2))
+             conversion = CONVERSION_BIG5_2;
            else
              signal_simple_error ("Unrecognized conversion", value);
          }
@@ -2610,6 +2685,8 @@ syms_of_mule_charset (void)
   defsymbol (&Qconversion, "conversion");
   defsymbol (&Q94x60, "94x60");
   defsymbol (&Q94x94x60, "94x94x60");
+  defsymbol (&Qbig5_1, "big5-1");
+  defsymbol (&Qbig5_2, "big5-2");
 #endif
 
   defsymbol (&Ql2r, "l2r");
@@ -2803,15 +2880,15 @@ 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, Vcharset_ucs, CONVERSION_IDENTICAL);
   staticpro (&Vcharset_ucs_ks);
@@ -2822,7 +2899,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,
@@ -2831,7 +2908,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
@@ -2903,7 +2980,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,
@@ -3021,7 +3098,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 =
@@ -3242,7 +3319,8 @@ complex_vars_of_mule_charset (void)
                  build_string
                  ("Big5 Level-1 Chinese traditional"),
                  build_string ("big5"),
-                 Qnil, 0, 0, 0, 33, Qnil, CONVERSION_IDENTICAL);
+                 Qnil, 0, 0, 0, 33, /* Qnil, CONVERSION_IDENTICAL */
+                 Vcharset_chinese_big5, CONVERSION_BIG5_1);
   staticpro (&Vcharset_chinese_big5_2);
   Vcharset_chinese_big5_2 =
     make_charset (LEADING_BYTE_CHINESE_BIG5_2, Qchinese_big5_2, 94, 2,
@@ -3252,7 +3330,8 @@ complex_vars_of_mule_charset (void)
                  build_string
                  ("Big5 Level-2 Chinese traditional"),
                  build_string ("big5"),
-                 Qnil, 0, 0, 0, 33, Qnil, CONVERSION_IDENTICAL);
+                 Qnil, 0, 0, 0, 33, /* Qnil, CONVERSION_IDENTICAL */
+                 Vcharset_chinese_big5, CONVERSION_BIG5_2);
 
 #ifdef ENABLE_COMPOSITE_CHARS
   /* #### For simplicity, we put composite chars into a 96x96 charset.