X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fchar-ucs.h;h=42d98ef5e639a48092e49b1fe0d3311bd175fbf8;hb=83672a528db7fe9cace421905b7efd06c11b7c98;hp=d45683a9d3b4f0fbf693f2fcd9a45e164fe4be86;hpb=333b7317418f97a7ff16338e8eb8b98f6c7dbe47;p=chise%2Fxemacs-chise.git diff --git a/src/char-ucs.h b/src/char-ucs.h index d45683a..42d98ef 100644 --- a/src/char-ucs.h +++ b/src/char-ucs.h @@ -60,6 +60,8 @@ typedef int Charset_ID; #define LEADING_BYTE_UCS_BMP 0x80 #define LEADING_BYTE_CONTROL_1 0x81 /* represent normal 80-9F */ +#define LEADING_BYTE_HIRAGANA_JISX0208 0x82 +#define LEADING_BYTE_KATAKANA_JISX0208 0x83 #define CHARSET_ID_OFFSET_94 0x55 @@ -216,7 +218,7 @@ struct Lisp_Charset unsigned int graphic; /* Byte->character mapping table */ - Emchar* decoding_table; + Lisp_Object decoding_table; /* Character->byte mapping table */ Emchar_to_byte_table* to_byte1_table; @@ -225,8 +227,11 @@ struct Lisp_Charset /* Range of character code */ Emchar ucs_min, ucs_max; - /* Offset for external representation */ + /* Offset for external code */ Emchar code_offset; + + /* Offset for each byte */ + Emchar byte_offset; }; DECLARE_LRECORD (charset, struct Lisp_Charset); @@ -270,6 +275,7 @@ DECLARE_LRECORD (charset, struct Lisp_Charset); #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 CHARSET_BYTE_OFFSET(cs) ((cs)->byte_offset) #define XCHARSET_ID(cs) CHARSET_ID (XCHARSET (cs)) @@ -291,6 +297,10 @@ DECLARE_LRECORD (charset, struct Lisp_Charset); #define XCHARSET_DECODING_TABLE(cs) CHARSET_DECODING_TABLE(XCHARSET(cs)) #define XCHARSET_TO_BYTE1_TABLE(cs) CHARSET_TO_BYTE1_TABLE(XCHARSET(cs)) #define XCHARSET_TO_BYTE2_TABLE(cs) CHARSET_TO_BYTE2_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)) +#define XCHARSET_BYTE_OFFSET(cs) CHARSET_BYTE_OFFSET(XCHARSET(cs)) /* Table of charsets indexed by (leading byte - 128). */ extern Lisp_Object charset_by_leading_byte[NUM_LEADING_BYTES]; @@ -340,7 +350,13 @@ CHARSET_BY_LEADING_BYTE (Charset_ID lb) #define MIN_CHAR_THAI 0x0E00 #define MAX_CHAR_THAI 0x0E5F -#define MIN_CHAR_HALFWIDTH_KATAKANA 0xFF60 +#define MIN_CHAR_HIRAGANA 0x3041 +#define MAX_CHAR_HIRAGANA 0x3093 + +#define MIN_CHAR_KATAKANA 0x30A1 +#define MAX_CHAR_KATAKANA 0x30F6 + +#define MIN_CHAR_HALFWIDTH_KATAKANA 0xFF61 #define MAX_CHAR_HALFWIDTH_KATAKANA 0xFF9F #define MIN_CHAR_94 0xE90940 @@ -361,19 +377,37 @@ INLINE Emchar MAKE_CHAR (Lisp_Object charset, int c1, int c2); INLINE Emchar MAKE_CHAR (Lisp_Object charset, int c1, int c2) { - Emchar* decoding_table; - - if ((decoding_table = XCHARSET_DECODING_TABLE (charset)) != NULL) - return decoding_table[c1 - (XCHARSET_CHARS (charset) == 94 ? 33 : 32)]; + Lisp_Object decoding_table = XCHARSET_DECODING_TABLE (charset); + int idx; + Lisp_Object ch; + + if (!EQ (decoding_table, Qnil) + && (0 <= (idx = c1 - (XCHARSET_CHARS (charset) == 94 ? 33 : 32))) + && (idx < XVECTOR_LENGTH (decoding_table)) + && !EQ (ch = XVECTOR_DATA(decoding_table)[idx], Qnil)) + return XCHAR (ch); else if (EQ (charset, Vcharset_katakana_jisx0201)) if (c1 < 0x60) - return c1 + MIN_CHAR_HALFWIDTH_KATAKANA - 0x20; + return c1 + MIN_CHAR_HALFWIDTH_KATAKANA - 33; 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_UCS_MAX (charset)) + { + Emchar code + = (XCHARSET_DIMENSION (charset) == 1 + ? + c1 - XCHARSET_BYTE_OFFSET (charset) + : + (c1 - XCHARSET_BYTE_OFFSET (charset)) * XCHARSET_CHARS (charset) + + c2 - XCHARSET_BYTE_OFFSET (charset)) + - XCHARSET_CODE_OFFSET (charset) + XCHARSET_UCS_MIN (charset); + if ((code < XCHARSET_UCS_MIN (charset)) + || (XCHARSET_UCS_MAX (charset) < code)) + signal_simple_error ("Arguments makes invalid character", + make_char (code)); + return code; + } else if (XCHARSET_DIMENSION (charset) == 1) { switch (XCHARSET_CHARS (charset)) @@ -416,7 +450,7 @@ 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 < MIN_CHAR_GREEK) + if (c < MIN_CHAR_94) { Lisp_Object charsets = Vdefault_coded_charset_priority_list; while (!EQ (charsets, Qnil)) @@ -430,7 +464,7 @@ breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2) } charsets = Fcdr (charsets); } - /* otherwise */ + /* otherwise --- maybe for bootstrap */ if (c <= MAX_CHAR_BASIC_LATIN) { *charset = Vcharset_ascii; @@ -449,6 +483,37 @@ breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2) *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 + 33; + *c2 = 0; + } else { *charset = Vcharset_ucs_bmp; @@ -456,73 +521,6 @@ breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2) *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_coded_charset_priority_list; - while (!EQ (charsets, Qnil)) - { - *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 */ - *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) { *charset