X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fchartab.c;h=ba0083dd7cc84351627c1a15730b28384c5291da;hb=faf9d7ae7d5a6fab8837769b1ac9e91247756f83;hp=22313a14ebd621b0c2506edba8d2c90adbfd41e8;hpb=d87e6307f03d869d899c447fd0c00495e6d80749;p=chise%2Fxemacs-chise.git- diff --git a/src/chartab.c b/src/chartab.c index 22313a1..ba0083d 100644 --- a/src/chartab.c +++ b/src/chartab.c @@ -4,7 +4,8 @@ Copyright (C) 1995, 1996 Ben Wing. Copyright (C) 1995, 1997, 1999 Electrotechnical Laboratory, JAPAN. Licensed to the Free Software Foundation. - Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006 MORIOKA Tomohiko + Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, + 2010, 2011, 2012 MORIOKA Tomohiko This file is part of XEmacs. @@ -99,7 +100,7 @@ Lisp_Object Vchar_db_stingy_mode; INLINE_HEADER int INT_UINT8_P (Lisp_Object obj); INLINE_HEADER int UINT8_VALUE_P (Lisp_Object obj); INLINE_HEADER unsigned char UINT8_ENCODE (Lisp_Object obj); -INLINE_HEADER Lisp_Object UINT8_DECODE (unsigned char n); +/* INLINE_HEADER */ Lisp_Object UINT8_DECODE (unsigned char n); INLINE_HEADER unsigned short UINT8_TO_UINT16 (unsigned char n); INLINE_HEADER int @@ -137,7 +138,7 @@ UINT8_ENCODE (Lisp_Object obj) return XINT (obj); } -INLINE_HEADER Lisp_Object +/* INLINE_HEADER */ Lisp_Object UINT8_DECODE (unsigned char n) { if (n == BT_UINT8_unloaded) @@ -354,7 +355,7 @@ save_uint8_byte_table (Lisp_Uint8_Byte_Table *ct, Lisp_Char_Table* root, { if (ct->property[i] == BT_UINT8_unloaded) { - c1 = c + unit; + c += unit; } else if (ct->property[i] != BT_UINT8_unbound) { @@ -391,7 +392,7 @@ save_uint8_byte_table (Lisp_Uint8_Byte_Table *ct, Lisp_Char_Table* root, INLINE_HEADER int INT_UINT16_P (Lisp_Object obj); INLINE_HEADER int UINT16_VALUE_P (Lisp_Object obj); INLINE_HEADER unsigned short UINT16_ENCODE (Lisp_Object obj); -INLINE_HEADER Lisp_Object UINT16_DECODE (unsigned short us); +/* INLINE_HEADER */ Lisp_Object UINT16_DECODE (unsigned short us); INLINE_HEADER int INT_UINT16_P (Lisp_Object obj) @@ -428,7 +429,7 @@ UINT16_ENCODE (Lisp_Object obj) return XINT (obj); } -INLINE_HEADER Lisp_Object +/* INLINE_HEADER */ Lisp_Object UINT16_DECODE (unsigned short n) { if (n == BT_UINT16_unloaded) @@ -678,7 +679,7 @@ save_uint16_byte_table (Lisp_Uint16_Byte_Table *ct, Lisp_Char_Table* root, { if (ct->property[i] == BT_UINT16_unloaded) { - c1 = c + unit; + c += unit; } else if (ct->property[i] != BT_UINT16_unbound) { @@ -1130,7 +1131,7 @@ make_char_id_table (Lisp_Object initval) Lisp_Object Qcomposition; -Lisp_Object Qmap_decomposition; +Lisp_Object Qrep_decomposition; Lisp_Object Qto_decomposition_at_superscript; Lisp_Object Qto_decomposition_at_circled; Lisp_Object Q_canonical; @@ -3269,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. @@ -3496,7 +3534,7 @@ put_char_composition (Lisp_Object character, Lisp_Object value) } #endif } - return Qmap_decomposition; + return Qrep_decomposition; } static Lisp_Object @@ -3530,17 +3568,35 @@ Store CHARACTER's ATTRIBUTE with VALUE. if (!NILP (ccs)) { - value = put_char_ccs_code_point (character, ccs, value); + if ( !NILP (value) ) + value = put_char_ccs_code_point (character, ccs, value); attribute = XCHARSET_NAME (ccs); } - else if ( EQ (attribute, Qmap_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; + value = Fcopy_sequence (Fchar_refs_simplify_char_specs (value)); - attribute = put_char_composition (character, value); - if ( !EQ (attribute, Qmap_decomposition) && + ret = put_char_composition (character, value); + if ( !EQ (ret, Qrep_decomposition) && SYMBOLP (XCAR (value)) ) - value = XCDR (value); + { + attribute = ret; + value = XCDR (value); + } } else if (EQ (attribute, Qto_ucs)) { @@ -4232,13 +4288,27 @@ implementation does not coalesce ranges all of whose values are the same. return slarg.retval; } +static Lisp_Object +allocate_character () +{ + int cid = XINT (Vnext_defined_char_id); + + if (cid <= 0xE00000) + { + Vnext_defined_char_id = make_int (cid + 1); + return make_char (cid); + } + else + return Qnil; +} + DEFUN ("define-char", Fdefine_char, 1, 1, 0, /* Store character's ATTRIBUTES. */ (attributes)) { Lisp_Object rest; - Lisp_Object code = Fcdr (Fassq (Qmap_ucs, attributes)); + Lisp_Object code = Fcdr (Fassq (Qrep_ucs, attributes)); Lisp_Object character; if (NILP (code)) @@ -4280,7 +4350,7 @@ Store character's ATTRIBUTES. } rest = Fcdr (rest); } -#if 1 +#if 0 { int cid = XINT (Vnext_defined_char_id); @@ -4292,16 +4362,9 @@ Store character's ATTRIBUTES. } } #else - if ( (!NILP (code = Fcdr (Fassq (Qto_ucs, attributes)))) ) - { - if (!INTP (code)) - signal_simple_error ("Invalid argument", attributes); - else - character = make_char (XINT (code) + 0x100000); - goto setup_attributes; - } + if ( NILP (character = allocate_character ()) ) #endif - return Qnil; + return Qnil; } else if (!INTP (code)) signal_simple_error ("Invalid argument", attributes); @@ -4362,6 +4425,62 @@ Retrieve the character of the given ATTRIBUTES. /************************************************************************/ +/* Character Feature Property */ +/************************************************************************/ + +#ifdef HAVE_LIBCHISE +DEFUN ("char-feature-property", Fchar_feature_property, 2, 3, 0, /* +Return the value of FEATURE's PROPERTY. +Return DEFAULT-VALUE if the value is not exist. +*/ + (feature, property, default_value)) +{ + unsigned char* feature_name; + unsigned char* property_name; + CHISE_Value value; + int status; + + feature_name = XSTRING_DATA (Fsymbol_name (feature)); + property_name = XSTRING_DATA (Fsymbol_name (property)); + status + = chise_feature_load_property_value (chise_ds_get_feature + (default_chise_data_source, + feature_name), + chise_ds_get_property + (default_chise_data_source, + property_name), + &value); + if (!status) + return read_from_c_string (chise_value_data (&value), + chise_value_size (&value) ); + else + return default_value; +} + +DEFUN ("put-char-feature-property", Fput_char_feature_property, 3, 3, 0, /* +Store FEATURE's PROPERTY with VALUE. +*/ + (feature, property, value)) +{ + unsigned char* feature_name; + unsigned char* property_name; + CHISE_Property prop; + + feature_name = XSTRING_DATA (Fsymbol_name (feature)); + property_name = XSTRING_DATA (Fsymbol_name (property)); + prop = chise_ds_get_property (default_chise_data_source, + property_name); + chise_feature_set_property_value + (chise_ds_get_feature (default_chise_data_source, feature_name), + prop, XSTRING_DATA (Fprin1_to_string + (value, Qnil))); + chise_property_sync (prop); + return Qnil; +} +#endif + + +/************************************************************************/ /* Char table read syntax */ /************************************************************************/ @@ -4717,7 +4836,7 @@ syms_of_chartab (void) defsymbol (&Q_component, "->ideographic-component-forms"); defsymbol (&Q_component_of, "<-ideographic-component-forms"); defsymbol (&Qcomposition, "composition"); - defsymbol (&Qmap_decomposition, "=decomposition"); + defsymbol (&Qrep_decomposition, "=decomposition"); defsymbol (&Qto_decomposition_at_superscript, "=>decomposition@superscript"); defsymbol (&Qto_decomposition_at_circled, "=>decomposition@circled"); @@ -4761,6 +4880,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); @@ -4772,6 +4892,10 @@ syms_of_chartab (void) DEFSUBR (Fchar_variants); DEFSUBR (Fget_composite_char); +#ifdef HAVE_LIBCHISE + DEFSUBR (Fchar_feature_property); + DEFSUBR (Fput_char_feature_property); +#endif /* HAVE_LIBCHISE */ #endif INIT_LRECORD_IMPLEMENTATION (char_table);