X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fchar-ucs.h;h=70bf735e1a99fc9cff2062a6018e5341a6ac540f;hb=3e6fb73124e10447539e204abcb9635d23186a52;hp=641734b259d99f4511eef2ff66e55533999701f3;hpb=3b31b789866d38b90c5589f6229b9bcc54aecf8e;p=chise%2Fxemacs-chise.git diff --git a/src/char-ucs.h b/src/char-ucs.h index 641734b..70bf735 100644 --- a/src/char-ucs.h +++ b/src/char-ucs.h @@ -45,24 +45,24 @@ DECLARE_LRECORD (byte_table, Lisp_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; @@ -278,9 +278,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 +332,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 +355,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,51 +534,50 @@ 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);