# HG changeset patch # User Kenichi Handa # Date 1031026014 0 # Node ID 06a2cbbeaee946f11678d27754779eae9cc61470 # Parent 547647cd162a251d178208d0471964e16018e6a8 (LEADING_CODE_LATIN_1_MIN) (LEADING_CODE_LATIN_1_MAX): New macros. (unibyte_to_multibyte_table): Extern it. (unibyte_char_to_multibyte): New macro. (MAKE_CHAR_MULTIBYTE): Use unibyte_to_multibyte_table. (CHAR_LEADING_CODE): New macro. (FETCH_STRING_CHAR_AS_MULTIBYTE_ADVANCE): New macro. diff -r 547647cd162a -r 06a2cbbeaee9 src/character.h --- a/src/character.h Tue Sep 03 04:06:33 2002 +0000 +++ b/src/character.h Tue Sep 03 04:06:54 2002 +0000 @@ -51,6 +51,10 @@ #define MAX_4_BYTE_CHAR 0x1FFFFF #define MAX_5_BYTE_CHAR 0x3FFF7F +/* Leading code range of Latin-1 chars. */ +#define LEADING_CODE_LATIN_1_MIN 0xC2 +#define LEADING_CODE_LATIN_1_MAX 0xC3 + /* Nonzero iff C is a character that corresponds to a raw 8-bit byte. */ #define CHAR_BYTE8_P(c) ((c) > MAX_5_BYTE_CHAR) @@ -68,21 +72,24 @@ that corresponds to a raw 8-bit byte. */ #define CHAR_BYTE8_HEAD_P(byte) ((byte) == 0xC0 || (byte) == 0xC1) -/* If C is not ASCII, make it unibyte. */ +/* Mapping table from unibyte chars to multibyte chars. */ +extern int unibyte_to_multibyte_table[256]; -#define MAKE_CHAR_UNIBYTE(c) \ - if (! ASCII_CHAR_P (c)) \ - c = multibyte_char_to_unibyte (c, Qnil); \ - else +/* Convert the unibyte character C to the corresponding multibyte + character. If C can't be converted, return C. */ +#define unibyte_char_to_multibyte(c) \ + ((c) < 256 ? unibyte_to_multibyte_table[(c)] : (c)) + +/* If C is not ASCII, make it unibyte. */ +#define MAKE_CHAR_UNIBYTE(c) \ + do { \ + if (! ASCII_CHAR_P (c)) \ + c = CHAR_TO_BYTE8 (c); \ + } while (0) -/* If C is not ASCII, make it multibyte. */ - -#define MAKE_CHAR_MULTIBYTE(c) \ - if (! ASCII_CHAR_P (c)) \ - c = unibyte_char_to_multibyte (c); \ - else - +/* If C is not ASCII, make it multibyte. It assumes C < 256. */ +#define MAKE_CHAR_MULTIBYTE(c) ((c) = unibyte_to_multibyte_table[(c)]) /* This is the maximum byte length of multibyte form. */ #define MAX_MULTIBYTE_LENGTH 5 @@ -126,6 +133,17 @@ : (c) <= MAX_5_BYTE_CHAR ? 5 \ : 2) + +/* Return the leading code of multibyte form of C. */ +#define CHAR_LEADING_CODE(c) \ + ((c) <= MAX_1_BYTE_CHAR ? c \ + : (c) <= MAX_2_BYTE_CHAR ? (0xC0 | ((c) >> 6)) \ + : (c) <= MAX_3_BYTE_CHAR ? (0xE0 | ((c) >> 12)) \ + : (c) <= MAX_4_BYTE_CHAR ? (0xF0 | ((c) >> 18)) \ + : (c) <= MAX_5_BYTE_CHAR ? 0xF8 \ + : (0xC0 | (((c) >> 6) & 0x01))) + + /* Store multibyte form of the character C in P. The caller should allocate at least MAX_MULTIBYTE_LENGTH bytes area at P in advance. Returns the length of the multibyte form. */ @@ -337,6 +355,28 @@ } \ else +/* Like FETCH_STRING_CHAR_ADVANCE */ + +#define FETCH_STRING_CHAR_AS_MULTIBYTE_ADVANCE(OUTPUT, STRING, CHARIDX, BYTEIDX) \ + if (1) \ + { \ + CHARIDX++; \ + if (STRING_MULTIBYTE (STRING)) \ + { \ + unsigned char *ptr = &XSTRING (STRING)->data[BYTEIDX]; \ + int len; \ + \ + OUTPUT = STRING_CHAR_AND_LENGTH (ptr, 0, len); \ + BYTEIDX += len; \ + } \ + else \ + { \ + OUTPUT = XSTRING (STRING)->data[BYTEIDX++]; \ + MAKE_CHAR_MULTIBYTE (OUTPUT); \ + } \ + } \ + else + /* Like FETCH_STRING_CHAR_ADVANCE but assumes STRING is multibyte. */