From eaeec525cfb6e8d422f408ff2f3bcb8702a8cf29 Mon Sep 17 00:00:00 2001 From: tomo Date: Wed, 16 Mar 2011 12:03:30 +0000 Subject: [PATCH] (Fchar_feature_base_name_eq): New function when UTF2000 is enabled. (Fput_char_attribute): Use `Fchar_feature_base_name_eq'. (syms_of_chartab): Add new builtin function `char-feature-base-name=' when UTF2000 is enabled. --- src/chartab.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/chartab.c b/src/chartab.c index 748cd29..b97f39d 100644 --- a/src/chartab.c +++ b/src/chartab.c @@ -3270,6 +3270,43 @@ Return the alist of attributes of CHARACTER. return alist; } +DEFUN ("char-feature-base-name=", Fchar_feature_base_name_eq, 2, 2, 0, /* +Return the alist of attributes of CHARACTER. +*/ + (base_name, feature_name)) +{ + Lisp_String *bn, *fn; + Bytecount len_bn, len_fn, i; + Bufbyte *ptr_bn, *ptr_fn; + + CHECK_SYMBOL (base_name); + CHECK_SYMBOL (feature_name); + + bn = XSYMBOL (base_name)->name; + fn = XSYMBOL (feature_name)->name; + len_bn = string_length (bn); + len_fn = string_length (fn); + + if ( len_bn > len_fn ) + return Qnil; + + ptr_bn = string_data (bn); + ptr_fn = string_data (fn); + for ( i = len_fn - 1; i >= 0; i-- ) + { + if ( ptr_fn[i] == '*' ) + return Qnil; + if ( ptr_fn[i] == '@' ) + break; + } + if ( i < 0 ) + i = len_fn; + if ( (len_bn == i) && (memcmp (ptr_bn, ptr_fn, len_bn) == 0) ) + return Qt; + else + return Qnil; +} + DEFUN ("get-char-attribute", Fget_char_attribute, 2, 3, 0, /* Return the value of CHARACTER's ATTRIBUTE. Return DEFAULT-VALUE if the value is not exist. @@ -3534,11 +3571,19 @@ Store CHARACTER's ATTRIBUTE with VALUE. value = put_char_ccs_code_point (character, ccs, value); attribute = XCHARSET_NAME (ccs); } - else if ( EQ (attribute, Qrep_decomposition) || - EQ (attribute, Q_decomposition) || + else if ( +#if 0 + EQ (attribute, Qrep_decomposition) || +#else + !NILP (Fchar_feature_base_name_eq (Qrep_decomposition, + attribute)) || +#endif + EQ (attribute, Q_decomposition) /* || */ +#if 0 !NILP (Fstring_match (build_string ("^=decomposition@[^*]+$"), Fsymbol_name (attribute), Qnil, Qnil)) +#endif ) { Lisp_Object ret; @@ -4834,6 +4879,7 @@ syms_of_chartab (void) #endif DEFSUBR (Fload_char_attribute_table); #endif + DEFSUBR (Fchar_feature_base_name_eq); DEFSUBR (Fchar_feature); DEFSUBR (Fchar_attribute_alist); DEFSUBR (Fget_char_attribute); -- 1.7.10.4