Use utf-8-mcs-er instead of utf-8-mcs.
[chise/xemacs-chise.git-] / src / chartab.c
index 9fbd7c7..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.
 
@@ -322,7 +322,8 @@ map_over_uint8_byte_table (Lisp_Uint8_Byte_Table *ct, Lisp_Char_Table* root,
 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;
@@ -633,7 +634,8 @@ map_over_uint16_byte_table (Lisp_Uint16_Byte_Table *ct, Lisp_Char_Table* root,
 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;
@@ -893,7 +895,8 @@ map_over_byte_table (Lisp_Byte_Table *ct, Lisp_Char_Table* root,
 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;
@@ -906,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))
@@ -930,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++)
@@ -3230,7 +3236,10 @@ Store CHARACTER's ATTRIBUTE with VALUE.
   CHECK_CHAR (character);
 
   if (!NILP (ccs))
-    value = put_char_ccs_code_point (character, ccs, value);
+    {
+      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))
@@ -3259,8 +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,
@@ -3380,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;
     }
@@ -3628,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))
        {