update.
[chise/xemacs-chise.git.1] / src / mule-charset.c
index 79ddc26..9cb6015 100644 (file)
@@ -845,8 +845,76 @@ get_unallocated_leading_byte (int dimension)
 
 #define BIG5_SAME_ROW (0xFF - 0xA1 + 0x7F - 0x40)
 
+static int
+decode_ccs_conversion (int conv_type, int code_point)
+{
+  if ( conv_type == CONVERSION_IDENTICAL )
+    {
+      return code_point;
+    }
+  if ( conv_type == CONVERSION_94x60 )
+    {
+      int row = code_point >> 8;
+      int cell = code_point & 255;       
+
+      if (row < 16 + 32)
+       return -1;
+      else if (row < 16 + 32 + 30)
+       return (row - (16 + 32)) * 94 + cell - 33;
+      else if (row < 18 + 32 + 30)
+       return -1;
+      else if (row < 18 + 32 + 60)
+       return (row - (18 + 32)) * 94 + cell - 33;
+    }
+  else if ( conv_type == CONVERSION_94x94x60 )
+    {
+      int plane = code_point >> 16;
+      int row = (code_point >> 8) & 255;
+      int cell = code_point & 255;       
+
+      if (row < 16 + 32)
+       return -1;
+      else if (row < 16 + 32 + 30)
+       return
+         (plane - 33) * 94 * 60
+         + (row - (16 + 32)) * 94
+         + cell - 33;
+      else if (row < 18 + 32 + 30)
+       return -1;
+      else if (row < 18 + 32 + 60)
+       return
+         (plane - 33) * 94 * 60
+         + (row - (18 + 32)) * 94
+         + cell - 33;
+    }
+  else if ( conv_type == 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 (b1 << 8) | b2;
+    }
+  else if ( conv_type == 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 (b1 << 8) | b2;
+    }
+  return -1;
+}
+
 Emchar
-decode_defined_char (Lisp_Object ccs, int code_point)
+decode_defined_char (Lisp_Object ccs, int code_point, int without_inheritance)
 {
   int dim = XCHARSET_DIMENSION (ccs);
   Lisp_Object decoding_table = XCHARSET_DECODING_TABLE (ccs);
@@ -870,37 +938,20 @@ decode_defined_char (Lisp_Object ccs, int code_point)
 #endif /* HAVE_CHISE */
   if (char_id >= 0)
     return char_id;
-  else if ( CHARSETP (mother = XCHARSET_MOTHER (ccs)) )
+  else if ( !without_inheritance
+           && CHARSETP (mother = XCHARSET_MOTHER (ccs)) )
     {
-      if ( XCHARSET_CONVERSION (ccs) == CONVERSION_IDENTICAL )
+      int code
+       = decode_ccs_conversion (XCHARSET_CONVERSION (ccs), code_point);
+
+      if (code >= 0)
        {
+         code += XCHARSET_CODE_OFFSET(ccs);
          if ( EQ (mother, Vcharset_ucs) )
-           return DECODE_CHAR (mother, code_point);
+           return DECODE_CHAR (mother, code, without_inheritance);
          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 decode_defined_char (mother, code,
+                                       without_inheritance);
        }
     }
   return -1;
@@ -916,68 +967,16 @@ decode_builtin_char (Lisp_Object charset, int code_point)
     {
       if ( CHARSETP (mother) )
        {
-         int code = code_point;
-
-         if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x60 )
-           {
-             int row = code_point >> 8;
-             int cell = code_point & 255;        
-
-             if (row < 16 + 32)
-               return -1;
-             else if (row < 16 + 32 + 30)
-               code = (row - (16 + 32)) * 94 + cell - 33;
-             else if (row < 18 + 32 + 30)
-               return -1;
-             else if (row < 18 + 32 + 60)
-               code = (row - (18 + 32)) * 94 + cell - 33;
-           }
-         else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x94x60 )
-           {
-             int plane = code_point >> 16;
-             int row = (code_point >> 8) & 255;
-             int cell = code_point & 255;        
-
-             if (row < 16 + 32)
-               return -1;
-             else if (row < 16 + 32 + 30)
-               code
-                 = (plane - 33) * 94 * 60
-                 + (row - (16 + 32)) * 94
-                 + cell - 33;
-             else if (row < 18 + 32 + 30)
-               return -1;
-             else if (row < 18 + 32 + 60)
-               code
-                 = (plane - 33) * 94 * 60
-                 + (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);
+         int code
+           = decode_ccs_conversion (XCHARSET_CONVERSION (charset),
+                                    code_point);
 
-             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));
+         if (code >= 0)
+           return
+             decode_builtin_char (mother,
+                                  code + XCHARSET_CODE_OFFSET(charset));
+         else
+           return -1;
        }
       else
        {
@@ -2370,12 +2369,13 @@ load_char_decoding_entry_maybe (Lisp_Object ccs, int code_point)
 /************************************************************************/
 
 #ifdef UTF2000
-DEFUN ("decode-char", Fdecode_char, 2, 3, 0, /*
+DEFUN ("decode-char", Fdecode_char, 2, 4, 0, /*
 Make a character from CHARSET and code-point CODE.
 If DEFINED_ONLY is non-nil, builtin character is not returned.
+If WITHOUT_INHERITANCE is non-nil, inherited character is not returned.
 If corresponding character is not found, nil is returned.
 */
-       (charset, code, defined_only))
+       (charset, code, defined_only, without_inheritance))
 {
   int c;
 
@@ -2385,9 +2385,9 @@ If corresponding character is not found, nil is returned.
   if (XCHARSET_GRAPHIC (charset) == 1)
     c &= 0x7F7F7F7F;
   if (NILP (defined_only))
-    c = DECODE_CHAR (charset, c);
+    c = DECODE_CHAR (charset, c, !NILP (without_inheritance));
   else
-    c = decode_defined_char (charset, c);
+    c = decode_defined_char (charset, c, !NILP (without_inheritance));
   return c >= 0 ? make_char (c) : Qnil;
 }
 
@@ -2402,7 +2402,7 @@ Make a builtin character from CHARSET and code-point CODE.
   CHECK_INT (code);
   if (EQ (charset, Vcharset_latin_viscii))
     {
-      Lisp_Object chr = Fdecode_char (charset, code, Qnil);
+      Lisp_Object chr = Fdecode_char (charset, code, Qnil, Qnil);
       Lisp_Object ret;
 
       if (!NILP (chr))
@@ -2431,7 +2431,8 @@ Make a builtin character from CHARSET and code-point CODE.
     c &= 0x7F7F7F7F;
 #endif
   c = decode_builtin_char (charset, c);
-  return c >= 0 ? make_char (c) : Fdecode_char (charset, code, Qnil);
+  return
+    c >= 0 ? make_char (c) : Fdecode_char (charset, code, Qnil, Qnil);
 }
 #endif