X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fmule-ccl.c;h=1907762d83de6b0a19f667cf04d44bf474617e7e;hb=4f9f80ecf7b7c7a9dd3ee4c988813f28291825d3;hp=947d64b997788c9365feca404c21550d9fd5813d;hpb=3062d425fac0473eb5aa2efc0bb002f6ce0cb028;p=chise%2Fxemacs-chise.git.1 diff --git a/src/mule-ccl.c b/src/mule-ccl.c index 947d64b..1907762 100644 --- a/src/mule-ccl.c +++ b/src/mule-ccl.c @@ -31,7 +31,7 @@ Boston, MA 02111-1307, USA. */ #include "lisp.h" #include "buffer.h" -#include "mule-charset.h" +#include "character.h" #include "mule-ccl.h" #include "file-coding.h" @@ -833,6 +833,9 @@ static int stack_idx_of_map_multiple; } \ } while (0) +#define POSSIBLE_LEADING_BYTE_P(leading_byte) \ + ((leading_byte > MIN_LEADING_BYTE) && \ + (leading_byte - MIN_LEADING_BYTE) < NUM_LEADING_BYTES) /* Set C to the character code made from CHARSET and CODE. This is like MAKE_CHAR but check the validity of CHARSET and CODE. If they @@ -1279,6 +1282,7 @@ ccl_driver (struct ccl_program *ccl, case CCL_Extension: switch (EXCMD) { +#ifndef UTF2000 case CCL_ReadMultibyteChar2: if (!src) CCL_INVALID_CMD; @@ -1296,6 +1300,16 @@ ccl_driver (struct ccl_program *ccl, reg[rrr] = i; reg[RRR] = LEADING_BYTE_ASCII; } + /* Previously, these next two elses were reversed in order, + which should have worked fine, but is more fragile than + this order. */ + else if (LEADING_BYTE_CONTROL_1 == i) + { + if (src >= src_end) + goto ccl_read_multibyte_character_suspend; + reg[RRR] = i; + reg[rrr] = (*src++ - 0xA0); + } else if (i <= MAX_LEADING_BYTE_OFFICIAL_1) { if (src >= src_end) @@ -1303,6 +1317,13 @@ ccl_driver (struct ccl_program *ccl, reg[RRR] = i; reg[rrr] = (*src++ & 0x7F); } + else if (LEADING_BYTE_CONTROL_1 == i) + { + if (src >= src_end) + goto ccl_read_multibyte_character_suspend; + reg[RRR] = i; + reg[rrr] = (*src++ - 0xA0); + } else if (i <= MAX_LEADING_BYTE_OFFICIAL_2) { if ((src + 1) >= src_end) @@ -1347,22 +1368,39 @@ ccl_driver (struct ccl_program *ccl, CCL_SUSPEND (CCL_STAT_SUSPEND_BY_SRC); break; +#endif +#ifndef UTF2000 case CCL_WriteMultibyteChar2: i = reg[RRR]; /* charset */ - if (i == LEADING_BYTE_ASCII) + if (i == LEADING_BYTE_ASCII) i = reg[rrr] & 0xFF; - else if (XCHARSET_DIMENSION (CHARSET_BY_LEADING_BYTE (i)) == 1) - i = (((i - FIELD2_TO_OFFICIAL_LEADING_BYTE) << 7) - | (reg[rrr] & 0x7F)); - else if (i < MAX_LEADING_BYTE_OFFICIAL_2) - i = ((i - FIELD1_TO_OFFICIAL_LEADING_BYTE) << 14) | reg[rrr]; - else - i = ((i - FIELD1_TO_PRIVATE_LEADING_BYTE) << 14) | reg[rrr]; + else if (LEADING_BYTE_CONTROL_1 == i) + i = ((reg[rrr] & 0xFF) - 0xA0); + else if (POSSIBLE_LEADING_BYTE_P(i) && + !NILP(CHARSET_BY_LEADING_BYTE(i))) + { + if (XCHARSET_DIMENSION (CHARSET_BY_LEADING_BYTE (i)) == 1) + i = (((i - FIELD2_TO_OFFICIAL_LEADING_BYTE) << 7) + | (reg[rrr] & 0x7F)); + else if (i <= MAX_LEADING_BYTE_OFFICIAL_2) + i = ((i - FIELD1_TO_OFFICIAL_LEADING_BYTE) << 14) + | reg[rrr]; + else + i = ((i - FIELD1_TO_PRIVATE_LEADING_BYTE) << 14) | reg[rrr]; + } + else + { + /* No charset we know about; use U+3012 GETA MARK */ + i = MAKE_CHAR + (CHARSET_BY_LEADING_BYTE(LEADING_BYTE_JAPANESE_JISX0208), + 34, 46); + } CCL_WRITE_CHAR (i); break; +#endif case CCL_TranslateCharacter: #if 0 @@ -1417,7 +1455,6 @@ ccl_driver (struct ccl_program *ccl, for (;i < j;i++) { - size = XVECTOR (Vcode_conversion_map_vector)->size; point = XINT (ccl_prog[ic++]); if (point >= size) continue;