update.
[chise/xemacs-chise.git.1] / src / mule-charset.c
index d8b9630..06a2b68 100644 (file)
@@ -1,7 +1,8 @@
 /* Functions to handle multilingual characters.
    Copyright (C) 1992, 1995 Free Software Foundation, Inc.
    Copyright (C) 1995 Sun Microsystems, Inc.
-   Copyright (C) 1999,2000,2001,2002,2003,2004,2008,2009 MORIOKA Tomohiko
+   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2008, 2009, 2011
+     MORIOKA Tomohiko
 
 This file is part of XEmacs.
 
@@ -1139,35 +1140,40 @@ decode_builtin_char (Lisp_Object charset, int code_point)
 }
 
 int
-charset_code_point (Lisp_Object charset, Emchar ch, int defined_only)
+charset_code_point (Lisp_Object charset, Emchar ch, int accepted_mode)
 {
-  Lisp_Object encoding_table = XCHARSET_ENCODING_TABLE (charset);
   Lisp_Object ret;
 
-  if ( CHAR_TABLEP (encoding_table)
-       && INTP (ret = get_char_id_table (XCHAR_TABLE(encoding_table),
-                                        ch)) )
-    return XINT (ret);
-  else
+  if ( accepted_mode >= 0 )
+    {
+      Lisp_Object encoding_table = XCHARSET_ENCODING_TABLE (charset);
+
+      if ( CHAR_TABLEP (encoding_table)
+          && INTP (ret = get_char_id_table (XCHAR_TABLE(encoding_table),
+                                            ch)) )
+       return XINT (ret);
+    }
     {
       Lisp_Object mother = XCHARSET_MOTHER (charset);
       int min = XCHARSET_MIN_CODE (charset);
       int max = XCHARSET_MAX_CODE (charset);
       int code = -1;
 
-      if ( CHARSETP (mother) )
-       {
-         if (XCHARSET_FINAL (charset) >= '0')
-           code = charset_code_point (mother, ch, 1);
-         else
-           code = charset_code_point (mother, ch, defined_only);
-       }
-      else if (defined_only)
+      if ( CHARSETP (mother) && ( accepted_mode >= 0)
+          && ( XCHARSET_FINAL (charset) >= '0' )
+          )
+       code = charset_code_point (mother, ch, CHAR_DEFINED_ONLY);
+      else if ( CHARSETP (mother)
+               && ( XCHARSET_FINAL (charset) < '0' )
+               )
+       code = charset_code_point (mother, ch, accepted_mode);
+      else if ( accepted_mode == CHAR_DEFINED_ONLY )
        return -1;
       else if ( ((max == 0) && CHARSETP (mother)
                 && (XCHARSET_FINAL (charset) == 0))
                || ((min <= ch) && (ch <= max)) )
        code = ch;
+
       if ( ((max == 0) && CHARSETP (mother) && (code >= 0))
           || ((min <= code) && (code <= max)) )
        {
@@ -1260,7 +1266,7 @@ charset_code_point (Lisp_Object charset, Emchar ch, int defined_only)
              exit (-1);
            }
        }
-      else if (defined_only)
+      else if ( accepted_mode == CHAR_DEFINED_ONLY )
        return -1;
       else if ( ( XCHARSET_FINAL (charset) >= '0' ) &&
                ( XCHARSET_MIN_CODE (charset) == 0 )
@@ -1874,6 +1880,47 @@ character set.  Recognized properties are:
        byte_offset = 0;
     }
 
+  if ( (conversion == 0) && NILP (mother) && (min_code > 0) )
+    {
+      switch (chars)
+       {
+       case 94:
+         switch (dimension)
+           {
+           case 1:
+             conversion = CONVERSION_94;
+             break;
+           case 2:
+             conversion = CONVERSION_94x94;
+             break;
+           case 3:
+             conversion = CONVERSION_94x94x94;
+             break;
+           case 4:
+             conversion = CONVERSION_94x94x94x94;
+             break;
+           }
+         break;
+       case 96:
+         switch (dimension)
+           {
+           case 1:
+             conversion = CONVERSION_96;
+             break;
+           case 2:
+             conversion = CONVERSION_96x96;
+             break;
+           case 3:
+             conversion = CONVERSION_96x96x96;
+             break;
+           case 4:
+             conversion = CONVERSION_96x96x96x96;
+             break;
+           }
+         break;
+       }
+    }
+
   charset = make_charset (id, name, chars, dimension, columns, graphic,
                          final, direction, short_name, long_name,
                          doc_string, registry, iso_ir,