X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fchar-ucs.h;h=42d98ef5e639a48092e49b1fe0d3311bd175fbf8;hb=83672a528db7fe9cace421905b7efd06c11b7c98;hp=7302124a5a3858e410488110fbcd05d8184e93b8;hpb=add87c268390e830359bae905342efc0e71bc4fa;p=chise%2Fxemacs-chise.git diff --git a/src/char-ucs.h b/src/char-ucs.h index 7302124..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,25 +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 (XCHARSET_DIMENSION (charset) == 1 - ? - c1 - CHARSET_CODE_OFFSET (XCHARSET (charset)) - : - (c1 - CHARSET_CODE_OFFSET (XCHARSET (charset))) - * XCHARSET_CHARS (charset) - + c2 - 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)) @@ -483,7 +511,7 @@ breakup_char_1 (Emchar c, Lisp_Object *charset, int *c1, int *c2) && (c <= MAX_CHAR_HALFWIDTH_KATAKANA)) { *charset = Vcharset_katakana_jisx0201; - *c1 = c - MIN_CHAR_HALFWIDTH_KATAKANA + 0x20; + *c1 = c - MIN_CHAR_HALFWIDTH_KATAKANA + 33; *c2 = 0; } else