(put_char_ccs_code_point): Store characters of =ucs whose code_points
[chise/xemacs-chise.git.1] / src / chartab.c
index 1ef4e31..e77cbcb 100644 (file)
@@ -1136,10 +1136,16 @@ Lisp_Object Qsystem_char_id;
 
 Lisp_Object Qcomposition;
 Lisp_Object Q_decomposition;
+Lisp_Object Q_identical;
+Lisp_Object Q_identical_from;
 Lisp_Object Q_denotational;
 Lisp_Object Q_denotational_from;
 Lisp_Object Q_subsumptive;
 Lisp_Object Q_subsumptive_from;
+Lisp_Object Q_component;
+Lisp_Object Q_component_of;
+Lisp_Object Q_same;
+Lisp_Object Q_same_of;
 Lisp_Object Qto_ucs;
 Lisp_Object Q_ucs_unified;
 Lisp_Object Qcompat;
@@ -3275,6 +3281,41 @@ Return DEFAULT-VALUE if the value is not exist.
   return default_value;
 }
 
+static Lisp_Object
+find_char_feature_in_family (Lisp_Object character,
+                            Lisp_Object con_feature,
+                            Lisp_Object feature,
+                            Lisp_Object feature_rel_max)
+{
+  Lisp_Object ancestors
+    = Fget_char_attribute (character, con_feature, Qnil);
+
+  while (!NILP (ancestors))
+    {
+      Lisp_Object ancestor = XCAR (ancestors);
+      Lisp_Object ret;
+
+      if (EQ (ancestor, character))
+       return Qunbound;
+
+      ret = Fchar_feature (ancestor, feature, Qunbound,
+                          Qnil, make_int (0));
+      if (!UNBOUNDP (ret))
+       return ret;
+
+      ancestors = XCDR (ancestors);
+
+      ret = Fget_char_attribute (ancestor, Q_subsumptive_from, Qnil);
+      if (!NILP (ret))
+       ancestors = nconc2 (Fcopy_sequence (ancestors), ret);
+
+      ret = Fget_char_attribute (ancestor, Q_denotational_from, Qnil);
+      if (!NILP (ret))
+       ancestors = nconc2 (Fcopy_sequence (ancestors), ret);
+    }
+  return Qunbound;
+}
+
 DEFUN ("char-feature", Fchar_feature, 2, 5, 0, /*
 Return the value of CHARACTER's FEATURE.
 Return DEFAULT-VALUE if the value is not exist.
@@ -3313,7 +3354,8 @@ Return DEFAULT-VALUE if the value is not exist.
        }
     }
 
-  if ( !(EQ (attribute, Q_subsumptive_from)) &&
+  if ( !(EQ (attribute, Q_identical)) &&
+       !(EQ (attribute, Q_subsumptive_from)) &&
        !(EQ (attribute, Q_denotational_from)) &&
        ( (NILP (char_rel_max)
          || (INTP (char_rel_max) &&
@@ -3324,34 +3366,20 @@ Return DEFAULT-VALUE if the value is not exist.
 
       if ( (name_str[0] != '=') || (name_str[1] == '>') )
        {
-         Lisp_Object ancestors
-           = Fget_char_attribute (character, Q_subsumptive_from, Qnil);
-
-         if (NILP (ancestors))
-           ancestors
-             = Fget_char_attribute (character, Q_denotational_from, Qnil);
+         ret = find_char_feature_in_family (character, Q_identical,
+                                            attribute, feature_rel_max);
+         if (!UNBOUNDP (ret))
+           return ret;
 
-         while (!NILP (ancestors))
-           {
-             Lisp_Object ancestor = XCAR (ancestors);
+         ret = find_char_feature_in_family (character, Q_subsumptive_from,
+                                            attribute, feature_rel_max);
+         if (!UNBOUNDP (ret))
+           return ret;
 
-             if (!EQ (ancestor, character))
-               {
-                 ret = Fchar_feature (ancestor, attribute, Qunbound,
-                                      Qnil, make_int (0));
-                 if (!UNBOUNDP (ret))
-                   return ret;
-
-                 ancestors = XCDR (ancestors);
-                 ret = Fget_char_attribute (ancestor,
-                                            Q_subsumptive_from, Qnil);
-                 if (!NILP (ret))
-                   ancestors = nconc2 (Fcopy_sequence (ancestors), ret);
-               }
-             else
-               return default_value;
-             /* ancestors = XCDR (ancestors); */
-           }
+         ret = find_char_feature_in_family (character, Q_denotational_from,
+                                            attribute, feature_rel_max);
+         if (!UNBOUNDP (ret))
+           return ret;
        }
     }
   return default_value;
