X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fchar-ucs.h;h=7f40f2942fc8eb6d444900866f064cf55e8ed843;hb=2cbece6401b2279497293e6dc54cda607f49db2f;hp=20359c3c56e9f29fbca686bdff8e4fd84cbc271b;hpb=16254df8eb68fb2ecb1e8c0ac7ead9a301544af7;p=chise%2Fxemacs-chise.git- diff --git a/src/char-ucs.h b/src/char-ucs.h index 20359c3..7f40f29 100644 --- a/src/char-ucs.h +++ b/src/char-ucs.h @@ -18,50 +18,49 @@ 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 _XEMACS_CHAR_UCS_H -#define _XEMACS_CHAR_UCS_H +#ifndef INCLUDED_char_ucs_h_ +#define INCLUDED_char_ucs_h_ #define valid_char_p(ch) 1 #define CHAR_ASCII_P(ch) ((ch) <= 0x7F) -DECLARE_LRECORD (char_byte_table, struct Lisp_Char_Byte_Table); -#define XCHAR_BYTE_TABLE(x) \ - XRECORD (x, char_byte_table, struct 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) - char table entries should never escape to Lisp */ - -struct Lisp_Char_Byte_Table +struct Lisp_Byte_Table { struct lcrecord_header header; Lisp_Object property[256]; }; - - -DECLARE_LRECORD (char_code_table, struct Lisp_Char_Code_Table); -#define XCHAR_CODE_TABLE(x) \ - XRECORD (x, char_code_table, struct 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_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_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; @@ -72,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 @@ -249,7 +248,10 @@ struct Lisp_Charset int id; Lisp_Object name; - Lisp_Object doc_string, registry, short_name, long_name; + Lisp_Object doc_string; + Lisp_Object registry; + Lisp_Object short_name; + Lisp_Object long_name; Lisp_Object reverse_direction_charset; @@ -274,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; @@ -286,9 +291,10 @@ struct Lisp_Charset /* Offset for each byte */ Emchar byte_offset; }; +typedef struct Lisp_Charset Lisp_Charset; -DECLARE_LRECORD (charset, struct Lisp_Charset); -#define XCHARSET(x) XRECORD (x, charset, struct Lisp_Charset) +DECLARE_LRECORD (charset, Lisp_Charset); +#define XCHARSET(x) XRECORD (x, charset, Lisp_Charset) #define XSETCHARSET(x, p) XSETRECORD (x, p, charset) #define CHARSETP(x) RECORDP (x, charset) #define GC_CHARSETP(x) GC_RECORDP (x, charset) @@ -324,6 +330,7 @@ DECLARE_LRECORD (charset, struct 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) @@ -346,6 +353,7 @@ DECLARE_LRECORD (charset, struct 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)) @@ -357,6 +365,8 @@ struct charset_lookup { /* Table of charsets indexed by type/final-byte/direction. */ Lisp_Object charset_by_attributes[4][128]; + + Charset_ID next_allocated_leading_byte; }; extern struct charset_lookup *chlook; @@ -365,8 +375,8 @@ extern struct charset_lookup *chlook; /* int not Bufbyte even though that is the actual type of a leading byte. This way, out-ot-range values will get caught rather than automatically truncated. */ -INLINE Lisp_Object CHARSET_BY_LEADING_BYTE (Charset_ID lb); -INLINE Lisp_Object +INLINE_HEADER Lisp_Object CHARSET_BY_LEADING_BYTE (Charset_ID lb); +INLINE_HEADER Lisp_Object CHARSET_BY_LEADING_BYTE (Charset_ID lb) { assert (lb >= MIN_LEADING_BYTE && @@ -439,8 +449,8 @@ CHARSET_BY_LEADING_BYTE (Charset_ID lb) Emchar make_builtin_char (Lisp_Object charset, int c1, int c2); -INLINE Emchar DECODE_CHAR (Lisp_Object charset, int code_point); -INLINE Emchar +INLINE_HEADER Emchar DECODE_CHAR (Lisp_Object charset, int code_point); +INLINE_HEADER Emchar DECODE_CHAR (Lisp_Object charset, int code_point) { int dim = XCHARSET_DIMENSION (charset); @@ -503,8 +513,8 @@ DECODE_CHAR (Lisp_Object charset, int code_point) /* Return a character whose charset is CHARSET and position-codes are C1 and C2. TYPE9N character ignores C2. */ -INLINE Emchar MAKE_CHAR (Lisp_Object charset, int c1, int c2); -INLINE Emchar +INLINE_HEADER Emchar MAKE_CHAR (Lisp_Object charset, int c1, int c2); +INLINE_HEADER Emchar MAKE_CHAR (Lisp_Object charset, int c1, int c2) { if (XCHARSET_DIMENSION (charset) == 1) @@ -518,90 +528,64 @@ extern Lisp_Object Vcharacter_attribute_table; int encode_builtin_char_1 (Emchar c, Lisp_Object* charset); int range_charset_code_point (Lisp_Object charset, Emchar ch); -INLINE int charset_code_point (Lisp_Object charset, Emchar ch); -INLINE int +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 int encode_char_1 (Emchar c, Lisp_Object* charset); -INLINE 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 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); -} - -INLINE int encode_char_2 (Emchar ch, Lisp_Object* charset); -INLINE 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; + return encode_builtin_char_1 (ch, charset); } -#define ENCODE_CHAR(ch, charset) encode_char_2 (ch, &(charset)) +#define ENCODE_CHAR(ch, charset) encode_char_1 (ch, &(charset)) -INLINE void breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2); -INLINE void +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) { @@ -626,8 +610,8 @@ breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2) #define BREAKUP_CHAR(ch, charset, b1, b2) \ breakup_char_1 (ch, &(charset), &(b1), &(b2)) -INLINE Lisp_Object CHAR_CHARSET (Emchar ch); -INLINE Lisp_Object +INLINE_HEADER Lisp_Object CHAR_CHARSET (Emchar ch); +INLINE_HEADER Lisp_Object CHAR_CHARSET (Emchar ch) { Lisp_Object charset; @@ -639,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 */ @@ -651,4 +668,4 @@ extern Lisp_Object Vcharset_chinese_big5_2; extern Lisp_Object Vcharset_japanese_jisx0208; extern Lisp_Object Vcharset_japanese_jisx0212; -#endif /* _XEMACS_CHAR_UCS_H */ +#endif /* INCLUDED_char_ucs_h_ */