Use utf-8-mcs-er instead of utf-8-mcs.
[chise/xemacs-chise.git-] / src / chartab.c
index ed78ba6..340530e 100644 (file)
@@ -4,7 +4,7 @@
    Copyright (C) 1995, 1996 Ben Wing.
    Copyright (C) 1995, 1997, 1999 Electrotechnical Laboratory, JAPAN.
    Licensed to the Free Software Foundation.
-   Copyright (C) 1999,2000,2001,2002 MORIOKA Tomohiko
+   Copyright (C) 1999,2000,2001,2002,2003 MORIOKA Tomohiko
 
 This file is part of XEmacs.
 
@@ -65,9 +65,12 @@ Lisp_Object Vword_combining_categories, Vword_separating_categories;
 \f
 #ifdef UTF2000
 
+EXFUN (Fchar_refs_simplify_char_specs, 1);
+extern Lisp_Object Qideographic_structure;
+
 EXFUN (Fmap_char_attribute, 3);
 
-#if defined(HAVE_DATABASE)
+#if defined(HAVE_CHISE_CLIENT)
 EXFUN (Fload_char_attribute_table, 1);
 
 Lisp_Object Vchar_db_stingy_mode;
@@ -315,11 +318,12 @@ map_over_uint8_byte_table (Lisp_Uint8_Byte_Table *ct, Lisp_Char_Table* root,
   return retval;
 }
 
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
 static void
 save_uint8_byte_table (Lisp_Uint8_Byte_Table *ct, Lisp_Char_Table* root,
                       Lisp_Object db,
-                      Emchar ofs, int place)
+                      Emchar ofs, int place,
+                      Lisp_Object (*filter)(Lisp_Object value))
 {
   struct chartab_range rainj;
   int i, retval;
@@ -626,11 +630,12 @@ map_over_uint16_byte_table (Lisp_Uint16_Byte_Table *ct, Lisp_Char_Table* root,
   return retval;
 }
 
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
 static void
 save_uint16_byte_table (Lisp_Uint16_Byte_Table *ct, Lisp_Char_Table* root,
                        Lisp_Object db,
-                       Emchar ofs, int place)
+                       Emchar ofs, int place,
+                       Lisp_Object (*filter)(Lisp_Object value))
 {
   struct chartab_range rainj;
   int i, retval;
@@ -886,11 +891,12 @@ map_over_byte_table (Lisp_Byte_Table *ct, Lisp_Char_Table* root,
   return retval;
 }
 
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
 static void
 save_byte_table (Lisp_Byte_Table *ct, Lisp_Char_Table* root,
                 Lisp_Object db,
-                Emchar ofs, int place)
+                Emchar ofs, int place,
+                Lisp_Object (*filter)(Lisp_Object value))
 {
   int i, retval;
   Lisp_Object v;
@@ -903,19 +909,19 @@ save_byte_table (Lisp_Byte_Table *ct, Lisp_Char_Table* root,
       if (UINT8_BYTE_TABLE_P (v))
        {
          save_uint8_byte_table (XUINT8_BYTE_TABLE(v), root, db,
-                                c, place - 1);
+                                c, place - 1, filter);
          c += unit;
        }
       else if (UINT16_BYTE_TABLE_P (v))
        {
          save_uint16_byte_table (XUINT16_BYTE_TABLE(v), root, db,
-                                 c, place - 1);
+                                 c, place - 1, filter);
          c += unit;
        }
       else if (BYTE_TABLE_P (v))
        {
          save_byte_table (XBYTE_TABLE(v), root, db,
-                          c, place - 1);
+                          c, place - 1, filter);
          c += unit;
        }
       else if (EQ (v, Qunloaded))
