}
-#if defined(HAVE_CHISE) && !defined(HAVE_LIBCHISE_LIBCHISE)
-Lisp_Object Qsystem_char_id;
-#endif
-
Lisp_Object Qcomposition;
Lisp_Object Q_decomposition;
Lisp_Object Q_identical;
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 Qto_ucs;
Lisp_Object Q_ucs_unified;
Lisp_Object Qcompat;
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.
if ( (name_str[0] != '=') || (name_str[1] == '>') )
{
- Lisp_Object ancestors
- = Fget_char_attribute (character, Q_identical, Qnil);
-
- if (NILP (ancestors))
- 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;
EQ (attribute, Q_denotational_from) ||
EQ (attribute, Q_identical) ||
EQ (attribute, Q_identical_from) ||
- !NILP (Fstring_match (build_string ("^<-simplified[^*]*$"),
- Fsymbol_name (attribute),
- Qnil, Qnil)) )
+ EQ (attribute, Q_component) ||
+ EQ (attribute, Q_component_of) ||
+ !NILP (Fstring_match
+ (build_string ("^\\(<-\\|->\\)\\(simplified"
+ "\\|same\\|vulgar\\|wrong"
+ "\\|original"
+ "\\)[^*]*$"),
+ Fsymbol_name (attribute),
+ Qnil, Qnil)) )
{
Lisp_Object rest = value;
Lisp_Object ret;
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
{
Lisp_String* name = symbol_name (XSYMBOL (attribute));
Bufbyte *name_str = string_data (name);
- if (name_str[0] == '<' && name_str[1] == '-')
+ if ( (name_str[0] == '<' && name_str[1] == '-') ||
+ (name_str[0] == '-' && name_str[1] == '>') )
{
Bytecount length = string_length (name);
Bufbyte *rev_name_str = alloca (length + 1);
memcpy (rev_name_str + 2, name_str + 2, length - 2);
- rev_name_str[0] = '-';
- rev_name_str[1] = '>';
+ if (name_str[0] == '<')
+ {
+ rev_name_str[0] = '-';
+ rev_name_str[1] = '>';
+ }
+ else
+ {
+ rev_name_str[0] = '<';
+ rev_name_str[1] = '-';
+ }
rev_name_str[length] = 0;
rev_feature = intern (rev_name_str);
}
if (!CONSP (ffv))
put_char_attribute (ret, rev_feature, list1 (character));
else if (NILP (Fmemq (character, ffv)))
- put_char_attribute (ret, rev_feature,
- Fcons (character, ffv));
+ put_char_attribute
+ (ret, rev_feature,
+ nconc2 (Fcopy_sequence (ffv), list1 (character)));
Fsetcar (rest, ret);
}
rest = XCDR (rest);
|| EQ (attribute, Q_identical)
|| EQ (attribute, Q_identical_from)
|| !NILP (Fstring_match
- (build_string ("^\\(<-\\|->\\)simplified[^*]*$"),
+ (build_string ("^\\(<-\\|->\\)\\(simplified"
+ "\\|same\\|vulgar\\|wrong"
+ "\\|original"
+ "\\)[^*]*$"),
Fsymbol_name (attribute),
Qnil, Qnil)) )
filter = &Fchar_refs_simplify_char_specs;
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_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 (&Qcomposition, "composition");
defsymbol (&Q_decomposition, "->decomposition");
defsymbol (&Qcompat, "compat");