From 0de6b9b1086e3a55fb2bfb10fce8a3023c499ceb Mon Sep 17 00:00:00 2001 From: tomo Date: Wed, 24 Mar 2004 12:14:49 +0000 Subject: [PATCH] (find_char_feature_in_family): New function. (Fchar_feature): Use `find_char_feature_in_family' with `->identical', `<-subsumptive' and `<-denotational'. --- src/chartab.c | 77 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/src/chartab.c b/src/chartab.c index 1443f3f..1ce7474 100644 --- a/src/chartab.c +++ b/src/chartab.c @@ -3281,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. @@ -3331,38 +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_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; -- 1.7.10.4