@@ -3482,6 +3510,12 @@ Store CHARACTER's ATTRIBUTE with VALUE.
            EQ (attribute, Q_subsumptive_from) ||
            EQ (attribute, Q_denotational) ||
            EQ (attribute, Q_denotational_from) ||
+           EQ (attribute, Q_identical) ||
+           EQ (attribute, Q_identical_from) ||
+           EQ (attribute, Q_component) ||
+           EQ (attribute, Q_component_of) ||
+           EQ (attribute, Q_same) ||
+           EQ (attribute, Q_same_of) ||
            !NILP (Fstring_match (build_string ("^<-simplified[^*]*$"),
                                  Fsymbol_name (attribute),
                                  Qnil, Qnil)) )
@@ -3492,7 +3526,11 @@ Store CHARACTER's ATTRIBUTE with VALUE.
       struct gcpro gcpro1;
       GCPRO1 (rev_feature);
 
-      if (EQ (attribute, Q_subsumptive))
+      if (EQ (attribute, Q_identical))
+       rev_feature = Q_identical_from;
+      else if (EQ (attribute, Q_identical_from))
+       rev_feature = Q_identical;
+      else if (EQ (attribute, Q_subsumptive))
        rev_feature = Q_subsumptive_from;
       else if (EQ (attribute, Q_subsumptive_from))
        rev_feature = Q_subsumptive;
@@ -3500,6 +3538,14 @@ Store CHARACTER's ATTRIBUTE with VALUE.
        rev_feature = Q_denotational_from;
       else if (EQ (attribute, Q_denotational_from))
        rev_feature = Q_denotational;
+      else if (EQ (attribute, Q_component))
+       rev_feature = Q_component_of;
+      else if (EQ (attribute, Q_component_of))
+       rev_feature = Q_component;
+      else if (EQ (attribute, Q_same))
+       rev_feature = Q_same_of;
+      else if (EQ (attribute, Q_same_of))
+       rev_feature = Q_same;
       else
        {
          Lisp_String* name = symbol_name (XSYMBOL (attribute));
@@ -3782,6 +3828,10 @@ Save values of ATTRIBUTE into database file.
       Lisp_Object (*filter)(Lisp_Object value);
 
       if ( EQ (attribute, Qideographic_structure)
+          || EQ (attribute, Q_identical)
+          || EQ (attribute, Q_identical_from)
+          || EQ (attribute, Q_same)
+          || EQ (attribute, Q_same_of)
           || !NILP (Fstring_match
                     (build_string ("^\\(<-\\|->\\)simplified[^*]*$"),
                      Fsymbol_name (attribute),
@@ -4549,16 +4599,18 @@ syms_of_chartab (void)
   INIT_LRECORD_IMPLEMENTATION (uint16_byte_table);
   INIT_LRECORD_IMPLEMENTATION (byte_table);
 
-#if defined(HAVE_CHISE) && !defined(HAVE_LIBCHISE_LIBCHISE)
-  defsymbol (&Qsystem_char_id,         "system-char-id");
-#endif
-
   defsymbol (&Qto_ucs,                 "=>ucs");
   defsymbol (&Q_ucs_unified,           "->ucs-unified");
   defsymbol (&Q_subsumptive,           "->subsumptive");
   defsymbol (&Q_subsumptive_from,      "<-subsumptive");
   defsymbol (&Q_denotational,          "->denotational");
   defsymbol (&Q_denotational_from,     "<-denotational");
+  defsymbol (&Q_identical,             "->identical");
+  defsymbol (&Q_identical_from,                "<-identical");
+  defsymbol (&Q_component,             "->ideographic-component-forms");
+  defsymbol (&Q_component_of,          "<-ideographic-component-forms");
+  defsymbol (&Q_same,                  "->same");
+  defsymbol (&Q_same_of,               "<-same");
   defsymbol (&Qcomposition,            "composition");
   defsymbol (&Q_decomposition,         "->decomposition");
   defsymbol (&Qcompat,                 "compat");