X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fchar-ucs.h;h=7f40f2942fc8eb6d444900866f064cf55e8ed843;hb=2cbece6401b2279497293e6dc54cda607f49db2f;hp=9829e9520024096ac111807db31f9c3ea811e6fd;hpb=19f8a8f609ea10f8eb8af4fd14fa103a3533d4e8;p=chise%2Fxemacs-chise.git- diff --git a/src/char-ucs.h b/src/char-ucs.h index 9829e95..7f40f29 100644 --- a/src/char-ucs.h +++ b/src/char-ucs.h @@ -18,8 +18,6 @@ along with XEmacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* Rewritten by MORIOKA Tomohiko . */ - #ifndef INCLUDED_char_ucs_h_ #define INCLUDED_char_ucs_h_ @@ -73,7 +71,7 @@ extern Lisp_Object Vcharset_latin_jisx0201; /* Definition of leading bytes */ /************************************************************************/ -typedef int Charset_ID; +typedef short Charset_ID; #define MIN_LEADING_BYTE -0x60 #define CHARSET_ID_OFFSET 0x00 @@ -278,9 +276,12 @@ struct Lisp_Charset /* Which half of font to be used to display this character set */ unsigned int graphic; - /* Byte->character mapping table */ + /* Code-point->character mapping table */ Lisp_Object decoding_table; + /* Character->code-point mapping table */ + Lisp_Object encoding_table; + /* Range of character code */ Emchar ucs_min, ucs_max; @@ -329,6 +330,7 @@ DECLARE_LRECORD (charset, Lisp_Charset); #define CHARSET_CHARS(cs) ((cs)->chars) #define CHARSET_REVERSE_DIRECTION_CHARSET(cs) ((cs)->reverse_direction_charset) #define CHARSET_DECODING_TABLE(cs) ((cs)->decoding_table) +#define CHARSET_ENCODING_TABLE(cs) ((cs)->encoding_table) #define CHARSET_UCS_MIN(cs) ((cs)->ucs_min) #define CHARSET_UCS_MAX(cs) ((cs)->ucs_max) #define CHARSET_CODE_OFFSET(cs) ((cs)->code_offset) @@ -351,6 +353,7 @@ DECLARE_LRECORD (charset, Lisp_Charset); #define XCHARSET_REVERSE_DIRECTION_CHARSET(cs) \ CHARSET_REVERSE_DIRECTION_CHARSET (XCHARSET (cs)) #define XCHARSET_DECODING_TABLE(cs) CHARSET_DECODING_TABLE(XCHARSET(cs)) +#define XCHARSET_ENCODING_TABLE(cs) CHARSET_ENCODING_TABLE(XCHARSET(cs)) #define XCHARSET_UCS_MIN(cs) CHARSET_UCS_MIN(XCHARSET(cs)) #define XCHARSET_UCS_MAX(cs) CHARSET_UCS_MAX(XCHARSET(cs)) #define XCHARSET_CODE_OFFSET(cs) CHARSET_CODE_OFFSET(XCHARSET(cs)) @@ -529,87 +532,60 @@ INLINE_HEADER int charset_code_point (Lisp_Object charset, Emchar ch); INLINE_HEADER int charset_code_point (Lisp_Object charset, Emchar ch) { - Lisp_Object cdef = get_char_id_table (ch, Vcharacter_attribute_table); - - if (!NILP (cdef)) - { - Lisp_Object field = Fassq (charset, cdef); + Lisp_Object encoding_table = XCHARSET_ENCODING_TABLE (charset); + Lisp_Object ret; - if (!NILP (field)) - return XINT (Fcdr (field)); - } - return range_charset_code_point (charset, ch); + if ( CHAR_ID_TABLE_P (encoding_table) + && INTP (ret = get_char_id_table (ch, encoding_table)) ) + return XINT (ret); + else + return range_charset_code_point (charset, ch); } extern Lisp_Object Vdefault_coded_charset_priority_list; EXFUN (Ffind_charset, 1); -INLINE_HEADER int encode_char_1 (Emchar c, Lisp_Object* charset); +INLINE_HEADER int encode_char_1 (Emchar ch, Lisp_Object* charset); INLINE_HEADER int -encode_char_1 (Emchar c, Lisp_Object* charset) +encode_char_1 (Emchar ch, Lisp_Object* charset) { - Lisp_Object cdef = get_char_id_table (c, Vcharacter_attribute_table); + Lisp_Object charsets = Vdefault_coded_charset_priority_list; - if (!EQ (cdef, Qnil)) + while (!NILP (charsets)) { - Lisp_Object charsets = Vdefault_coded_charset_priority_list; - Lisp_Object field; - - while (!EQ (charsets, Qnil)) + *charset = Ffind_charset (Fcar (charsets)); + if (!NILP (*charset)) { - *charset = Ffind_charset (Fcar (charsets)); - if (!EQ (*charset, Qnil)) + Lisp_Object encoding_table = XCHARSET_ENCODING_TABLE (*charset); + Lisp_Object ret; + + if ( CHAR_ID_TABLE_P (encoding_table) + && INTP (ret = get_char_id_table (ch, encoding_table)) ) + return XINT (ret); + else { int code_point; - if (!NILP (field = Fassq (*charset, cdef))) - return XINT (Fcdr (field)); - else if ((code_point - = range_charset_code_point (*charset, c)) >= 0) + if ((code_point + = range_charset_code_point (*charset, ch)) >= 0) return code_point; } - charsets = Fcdr (charsets); } + charsets = Fcdr (charsets); } /* otherwise --- maybe for bootstrap */ - return encode_builtin_char_1 (c, charset); + return encode_builtin_char_1 (ch, charset); } -INLINE_HEADER int encode_char_2 (Emchar ch, Lisp_Object* charset); -INLINE_HEADER int -encode_char_2 (Emchar ch, Lisp_Object* charset) -{ - int code_point = encode_char_1 (ch, charset); - - if (EQ (*charset, Vcharset_mojikyo)) - { - int plane, byte1, byte2; - - code_point--; - plane = code_point / (94 * 60); - byte1 = (code_point % (94 * 60)) / 94; - if (byte1 < 30) - byte1 += 16 + 32; - else - byte1 += 18 + 32; - byte2 = code_point % 94 + 33; - *charset - = CHARSET_BY_LEADING_BYTE (LEADING_BYTE_MOJIKYO_PJ_1 - plane); - return (byte1 << 8) | byte2; - } - else - return code_point; -} - -#define ENCODE_CHAR(ch, charset) encode_char_2 (ch, &(charset)) +#define ENCODE_CHAR(ch, charset) encode_char_1 (ch, &(charset)) INLINE_HEADER void breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2); INLINE_HEADER void breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2) { - int code_point = encode_char_2 (c, charset); + int code_point = encode_char_1 (c, charset); if (code_point >= 0) { @@ -647,6 +623,39 @@ CHAR_CHARSET (Emchar ch) #define CHAR_CHARSET_ID(c) (XCHARSET_ID(CHAR_CHARSET(c))) #define CHAR_COLUMNS(c) (CHARSET_COLUMNS(XCHARSET(CHAR_CHARSET(c)))) + +typedef struct Charc +{ + Lisp_Object charset; + int code_point; +} Charc; + +INLINE_HEADER Charc CHAR_TO_CHARC (Emchar ch); +INLINE_HEADER Charc +CHAR_TO_CHARC (Emchar ch) +{ + Charc cc; + + cc.code_point = encode_char_1 (ch, &cc.charset); + if (EQ (cc.charset, Vcharset_mojikyo)) + { + int plane, byte1, byte2; + + cc.code_point--; + plane = cc.code_point / (94 * 60); + byte1 = (cc.code_point % (94 * 60)) / 94; + if (byte1 < 30) + byte1 += 16 + 32; + else + byte1 += 18 + 32; + byte2 = cc.code_point % 94 + 33; + cc.charset + = CHARSET_BY_LEADING_BYTE (LEADING_BYTE_MOJIKYO_PJ_1 - plane); + cc.code_point = (byte1 << 8) | byte2; + } + return cc; +} + /************************************************************************/ /* Exported functions */