@@ -927,6 +933,9 @@ save_byte_table (Lisp_Byte_Table *ct, Lisp_Char_Table* root,
          struct chartab_range rainj;
          Emchar c1 = c + unit;
 
+         if (filter != NULL)
+           v = (*filter)(v);
+
          rainj.type = CHARTAB_RANGE_CHAR;
 
          for (; c < c1 && retval == 0; c++)
@@ -2064,7 +2073,7 @@ get_char_table (Emchar ch, Lisp_Char_Table *ct)
   {
     Lisp_Object ret = get_char_id_table (ct, ch);
 
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
     if (NILP (ret))
       {
        if (EQ (CHAR_TABLE_NAME (ct), Qdowncase))
@@ -2377,7 +2386,6 @@ put_char_table (Lisp_Char_Table *ct, struct chartab_range *range,
     case CHARTAB_RANGE_CHARSET:
 #ifdef UTF2000
       {
-       Emchar c;
        Lisp_Object encoding_table = XCHARSET_ENCODING_TABLE (range->charset);
 
        /* printf ("put-char-table: range = charset: %d\n",
@@ -2385,29 +2393,24 @@ put_char_table (Lisp_Char_Table *ct, struct chartab_range *range,
        */
        if ( CHAR_TABLEP (encoding_table) )
          {
-#if 1
            char_attribute_table_to_put = ct;
            value_to_put = val;
            Fmap_char_attribute (Qput_char_table_map_function,
                                 XCHAR_TABLE_NAME (encoding_table),
                                 Qnil);
-#else
-           for (c = 0; c < 1 << 24; c++)
-             {
-               if ( INTP (get_char_id_table (XCHAR_TABLE(encoding_table),
-                                             c)) )
-                 put_char_id_table_0 (ct, c, val);
-             }
-#endif
          }
+#if 0
        else
          {
+           Emchar c;
+
            for (c = 0; c < 1 << 24; c++)
              {
                if ( charset_code_point (range->charset, c) >= 0 )
                  put_char_id_table_0 (ct, c, val);
              }
          }
+#endif
       }
 #else
       if (EQ (range->charset, Vcharset_ascii))
@@ -2442,7 +2445,7 @@ put_char_table (Lisp_Char_Table *ct, struct chartab_range *range,
          {
            Emchar ch = DECODE_CHAR (range->charset, (range->row << 8) | i);
 
-           if ( charset_code_point (range->charset, ch) >= 0 )
+           if ( charset_code_point (range->charset, ch, 0) >= 0 )
              put_char_id_table_0 (ct, ch, val);
          }
       }
@@ -2848,7 +2851,7 @@ map_char_table (Lisp_Char_Table *ct,
            struct chartab_range rainj;
            struct map_char_table_for_charset_arg mcarg;
 
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
            if (XCHAR_TABLE_UNLOADED(encoding_table))
              Fload_char_attribute_table (XCHAR_TABLE_NAME (encoding_table));
 #endif
@@ -2884,7 +2887,7 @@ map_char_table (Lisp_Char_Table *ct,
          {
            Emchar ch = DECODE_CHAR (range->charset, (range->row << 8) | i);
 
-           if ( charset_code_point (range->charset, ch) >= 0 )
+           if ( charset_code_point (range->charset, ch, 0) >= 0 )
              {
                Lisp_Object val
                  = get_byte_table (get_byte_table
@@ -3159,86 +3162,93 @@ Return DEFAULT-VALUE if the value is not exist.
   return default_value;
 }
 
-DEFUN ("put-char-attribute", Fput_char_attribute, 3, 3, 0, /*
-Store CHARACTER's ATTRIBUTE with VALUE.
-*/
-       (character, attribute, value))
+void put_char_composition (Lisp_Object character, Lisp_Object value);
+void
+put_char_composition (Lisp_Object character, Lisp_Object value)
 {
-  Lisp_Object ccs = Ffind_charset (attribute);
+  if (!CONSP (value))
+    signal_simple_error ("Invalid value for ->decomposition",
+                        value);
 
-  if (!NILP (ccs))
+  if (CONSP (Fcdr (value)))
     {
-      CHECK_CHAR (character);
-      value = put_char_ccs_code_point (character, ccs, value);
-    }
-  else if (EQ (attribute, Q_decomposition))
-    {
-      CHECK_CHAR (character);
-      if (!CONSP (value))
-       signal_simple_error ("Invalid value for ->decomposition",
-                            value);
-
-      if (CONSP (Fcdr (value)))
+      if (NILP (Fcdr (Fcdr (value))))
        {
-         if (NILP (Fcdr (Fcdr (value))))
-           {
-             Lisp_Object base = Fcar (value);
-             Lisp_Object modifier = Fcar (Fcdr (value));
+         Lisp_Object base = Fcar (value);
+         Lisp_Object modifier = Fcar (Fcdr (value));
 
-             if (INTP (base))
-               {
-                 base = make_char (XINT (base));
-                 Fsetcar (value, base);
-               }
-             if (INTP (modifier))
-               {
-                 modifier = make_char (XINT (modifier));
-                 Fsetcar (Fcdr (value), modifier);
-               }
-             if (CHARP (base))
-               {
-                 Lisp_Object alist = Fget_char_attribute (base, Qcomposition, Qnil);
-                 Lisp_Object ret = Fassq (modifier, alist);
-
-                 if (NILP (ret))
-                   Fput_char_attribute (base, Qcomposition,
-                                        Fcons (Fcons (modifier, character), alist));
-                 else
-                   Fsetcdr (ret, character);
-               }
+         if (INTP (base))
+           {
+             base = make_char (XINT (base));
+             Fsetcar (value, base);
+           }
+         if (INTP (modifier))
+           {
+             modifier = make_char (XINT (modifier));
+             Fsetcar (Fcdr (value), modifier);
+           }
+         if (CHARP (base))
+           {
+             Lisp_Object alist
+               = Fget_char_attribute (base, Qcomposition, Qnil);
+             Lisp_Object ret = Fassq (modifier, alist);
+
+             if (NILP (ret))
+               Fput_char_attribute (base, Qcomposition,
+                                    Fcons (Fcons (modifier, character),
+                                           alist));
+             else
+               Fsetcdr (ret, character);
            }
        }
-      else
+    }
+  else
+    {
+      Lisp_Object v = Fcar (value);
+
+      if (INTP (v))
        {
-         Lisp_Object v = Fcar (value);
+         Emchar c = XINT (v);
+         Lisp_Object ret
+           = Fget_char_attribute (make_char (c), Q_ucs_variants, Qnil);
 
-         if (INTP (v))
+         if (!CONSP (ret))
            {
-             Emchar c = XINT (v);
-             Lisp_Object ret
-               = Fget_char_attribute (make_char (c), Q_ucs_variants, Qnil);
-
-             if (!CONSP (ret))
-               {
-                 Fput_char_attribute (make_char (c), Q_ucs_variants,
-                                      Fcons (character, Qnil));
-               }
-             else if (NILP (Fmemq (character, ret)))
-               {
-                 Fput_char_attribute (make_char (c), Q_ucs_variants,
-                                      Fcons (character, ret));
-               }
+             Fput_char_attribute (make_char (c), Q_ucs_variants,
+                                  Fcons (character, Qnil));
+           }
+         else if (NILP (Fmemq (character, ret)))
+           {
+             Fput_char_attribute (make_char (c), Q_ucs_variants,
+                                  Fcons (character, ret));
            }
        }
     }
+}
+
+DEFUN ("put-char-attribute", Fput_char_attribute, 3, 3, 0, /*
+Store CHARACTER's ATTRIBUTE with VALUE.
+*/
+       (character, attribute, value))
+{
+  Lisp_Object ccs = Ffind_charset (attribute);
+
+  CHECK_CHAR (character);
+
+  if (!NILP (ccs))
+    {
+      value = put_char_ccs_code_point (character, ccs, value);
+      attribute = XCHARSET_NAME (ccs);
+    }
+  else if (EQ (attribute, Q_decomposition))
+    put_char_composition (character, value);
   else if (EQ (attribute, Qto_ucs) || EQ (attribute, Q_ucs))
     {
       Lisp_Object ret;
       Emchar c;
 
-      CHECK_CHAR (character);
       if (!INTP (value))
-       signal_simple_error ("Invalid value for ->ucs", value);
+       signal_simple_error ("Invalid value for =>ucs", value);
 
       c = XINT (value);
 
@@ -3258,6 +3268,10 @@ Store CHARACTER's ATTRIBUTE with VALUE.
        attribute = Qto_ucs;
 #endif
     }
+#if 0
+  else if (EQ (attribute, Qideographic_structure))
+    value = Fcopy_sequence (Fchar_refs_simplify_char_specs (value));
+#endif
   {
     Lisp_Object table = Fgethash (attribute,
                                  Vchar_attribute_hash_table,
@@ -3267,7 +3281,7 @@ Store CHARACTER's ATTRIBUTE with VALUE.
       {
        table = make_char_id_table (Qunbound);
        Fputhash (attribute, table, Vchar_attribute_hash_table);
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
        XCHAR_TABLE_NAME (table) = attribute;
 #endif
       }
@@ -3303,7 +3317,7 @@ Remove CHARACTER's ATTRIBUTE.
   return Qnil;
 }
 
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
 Lisp_Object
 char_attribute_system_db_file (Lisp_Object key_type, Lisp_Object attribute,
                               int writing_mode)
@@ -3361,7 +3375,7 @@ Save values of ATTRIBUTE into database file.
 */
        (attribute))
 {
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
   Lisp_Object table = Fgethash (attribute,
                                Vchar_attribute_hash_table, Qunbound);
   Lisp_Char_Table *ct;
@@ -3377,12 +3391,21 @@ Save values of ATTRIBUTE into database file.
   db = Fopen_database (db_file, Qnil, Qnil, build_string ("w+"), Qnil);
   if (!NILP (db))
     {
+      Lisp_Object (*filter)(Lisp_Object value);
+
+      if (EQ (attribute, Qideographic_structure))
+       filter = &Fchar_refs_simplify_char_specs;
+      else
+       filter = NULL;
+
       if (UINT8_BYTE_TABLE_P (ct->table))
-       save_uint8_byte_table (XUINT8_BYTE_TABLE(ct->table), ct, db, 0, 3);
+       save_uint8_byte_table (XUINT8_BYTE_TABLE(ct->table), ct, db,
+                              0, 3, filter);
       else if (UINT16_BYTE_TABLE_P (ct->table))
-       save_uint16_byte_table (XUINT16_BYTE_TABLE(ct->table), ct, db, 0, 3);
+       save_uint16_byte_table (XUINT16_BYTE_TABLE(ct->table), ct, db,
+                               0, 3, filter);
       else if (BYTE_TABLE_P (ct->table))
-       save_byte_table (XBYTE_TABLE(ct->table), ct, db, 0, 3);
+       save_byte_table (XBYTE_TABLE(ct->table), ct, db, 0, 3, filter);
       Fclose_database (db);
       return Qt;
     }
@@ -3398,7 +3421,7 @@ Mount database file on char-attribute-table ATTRIBUTE.
 */
        (attribute))
 {
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
   Lisp_Object table = Fgethash (attribute,
                                Vchar_attribute_hash_table, Qunbound);
 
@@ -3424,7 +3447,7 @@ Close database of ATTRIBUTE.
 */
        (attribute))
 {
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
   Lisp_Object table = Fgethash (attribute,
                                Vchar_attribute_hash_table, Qunbound);
   Lisp_Char_Table *ct;
@@ -3449,7 +3472,7 @@ Reset values of ATTRIBUTE with database file.
 */
        (attribute))
 {
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
   Lisp_Object table = Fgethash (attribute,
                                Vchar_attribute_hash_table, Qunbound);
   Lisp_Char_Table *ct;
@@ -3606,7 +3629,7 @@ the entire table.
   if (NILP (range))
     range = Qt;
   decode_char_table_range (range, &rainj);
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
   if (CHAR_TABLE_UNLOADED(ct))
     Fload_char_attribute_table (attribute);
 #endif
@@ -3625,10 +3648,12 @@ Store character's ATTRIBUTES.
        (attributes))
 {
   Lisp_Object rest = attributes;
-  Lisp_Object code = Fcdr (Fassq (Qucs, attributes));
+  Lisp_Object code = Fcdr (Fassq (Qmap_ucs, attributes));
   Lisp_Object character;
 
   if (NILP (code))
+    code = Fcdr (Fassq (Qucs, attributes));
+  if (NILP (code))
     {
       while (CONSP (rest))
        {
@@ -4090,7 +4115,7 @@ syms_of_chartab (void)
   DEFSUBR (Ffind_char_attribute_table);
   defsymbol (&Qput_char_table_map_function, "put-char-table-map-function");
   DEFSUBR (Fput_char_table_map_function);
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
   DEFSUBR (Fsave_char_attribute_table);
   DEFSUBR (Fmount_char_attribute_table);
   DEFSUBR (Freset_char_attribute_table);
@@ -4159,11 +4184,11 @@ void
 vars_of_chartab (void)
 {
 #ifdef UTF2000
-#ifdef HAVE_DATABASE
+#ifdef HAVE_CHISE_CLIENT
   DEFVAR_LISP ("char-db-stingy-mode", &Vchar_db_stingy_mode /*
 */ );
   Vchar_db_stingy_mode = Qt;
-#endif /* HAVE_DATABASE */
+#endif /* HAVE_CHISE_CLIENT */
 #endif
   /* DO NOT staticpro this.  It works just like Vweak_hash_tables. */
   Vall_syntax_tables = Qnil;