X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fchar-ucs.h;h=56b72bfda66a1182d46e37ef5acc326366e970f6;hb=7c00b553ec1c85f4eff517d08a87be98e6158119;hp=93fe8c6e491fda48c02be0015fd15f2a579f1466;hpb=31c757f1f48c650ddfd7ec317dc62f763256114e;p=chise%2Fxemacs-chise.git- diff --git a/src/char-ucs.h b/src/char-ucs.h index 93fe8c6..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,56 +406,19 @@ 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]; - unsigned char charset_get_byte1 (Lisp_Object charset, Emchar ch); unsigned char charset_get_byte2 (Lisp_Object charset, Emchar ch); -extern Lisp_Object Vdefault_preferred_coded_charset_list; +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 = 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 (c <= 0x17f) - { - *charset - = CHARSET_BY_LEADING_BYTE (latin_a_char_to_charset[c - 0x100]); - if (XCHARSET_TO_BYTE1_TABLE (*charset) != NULL) - { - *c1 = charset_get_byte1 (*charset, c); - *c2 = charset_get_byte2 (*charset, c); - } - else - { - *c1 = latin_a_char_to_byte1[c - 0x100]; - *c2 = latin_a_char_to_byte2[c - 0x100]; - } - } - else if (c < MIN_CHAR_GREEK) + if (c < MIN_CHAR_94) { - Lisp_Object charsets = Vdefault_preferred_coded_charset_list; + Lisp_Object charsets = Vdefault_coded_charset_priority_list; while (!EQ (charsets, Qnil)) { *charset = Ffind_charset (Fcar (charsets)); @@ -471,77 +430,62 @@ breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2) } charsets = Fcdr (charsets); } - /* 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 = Vdefault_preferred_coded_charset_list; - while (!EQ (charsets, Qnil)) + /* otherwise --- maybe for bootstrap */ + if (c <= MAX_CHAR_BASIC_LATIN) { - *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); + *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 if ((MIN_CHAR_CYRILLIC <= c) && (c <= MAX_CHAR_CYRILLIC)) + { + *charset = Vcharset_cyrillic_iso8859_5; + *c1 = c - MIN_CHAR_CYRILLIC + 0x20; + *c2 = 0; + } + else if ((MIN_CHAR_HEBREW <= c) && (c <= MAX_CHAR_HEBREW)) + { + *charset = Vcharset_hebrew_iso8859_8; + *c1 = c - MIN_CHAR_HEBREW + 0x20; + *c2 = 0; + } + else if ((MIN_CHAR_THAI <= c) && (c <= MAX_CHAR_THAI)) + { + *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) {