X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fmule-charset.c;h=2db3cbcebfc59250dcea85a408b636e6f39276be;hb=975655e6b5b1526ee82b159b3eadf69888c42090;hp=5c9d019586b30d6fcabd66fabef569931319fe8e;hpb=13aacc9bac827f73300c925094de2322d9214bb2;p=chise%2Fxemacs-chise.git- diff --git a/src/mule-charset.c b/src/mule-charset.c index 5c9d019..2db3cbc 100644 --- a/src/mule-charset.c +++ b/src/mule-charset.c @@ -422,18 +422,9 @@ put_char_id_table (Emchar ch, Lisp_Object value, Lisp_Object table) Lisp_Object Vchar_attribute_hash_table; -Lisp_Object Vcharacter_ideographic_radical_table; -Lisp_Object Vcharacter_ideographic_strokes_table; -Lisp_Object Vcharacter_total_strokes_table; -Lisp_Object Vcharacter_morohashi_daikanwa_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 Qmorohashi_daikanwa; Lisp_Object Qideograph_daikanwa; Lisp_Object Q_decomposition; Lisp_Object Qucs; @@ -549,6 +540,47 @@ Return variants of CHARACTER. } +/* We store the char-attributes in hash tables with the names as the + key and the actual char-id-table object as the value. Occasionally + we need to use them in a list format. These routines provide us + with that. */ +struct char_attribute_list_closure +{ + Lisp_Object *char_attribute_list; +}; + +static int +add_char_attribute_to_list_mapper (Lisp_Object key, Lisp_Object value, + void *char_attribute_list_closure) +{ + /* This function can GC */ + struct char_attribute_list_closure *calcl + = (struct char_attribute_list_closure*) char_attribute_list_closure; + Lisp_Object *char_attribute_list = calcl->char_attribute_list; + + *char_attribute_list = Fcons (key, *char_attribute_list); + return 0; +} + +DEFUN ("char-attribute-list", Fchar_attribute_list, 0, 0, 0, /* +Return the list of all existing character attributes except coded-charsets. +*/ + ()) +{ + Lisp_Object char_attribute_list = Qnil; + struct gcpro gcpro1; + struct char_attribute_list_closure char_attribute_list_closure; + + GCPRO1 (char_attribute_list); + char_attribute_list_closure.char_attribute_list = &char_attribute_list; + elisp_maphash (add_char_attribute_to_list_mapper, + Vchar_attribute_hash_table, + &char_attribute_list_closure); + UNGCPRO; + return char_attribute_list; +} + + /* We store the char-id-tables in hash tables with the attributes as the key and the actual char-id-table object as the value. Each char-id-table stores values of an attribute corresponding with @@ -584,7 +616,6 @@ Return the alist of attributes of CHARACTER. (character)) { Lisp_Object alist = Qnil; - Lisp_Object ret; int i; CHECK_CHAR (character); @@ -600,29 +631,6 @@ Return the alist of attributes of CHARACTER. &char_attribute_alist_closure); UNGCPRO; } - 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_morohashi_daikanwa_table); - if (!NILP (ret)) - alist = Fcons (Fcons (Qmorohashi_daikanwa, ret), alist); - - ret = get_char_id_table (XCHAR (character), - Vcharacter_decomposition_table); - if (!NILP (ret)) - alist = Fcons (Fcons (Q_decomposition, ret), alist); for (i = 0; i < countof (chlook->charset_by_leading_byte); i++) { @@ -630,14 +638,6 @@ Return the alist of attributes of CHARACTER. if (!NILP (ccs)) { -#if 0 - int code_point = charset_code_point (ccs, XCHAR (character)); - - if (code_point >= 0) - { - alist = Fcons (Fcons (ccs, make_int (code_point)), alist); - } -#else Lisp_Object encoding_table = XCHARSET_ENCODING_TABLE (ccs); Lisp_Object cpos; @@ -647,7 +647,6 @@ Return the alist of attributes of CHARACTER. { alist = Fcons (Fcons (ccs, cpos), alist); } -#endif } } return alist; @@ -670,31 +669,6 @@ Return the value of CHARACTER's ATTRIBUTE. else return Qnil; } - 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, Qmorohashi_daikanwa)) - { - return get_char_id_table (XCHAR (character), - Vcharacter_morohashi_daikanwa_table); - } - else if (EQ (attribute, Q_decomposition)) - { - return get_char_id_table (XCHAR (character), - Vcharacter_decomposition_table); - } else { Lisp_Object table = Fgethash (attribute, @@ -723,34 +697,6 @@ Store CHARACTER's ATTRIBUTE with VALUE. { return put_char_ccs_code_point (character, ccs, 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, Qmorohashi_daikanwa)) - { - CHECK_LIST (value); - put_char_id_table (XCHAR (character), value, - Vcharacter_morohashi_daikanwa_table); - return value; - } else if (EQ (attribute, Q_decomposition)) { Lisp_Object seq; @@ -767,7 +713,7 @@ Store CHARACTER's ATTRIBUTE with VALUE. int i = 0; GET_EXTERNAL_LIST_LENGTH (rest, len); - seq = make_older_vector (len, Qnil); + seq = make_vector (len, Qnil); while (CONSP (rest)) { @@ -815,11 +761,9 @@ Store CHARACTER's ATTRIBUTE with VALUE. Vcharacter_variant_table); } } - seq = make_older_vector (1, v); + seq = make_vector (1, v); } - put_char_id_table (XCHAR (character), seq, - Vcharacter_decomposition_table); - return value; + value = seq; } else if (EQ (attribute, Q_ucs)) { @@ -1092,7 +1036,9 @@ Store character's ATTRIBUTES. Lisp_Object rest = attributes; Lisp_Object code = Fcdr (Fassq (Qucs, attributes)); Lisp_Object character; +#if 0 Lisp_Object daikanwa = Qnil; +#endif if (NILP (code)) { @@ -1136,12 +1082,15 @@ Store character's ATTRIBUTES. while (CONSP (rest)) { Lisp_Object cell = Fcar (rest); +#if 0 Lisp_Object key = Fcar (cell); Lisp_Object value = Fcdr (cell); +#endif if (!LISTP (cell)) signal_simple_error ("Invalid argument", attributes); +#if 0 if (EQ (key, Qmorohashi_daikanwa)) { size_t len; @@ -1157,9 +1106,12 @@ Store character's ATTRIBUTES. } else if (EQ (key, Qideograph_daikanwa)) daikanwa = value; +#endif Fput_char_attribute (character, Fcar (cell), Fcdr (cell)); +#if 0 ignored: +#endif rest = Fcdr (rest); } return character; @@ -2689,6 +2641,8 @@ Set mapping-table of CHARSET to TABLE. if (NILP (table)) { + if (VECTORP (CHARSET_DECODING_TABLE(cs))) + make_vector_newer (CHARSET_DECODING_TABLE(cs)); CHARSET_DECODING_TABLE(cs) = Qnil; return table; } @@ -2778,6 +2732,77 @@ Make a character from CHARSET and code-point CODE. c &= 0x7F7F7F7F; return make_char (DECODE_CHAR (charset, c)); } + +DEFUN ("decode-builtin-char", Fdecode_builtin_char, 2, 2, 0, /* +Make a builtin character from CHARSET and code-point CODE. +*/ + (charset, code)) +{ + int c; + int final; + + charset = Fget_charset (charset); + CHECK_INT (code); + c = XINT (code); + + if ((final = XCHARSET_FINAL (charset)) >= '0') + { + if (XCHARSET_DIMENSION (charset) == 1) + { + switch (XCHARSET_CHARS (charset)) + { + case 94: + return + make_char (MIN_CHAR_94 + (final - '0') * 94 + + ((c & 0x7F) - 33)); + case 96: + return + make_char (MIN_CHAR_96 + (final - '0') * 96 + + ((c & 0x7F) - 32)); + default: + return Fdecode_char (charset, code); + } + } + else + { + switch (XCHARSET_CHARS (charset)) + { + case 94: + return + make_char (MIN_CHAR_94x94 + + (final - '0') * 94 * 94 + + (((c >> 8) & 0x7F) - 33) * 94 + + ((c & 0x7F) - 33)); + case 96: + return + make_char (MIN_CHAR_96x96 + + (final - '0') * 96 * 96 + + (((c >> 8) & 0x7F) - 32) * 96 + + ((c & 0x7F) - 32)); + default: + return Fdecode_char (charset, code); + } + } + } + else if (XCHARSET_UCS_MAX (charset)) + { + Emchar cid + = (XCHARSET_DIMENSION (charset) == 1 + ? + c - XCHARSET_BYTE_OFFSET (charset) + : + ((c >> 8) - XCHARSET_BYTE_OFFSET (charset)) + * XCHARSET_CHARS (charset) + + (c & 0xFF) - XCHARSET_BYTE_OFFSET (charset)) + - XCHARSET_CODE_OFFSET (charset) + XCHARSET_UCS_MIN (charset); + if ((cid < XCHARSET_UCS_MIN (charset)) + || (XCHARSET_UCS_MAX (charset) < cid)) + return Fdecode_char (charset, code); + return make_char (cid); + } + else + return Fdecode_char (charset, code); +} #endif DEFUN ("make-char", Fmake_char, 2, 3, 0, /* @@ -3024,6 +3049,7 @@ syms_of_mule_charset (void) DEFSUBR (Fset_charset_ccl_program); DEFSUBR (Fset_charset_registry); #ifdef UTF2000 + DEFSUBR (Fchar_attribute_list); DEFSUBR (Fchar_attribute_alist); DEFSUBR (Fget_char_attribute); DEFSUBR (Fput_char_attribute); @@ -3037,6 +3063,7 @@ syms_of_mule_charset (void) #ifdef UTF2000 DEFSUBR (Fdecode_char); + DEFSUBR (Fdecode_builtin_char); #endif DEFSUBR (Fmake_char); DEFSUBR (Fchar_charset); @@ -3085,11 +3112,6 @@ syms_of_mule_charset (void) defsymbol (&Qchinese_cns11643_1, "chinese-cns11643-1"); 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 (&Qmorohashi_daikanwa, "morohashi-daikanwa"); defsymbol (&Q_ucs, "->ucs"); defsymbol (&Q_decomposition, "->decomposition"); defsymbol (&Qcompat, "compat"); @@ -3196,22 +3218,7 @@ Leading-code of private TYPE9N charset of column-width 1. Version number of UTF-2000. */ ); - /* 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_morohashi_daikanwa_table); - Vcharacter_morohashi_daikanwa_table = make_char_id_table (Qnil, 0); - - /* staticpro (&Vcharacter_decomposition_table); */ - Vcharacter_decomposition_table = make_char_id_table (Qnil, -1); - - /* staticpro (&Vcharacter_composition_table); */ + staticpro (&Vcharacter_composition_table); Vcharacter_composition_table = make_char_id_table (Qnil, -1); staticpro (&Vcharacter_variant_table);