(Fchar_feature_base_name_eq): New function when UTF2000 is enabled.
authortomo <tomo>
Wed, 16 Mar 2011 12:03:30 +0000 (12:03 +0000)
committertomo <tomo>
Wed, 16 Mar 2011 12:03:30 +0000 (12:03 +0000)
(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

index 748cd29..b97f39d 100644 (file)
@@ -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);