Mercurial > emacs
changeset 34890:f203e7623af7
(CCL_WRITE_CHAR): Check variable `extra_bytes'.
(ccl_driver): New local variable `extra_bytes'.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Thu, 28 Dec 2000 07:03:05 +0000 |
parents | 883267e75fbb |
children | b9b14e62fe38 |
files | src/ccl.c |
diffstat | 1 files changed, 25 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ccl.c Thu Dec 28 07:02:51 2000 +0000 +++ b/src/ccl.c Thu Dec 28 07:03:05 2000 +0000 @@ -698,26 +698,26 @@ /* Encode one character CH to multibyte form and write to the current output buffer. If CH is less than 256, CH is written as is. */ -#define CCL_WRITE_CHAR(ch) \ - do { \ - int bytes = SINGLE_BYTE_CHAR_P (ch) ? 1: CHAR_BYTES (ch); \ - if (!dst) \ - CCL_INVALID_CMD; \ - else if (dst + bytes <= (dst_bytes ? dst_end : src)) \ - { \ - if (bytes == 1) \ - { \ - *dst++ = (ch); \ - if ((ch) >= 0x80 && (ch) < 0xA0) \ - /* We may have to convert this eight-bit char to \ - multibyte form later. */ \ - dst_end--; \ - } \ - else \ - dst += CHAR_STRING (ch, dst); \ - } \ - else \ - CCL_SUSPEND (CCL_STAT_SUSPEND_BY_DST); \ +#define CCL_WRITE_CHAR(ch) \ + do { \ + int bytes = SINGLE_BYTE_CHAR_P (ch) ? 1: CHAR_BYTES (ch); \ + if (!dst) \ + CCL_INVALID_CMD; \ + else if (dst + bytes + extra_bytes < (dst_bytes ? dst_end : src)) \ + { \ + if (bytes == 1) \ + { \ + *dst++ = (ch); \ + if ((ch) >= 0x80 && (ch) < 0xA0) \ + /* We may have to convert this eight-bit char to \ + multibyte form later. */ \ + extra_bytes++; \ + } \ + else \ + dst += CHAR_STRING (ch, dst); \ + } \ + else \ + CCL_SUSPEND (CCL_STAT_SUSPEND_BY_DST); \ } while (0) /* Write a string at ccl_prog[IC] of length LEN to the current output @@ -840,6 +840,11 @@ int stack_idx = ccl->stack_idx; /* Instruction counter of the current CCL code. */ int this_ic; + /* CCL_WRITE_CHAR will produce 8-bit code of range 0x80..0x9F. But, + each of them will be converted to multibyte form of 2-byte + sequence. For that conversion, we remember how many more bytes + we must keep in DESTINATION in this variable. */ + int extra_bytes = 0; if (ic >= ccl->eof_ic) ic = CCL_HEADER_MAIN;