X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fchar-ucs.h;h=56b72bfda66a1182d46e37ef5acc326366e970f6;hb=7c00b553ec1c85f4eff517d08a87be98e6158119;hp=e404fc770322220c04fb6834f6d79c5dfd69ed92;hpb=9ca6df75a5f28825776d6acbe5870b012c3ed0ae;p=chise%2Fxemacs-chise.git diff --git a/src/char-ucs.h b/src/char-ucs.h index e404fc7..56b72bf 100644 --- a/src/char-ucs.h +++ b/src/char-ucs.h @@ -215,12 +215,18 @@ struct Lisp_Charset /* Which half of font to be used to display this character set */ unsigned int graphic; - /* byte->character mapping table */ + /* Byte->character mapping table */ Emchar* decoding_table; - /* character->byte mapping table */ + /* Character->byte mapping table */ Emchar_to_byte_table* to_byte1_table; Emchar_to_byte_table* to_byte2_table; + + /* Range of character code */ + Emchar ucs_min, ucs_max; + + /* Offset for external representation */ + Emchar code_offset; }; DECLARE_LRECORD (charset, struct Lisp_Charset); @@ -261,6 +267,9 @@ DECLARE_LRECORD (charset, struct Lisp_Charset); #define CHARSET_DECODING_TABLE(cs) ((cs)->decoding_table) #define CHARSET_TO_BYTE1_TABLE(cs) ((cs)->to_byte1_table) #define CHARSET_TO_BYTE2_TABLE(cs) ((cs)->to_byte2_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) #define XCHARSET_ID(cs) CHARSET_ID (XCHARSET (cs)) @@ -356,28 +365,15 @@ MAKE_CHAR (Lisp_Object charset, int c1, int c2) if ((decoding_table = XCHARSET_DECODING_TABLE (charset)) != NULL) return decoding_table[c1 - (XCHARSET_CHARS (charset) == 94 ? 33 : 32)]; - else if (EQ (charset, Vcharset_ascii)) - return c1; - else if (EQ (charset, Vcharset_control_1)) - return c1 | 0x80; - else if (EQ (charset, Vcharset_ucs_bmp)) - return (c1 << 8) | c2; - else if (EQ (charset, Vcharset_latin_iso8859_1)) - return c1 | 0x80; - else if (EQ (charset, Vcharset_cyrillic_iso8859_5)) - return c1 + MIN_CHAR_CYRILLIC - 0x20; - else if (EQ (charset, Vcharset_greek_iso8859_7)) - return c1 + MIN_CHAR_GREEK - 0x20; - else if (EQ (charset, Vcharset_hebrew_iso8859_8)) - return c1 + MIN_CHAR_HEBREW - 0x20; - else if (EQ (charset, Vcharset_thai_tis620)) - return c1 + MIN_CHAR_THAI - 0x20; else if (EQ (charset, Vcharset_katakana_jisx0201)) if (c1 < 0x60) return c1 + MIN_CHAR_HALFWIDTH_KATAKANA - 0x20; else /* return MIN_CHAR_94 + ('I' - '0') * 94 + (c1 - 33); */ return ' '; + else if (CHARSET_UCS_MAX (XCHARSET (charset))) + return c1 - CHARSET_CODE_OFFSET (XCHARSET (charset)) + + CHARSET_UCS_MIN (XCHARSET (charset)); else if (XCHARSET_DIMENSION (charset) == 1) { switch (XCHARSET_CHARS (charset)) @@ -410,232 +406,86 @@ MAKE_CHAR (Lisp_Object charset, int c1, int c2) } } -extern Charset_ID latin_a_char_to_charset[128]; -extern unsigned char latin_a_char_to_byte1[128]; -extern unsigned char latin_a_char_to_byte2[128]; - -INLINE unsigned char XCHARSET_GET_BYTE1 (Lisp_Object charset, Emchar ch); -INLINE unsigned char -XCHARSET_GET_BYTE1 (Lisp_Object charset, Emchar ch) -{ - Emchar_to_byte_table* table; - - if ((table = XCHARSET_TO_BYTE1_TABLE (charset)) != NULL) - return get_byte_from_character_table (ch, table); - else if (EQ (charset, Vcharset_ascii)) - return ch <= 0x7f ? ch : 0; - else if (EQ (charset, Vcharset_control_1)) - return (0x80 <= ch) && (ch < 0xA0) ? ch & 0x7f : 0; - else if (EQ (charset, Vcharset_latin_iso8859_1)) - return (0xA0 <= ch) && (ch <= 0xff) ? ch & 0x7f : 0; - else if (EQ (charset, Vcharset_cyrillic_iso8859_5)) - return (MIN_CHAR_GREEK <= ch) && (ch <= MAX_CHAR_CYRILLIC) ? - ch - MIN_CHAR_CYRILLIC + 0x20 : 0; - else if (EQ (charset, Vcharset_greek_iso8859_7)) - return (MIN_CHAR_GREEK <= ch) && (ch <= MAX_CHAR_GREEK) ? - ch - MIN_CHAR_GREEK + 0x20 : 0; - else if (EQ (charset, Vcharset_hebrew_iso8859_8)) - return (MIN_CHAR_HEBREW <= ch) && (ch <= MAX_CHAR_HEBREW) ? - ch - MIN_CHAR_HEBREW + 0x20 : 0; - else if (EQ (charset, Vcharset_thai_tis620)) - return (MIN_CHAR_THAI <= ch) && (ch <= MAX_CHAR_THAI) ? - ch - MIN_CHAR_THAI + 0x20 : 0; - else if (EQ (charset, Vcharset_katakana_jisx0201)) - return (MIN_CHAR_HALFWIDTH_KATAKANA <= ch) - && (ch <= MAX_CHAR_HALFWIDTH_KATAKANA) ? - ch - MIN_CHAR_HALFWIDTH_KATAKANA + 0x20 : 0; - else if (EQ (charset, Vcharset_ucs_bmp)) - return ch & 0xff; - else if (XCHARSET_DIMENSION (charset) == 1) - { - if (XCHARSET_CHARS (charset) == 94) - return (MIN_CHAR_94 + (XCHARSET_FINAL (charset) - '0') * 94 <= ch) - && (ch < MIN_CHAR_94 + (XCHARSET_FINAL (charset) - '0' + 1) * 94) ? - ((ch - MIN_CHAR_94) % 94) + 33 : 0; - else /* if (XCHARSET_CHARS (charset) == 96) */ - return (MIN_CHAR_96 + (XCHARSET_FINAL (charset) - '0') * 96 <= ch) - && (ch < MIN_CHAR_96 + (XCHARSET_FINAL (charset) - '0' + 1) * 96) ? - ((ch - MIN_CHAR_94) % 96) + 32 : 0; - } - else /* if (XCHARSET_DIMENSION (charset) == 2) */ - { - if (XCHARSET_CHARS (charset) == 94) - return (MIN_CHAR_94x94 - + (XCHARSET_FINAL (charset) - '0') * 94 * 94 <= ch) - && (ch < MIN_CHAR_94x94 - + (XCHARSET_FINAL (charset) - '0' + 1) * 94 * 94) ? - (((ch - MIN_CHAR_94x94) / 94) % 94) + 33 : 0; - else /* if (XCHARSET_CHARS (charset) == 96) */ - return (MIN_CHAR_96x96 - + (XCHARSET_FINAL (charset) - '0') * 96 * 96 <= ch) - && (ch < MIN_CHAR_96x96 - + (XCHARSET_FINAL (charset) - '0' + 1) * 96 * 96) ? - (((ch - MIN_CHAR_96x96) / 96) % 96) + 32 : 0; - } -} +unsigned char charset_get_byte1 (Lisp_Object charset, Emchar ch); +unsigned char charset_get_byte2 (Lisp_Object charset, Emchar ch); -INLINE unsigned char XCHARSET_GET_BYTE2 (Lisp_Object charset, Emchar ch); -INLINE unsigned char -XCHARSET_GET_BYTE2 (Lisp_Object charset, Emchar ch) -{ - if (XCHARSET_DIMENSION (charset) == 1) - return 0; - else - { - Emchar_to_byte_table* table; - - if ((table = XCHARSET_TO_BYTE2_TABLE (charset)) != NULL) - return get_byte_from_character_table (ch, table); - else if (EQ (charset, Vcharset_ucs_bmp)) - return (ch >> 8) & 0xff; - else if (XCHARSET_CHARS (charset) == 94) - return (MIN_CHAR_94x94 - + (XCHARSET_FINAL (charset) - '0') * 94 * 94 <= ch) - && (ch < MIN_CHAR_94x94 - + (XCHARSET_FINAL (charset) - '0' + 1) * 94 * 94) ? - ((ch - MIN_CHAR_94x94) % 94) + 33 : 0; - else /* if (XCHARSET_CHARS (charset) == 96) */ - return (MIN_CHAR_96x96 - + (XCHARSET_FINAL (charset) - '0') * 96 * 96 <= ch) - && (ch < MIN_CHAR_96x96 - + (XCHARSET_FINAL (charset) - '0' + 1) * 96 * 96) ? - ((ch - MIN_CHAR_96x96) % 96) + 32 : 0; - } -} +extern Lisp_Object Vdefault_coded_charset_priority_list; +EXFUN (Ffind_charset, 1); INLINE void breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2); INLINE void breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2) { - if (c <= MAX_CHAR_BASIC_LATIN) - { - *charset = Vcharset_ascii; - *c1 = c; - *c2 = 0; - } - else if (c < 0xA0) - { - *charset = Vcharset_control_1; - *c1 = c & 0x7f; - *c2 = 0; - } - else if (c <= 0xff) - { - *charset = Vcharset_latin_iso8859_1; - *c1 = c & 0x7f; - *c2 = 0; - } - else if (c <= 0x17f) + if (c < MIN_CHAR_94) { - *charset - = CHARSET_BY_LEADING_BYTE (latin_a_char_to_charset[c - 0x100]); - if (XCHARSET_TO_BYTE1_TABLE (*charset) != NULL) + Lisp_Object charsets = Vdefault_coded_charset_priority_list; + while (!EQ (charsets, Qnil)) { - *c1 = XCHARSET_GET_BYTE1 (*charset, c); + *charset = Ffind_charset (Fcar (charsets)); + if (!EQ (*charset, Qnil) + && (*c1 = charset_get_byte1 (*charset, c)) ) + { + *c2 = charset_get_byte2 (*charset, c); + return; + } + charsets = Fcdr (charsets); + } + /* otherwise --- maybe for bootstrap */ + if (c <= MAX_CHAR_BASIC_LATIN) + { + *charset = Vcharset_ascii; + *c1 = charset_get_byte1 (*charset, c); + *c2 = charset_get_byte2 (*charset, c); + } + else if (c < 0xA0) + { + *charset = Vcharset_control_1; + *c1 = charset_get_byte1 (*charset, c); + *c2 = charset_get_byte2 (*charset, c); + } + else if (c <= 0xff) + { + *charset = Vcharset_latin_iso8859_1; + *c1 = charset_get_byte1 (*charset, c); + *c2 = charset_get_byte2 (*charset, c); + } + else if ((MIN_CHAR_GREEK <= c) && (c <= MAX_CHAR_GREEK)) + { + *charset = Vcharset_greek_iso8859_7; + *c1 = c - MIN_CHAR_GREEK + 0x20; *c2 = 0; } - else + else if ((MIN_CHAR_CYRILLIC <= c) && (c <= MAX_CHAR_CYRILLIC)) { - *c1 = latin_a_char_to_byte1[c - 0x100]; - *c2 = latin_a_char_to_byte2[c - 0x100]; + *charset = Vcharset_cyrillic_iso8859_5; + *c1 = c - MIN_CHAR_CYRILLIC + 0x20; + *c2 = 0; } - } - else if (c < MIN_CHAR_GREEK) - { - Lisp_Object charsets = list6 (Vcharset_latin_iso8859_2, - Vcharset_latin_iso8859_3, - Vcharset_latin_iso8859_4, - Vcharset_latin_iso8859_9, - Vcharset_latin_viscii_lower, - Vcharset_latin_viscii_upper); - while (!EQ (charsets, Qnil)) + else if ((MIN_CHAR_HEBREW <= c) && (c <= MAX_CHAR_HEBREW)) { - *charset = Fcar (charsets); - if (XCHARSET_TO_BYTE1_TABLE (*charset) != NULL) - { - if ( (*c1 = XCHARSET_GET_BYTE1 (*charset, c)) ) - { - *c2 = 0; - return; - } - } - charsets = Fcdr (charsets); + *charset = Vcharset_hebrew_iso8859_8; + *c1 = c - MIN_CHAR_HEBREW + 0x20; + *c2 = 0; } - /* otherwise */ - *charset = Vcharset_ucs_bmp; - *c1 = c >> 8; - *c2 = c & 0xff; - } - else if (c <= MAX_CHAR_GREEK) - { - *charset = Vcharset_greek_iso8859_7; - *c1 = c - MIN_CHAR_GREEK + 0x20; - *c2 = 0; - } - else if (c < MIN_CHAR_CYRILLIC) - { - *charset = Vcharset_ucs_bmp; - *c1 = c >> 8; - *c2 = c & 0xff; - } - else if (c <= MAX_CHAR_CYRILLIC) - { - *charset = Vcharset_cyrillic_iso8859_5; - *c1 = c - MIN_CHAR_CYRILLIC + 0x20; - *c2 = 0; - } - else if (c < MIN_CHAR_HEBREW) - { - *charset = Vcharset_ucs_bmp; - *c1 = c >> 8; - *c2 = c & 0xff; - } - else if (c <= MAX_CHAR_HEBREW) - { - *charset = Vcharset_hebrew_iso8859_8; - *c1 = c - MIN_CHAR_HEBREW + 0x20; - *c2 = 0; - } - else if (c < MIN_CHAR_THAI) - { - *charset = Vcharset_ucs_bmp; - *c1 = c >> 8; - *c2 = c & 0xff; - } - else if (c <= MAX_CHAR_THAI) - { - *charset = Vcharset_thai_tis620; - *c1 = c - MIN_CHAR_THAI + 0x20; - *c2 = 0; - } - else if (c < MIN_CHAR_HALFWIDTH_KATAKANA) - { - Lisp_Object charsets = list3 (Vcharset_latin_jisx0201, - Vcharset_latin_viscii_lower, - Vcharset_latin_viscii_upper); - while (!EQ (charsets, Qnil)) + else if ((MIN_CHAR_THAI <= c) && (c <= MAX_CHAR_THAI)) { - *charset = Fcar (charsets); - if (XCHARSET_TO_BYTE1_TABLE (*charset) != NULL) - { - if ( (*c1 = XCHARSET_GET_BYTE1 (*charset, c)) ) - { - *c2 = 0; - return; - } - } - charsets = Fcdr (charsets); + *charset = Vcharset_thai_tis620; + *c1 = c - MIN_CHAR_THAI + 0x20; + *c2 = 0; + } + else if ((MIN_CHAR_HALFWIDTH_KATAKANA <= c) + && (c <= MAX_CHAR_HALFWIDTH_KATAKANA)) + { + *charset = Vcharset_katakana_jisx0201; + *c1 = c - MIN_CHAR_HALFWIDTH_KATAKANA + 0x20; + *c2 = 0; + } + else + { + *charset = Vcharset_ucs_bmp; + *c1 = c >> 8; + *c2 = c & 0xff; } - /* otherwise */ - *charset = Vcharset_ucs_bmp; - *c1 = c >> 8; - *c2 = c & 0xff; - } - else if (c <= MAX_CHAR_HALFWIDTH_KATAKANA) - { - *charset = Vcharset_katakana_jisx0201; - *c1 = c - MIN_CHAR_HALFWIDTH_KATAKANA + 0x20; - *c2 = 0; } else if (c <= MAX_CHAR_94) { @@ -703,7 +553,6 @@ CHAR_CHARSET (Emchar ch) /* Exported functions */ /************************************************************************/ -EXFUN (Ffind_charset, 1); EXFUN (Fget_charset, 1); extern Lisp_Object Vcharset_chinese_big5_1;