X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fchar-ucs.h;h=7f40f2942fc8eb6d444900866f064cf55e8ed843;hb=2cbece6401b2279497293e6dc54cda607f49db2f;hp=63fdc8f3cfae22d8041ec65d041fdaf75757676f;hpb=f52a96980ed9280f8f906a20d4b899dc0b027644;p=chise%2Fxemacs-chise.git- diff --git a/src/char-ucs.h b/src/char-ucs.h index 63fdc8f..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_ @@ -28,41 +26,41 @@ Boston, MA 02111-1307, USA. */ #define CHAR_ASCII_P(ch) ((ch) <= 0x7F) -struct Lisp_Char_Byte_Table +struct Lisp_Byte_Table { struct lcrecord_header header; Lisp_Object property[256]; }; -typedef struct Lisp_Char_Byte_Table Lisp_Char_Byte_Table; - -DECLARE_LRECORD (char_byte_table, Lisp_Char_Byte_Table); -#define XCHAR_BYTE_TABLE(x) XRECORD (x, char_byte_table, Lisp_Char_Byte_Table) -#define XSETCHAR_BYTE_TABLE(x, p) XSETRECORD (x, p, char_byte_table) -#define CHAR_BYTE_TABLE_P(x) RECORDP (x, char_byte_table) -#define GC_CHAR_BYTE_TABLE_P(x) GC_RECORDP (x, char_byte_table) -/* #define CHECK_CHAR_BYTE_TABLE(x) CHECK_RECORD (x, char_byte_table) +typedef struct Lisp_Byte_Table Lisp_Byte_Table; + +DECLARE_LRECORD (byte_table, Lisp_Byte_Table); +#define XBYTE_TABLE(x) XRECORD (x, byte_table, Lisp_Byte_Table) +#define XSETBYTE_TABLE(x, p) XSETRECORD (x, p, byte_table) +#define BYTE_TABLE_P(x) RECORDP (x, byte_table) +#define GC_BYTE_TABLE_P(x) GC_RECORDP (x, byte_table) +/* #define CHECK_BYTE_TABLE(x) CHECK_RECORD (x, byte_table) char table entries should never escape to Lisp */ -struct Lisp_Char_Code_Table +struct Lisp_Char_ID_Table { struct lcrecord_header header; Lisp_Object table; }; -typedef struct Lisp_Char_Code_Table Lisp_Char_Code_Table; - -DECLARE_LRECORD (char_code_table, Lisp_Char_Code_Table); -#define XCHAR_CODE_TABLE(x) XRECORD (x, char_code_table, Lisp_Char_Code_Table) -#define XSETCHAR_CODE_TABLE(x, p) XSETRECORD (x, p, char_code_table) -#define CHAR_CODE_TABLE_P(x) RECORDP (x, char_code_table) -#define GC_CHAR_CODE_TABLE_P(x) GC_RECORDP (x, char_code_table) -/* #define CHECK_CHAR_CODE_TABLE(x) CHECK_RECORD (x, char_code_table) +typedef struct Lisp_Char_ID_Table Lisp_Char_ID_Table; + +DECLARE_LRECORD (char_id_table, Lisp_Char_ID_Table); +#define XCHAR_ID_TABLE(x) XRECORD (x, char_id_table, Lisp_Char_ID_Table) +#define XSETCHAR_ID_TABLE(x, p) XSETRECORD (x, p, char_id_table) +#define CHAR_ID_TABLE_P(x) RECORDP (x, char_id_table) +#define GC_CHAR_ID_TABLE_P(x) GC_RECORDP (x, char_id_table) +/* #define CHECK_CHAR_ID_TABLE(x) CHECK_RECORD (x, char_id_table) char table entries should never escape to Lisp */ -Lisp_Object get_char_code_table (Emchar ch, Lisp_Object table); +Lisp_Object get_char_id_table (Emchar ch, Lisp_Object table); extern Lisp_Object Vcharset_mojikyo; @@ -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_code_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_code_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 */