X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fmule-charset.c;h=e58ff517495af50b43670802f9b8f228521d9900;hb=97ae0d9bcc1fdfcc040948ba9227b2a8be8e07eb;hp=c17dcba2c2da6568ba27f67984ae47a39a63ed22;hpb=c8db677c8739a82ce43293d09ebc2552089dee39;p=chise%2Fxemacs-chise.git- diff --git a/src/mule-charset.c b/src/mule-charset.c index c17dcba..e58ff51 100644 --- a/src/mule-charset.c +++ b/src/mule-charset.c @@ -423,10 +423,16 @@ put_char_id_table (Emchar ch, Lisp_Object value, Lisp_Object table) Lisp_Object Vcharacter_attribute_table; Lisp_Object Vcharacter_name_table; +Lisp_Object Vcharacter_ideographic_radical_table; +Lisp_Object Vcharacter_ideographic_strokes_table; +Lisp_Object Vcharacter_total_strokes_table; +Lisp_Object Vcharacter_decomposition_table; Lisp_Object Vcharacter_composition_table; Lisp_Object Vcharacter_variant_table; Lisp_Object Qname; +Lisp_Object Qideographic_radical, Qideographic_strokes; +Lisp_Object Qtotal_strokes; Lisp_Object Q_decomposition; Lisp_Object Qucs; Lisp_Object Q_ucs; @@ -551,9 +557,36 @@ Return the alist of attributes of CHARACTER. */ (character)) { + Lisp_Object alist, ret; + CHECK_CHAR (character); - return Fcopy_alist (get_char_id_table (XCHAR (character), - Vcharacter_attribute_table)); + alist = Fcopy_alist (get_char_id_table (XCHAR (character), + Vcharacter_attribute_table)); + + ret = get_char_id_table (XCHAR (character), Vcharacter_name_table); + if (!NILP (ret)) + alist = Fcons (Fcons (Qname, ret), alist); + + ret = get_char_id_table (XCHAR (character), + Vcharacter_ideographic_radical_table); + if (!NILP (ret)) + alist = Fcons (Fcons (Qideographic_radical, ret), alist); + + ret = get_char_id_table (XCHAR (character), + Vcharacter_ideographic_strokes_table); + if (!NILP (ret)) + alist = Fcons (Fcons (Qideographic_strokes, ret), alist); + + ret = get_char_id_table (XCHAR (character), Vcharacter_total_strokes_table); + if (!NILP (ret)) + alist = Fcons (Fcons (Qtotal_strokes, ret), alist); + + ret = get_char_id_table (XCHAR (character), + Vcharacter_decomposition_table); + if (!NILP (ret)) + alist = Fcons (Fcons (Q_decomposition, ret), alist); + + return alist; } DEFUN ("get-char-attribute", Fget_char_attribute, 2, 2, 0, /* @@ -577,6 +610,26 @@ Return the value of CHARACTER's ATTRIBUTE. { return get_char_id_table (XCHAR (character), Vcharacter_name_table); } + else if (EQ (attribute, Qideographic_radical)) + { + return get_char_id_table (XCHAR (character), + Vcharacter_ideographic_radical_table); + } + else if (EQ (attribute, Qideographic_strokes)) + { + return get_char_id_table (XCHAR (character), + Vcharacter_ideographic_strokes_table); + } + else if (EQ (attribute, Qtotal_strokes)) + { + return get_char_id_table (XCHAR (character), + Vcharacter_total_strokes_table); + } + else if (EQ (attribute, Q_decomposition)) + { + return get_char_id_table (XCHAR (character), + Vcharacter_decomposition_table); + } else { Lisp_Object ret @@ -608,8 +661,31 @@ Store CHARACTER's ATTRIBUTE with VALUE. put_char_id_table (XCHAR (character), value, Vcharacter_name_table); return value; } + else if (EQ (attribute, Qideographic_radical)) + { + CHECK_INT (value); + put_char_id_table (XCHAR (character), value, + Vcharacter_ideographic_radical_table); + return value; + } + else if (EQ (attribute, Qideographic_strokes)) + { + CHECK_INT (value); + put_char_id_table (XCHAR (character), value, + Vcharacter_ideographic_strokes_table); + return value; + } + else if (EQ (attribute, Qtotal_strokes)) + { + CHECK_INT (value); + put_char_id_table (XCHAR (character), value, + Vcharacter_total_strokes_table); + return value; + } else if (EQ (attribute, Q_decomposition)) { + Lisp_Object seq; + if (!CONSP (value)) signal_simple_error ("Invalid value for ->decomposition", value); @@ -618,6 +694,11 @@ Store CHARACTER's ATTRIBUTE with VALUE. { Lisp_Object rest = value; Lisp_Object table = Vcharacter_composition_table; + size_t len; + int i = 0; + + GET_EXTERNAL_LIST_LENGTH (rest, len); + seq = make_older_vector (len, Qnil); while (CONSP (rest)) { @@ -626,6 +707,10 @@ Store CHARACTER's ATTRIBUTE with VALUE. Emchar c = to_char_id (v, "Invalid value for ->decomposition", value); + if (c < 0) + XVECTOR_DATA(seq)[i++] = v; + else + XVECTOR_DATA(seq)[i++] = make_char (c); rest = Fcdr (rest); if (!CONSP (rest)) { @@ -661,7 +746,11 @@ Store CHARACTER's ATTRIBUTE with VALUE. Vcharacter_variant_table); } } + seq = make_older_vector (1, v); } + put_char_id_table (XCHAR (character), seq, + Vcharacter_decomposition_table); + return value; } else if (EQ (attribute, Q_ucs)) { @@ -2938,6 +3027,9 @@ syms_of_mule_charset (void) defsymbol (&Qchinese_cns11643_2, "chinese-cns11643-2"); #ifdef UTF2000 defsymbol (&Qname, "name"); + defsymbol (&Qideographic_radical, "ideographic-radical"); + defsymbol (&Qideographic_strokes, "ideographic-strokes"); + defsymbol (&Qtotal_strokes, "total-strokes"); defsymbol (&Q_ucs, "->ucs"); defsymbol (&Q_decomposition, "->decomposition"); defsymbol (&Qcompat, "compat"); @@ -3050,6 +3142,18 @@ Version number of UTF-2000. staticpro (&Vcharacter_name_table); Vcharacter_name_table = make_char_id_table (Qnil, 0); + /* staticpro (&Vcharacter_ideographic_radical_table); */ + Vcharacter_ideographic_radical_table = make_char_id_table (Qnil, -1); + + /* staticpro (&Vcharacter_ideographic_strokes_table); */ + Vcharacter_ideographic_strokes_table = make_char_id_table (Qnil, -1); + + /* staticpro (&Vcharacter_total_strokes_table); */ + Vcharacter_total_strokes_table = make_char_id_table (Qnil, -1); + + /* staticpro (&Vcharacter_decomposition_table); */ + Vcharacter_decomposition_table = make_char_id_table (Qnil, -1); + /* staticpro (&Vcharacter_composition_table); */ Vcharacter_composition_table = make_char_id_table (Qnil, -1);