From fbdc17211b56572046387d5fd9e80d96e3d07af4 Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Tue, 16 Mar 2010 11:14:40 +0900 Subject: coding.c (decode_coding_ccl): Fix previous change for the multibyte case. --- src/coding.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'src/coding.c') diff --git a/src/coding.c b/src/coding.c index df81eaba16e..a464950e8d1 100644 --- a/src/coding.c +++ b/src/coding.c @@ -5245,7 +5245,7 @@ decode_coding_ccl (coding) int multibytep = coding->src_multibyte; struct ccl_program *ccl = &coding->spec.ccl->ccl; int source_charbuf[1024]; - int source_byteidx[1024]; + int source_byteidx[1025]; Lisp_Object attrs, charset_list; CODING_GET_INFO (coding, attrs, charset_list); @@ -5256,11 +5256,14 @@ decode_coding_ccl (coding) int i = 0; if (multibytep) - while (i < 1024 && p < src_end) - { - source_byteidx[i] = p - src; - source_charbuf[i++] = STRING_CHAR_ADVANCE (p); - } + { + while (i < 1024 && p < src_end) + { + source_byteidx[i] = p - src; + source_charbuf[i++] = STRING_CHAR_ADVANCE (p); + } + source_byteidx[i] = p - src; + } else while (i < 1024 && p < src_end) source_charbuf[i++] = *p++; @@ -5270,7 +5273,7 @@ decode_coding_ccl (coding) ccl_driver (ccl, source_charbuf, charbuf, i, charbuf_end - charbuf, charset_list); charbuf += ccl->produced; - if (multibytep && ccl->consumed < i) + if (multibytep) src += source_byteidx[ccl->consumed]; else src += ccl->consumed; -- cgit v1.2.1 From fb608df3c662538c90a9a5ad0b3d13f39a3b395e Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Tue, 16 Mar 2010 14:48:41 +0900 Subject: Fix the ccl encoder for the case that the output buffer is fullfilled. --- src/coding.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) (limited to 'src/coding.c') diff --git a/src/coding.c b/src/coding.c index a464950e8d1..bdc37cb7c53 100644 --- a/src/coding.c +++ b/src/coding.c @@ -5307,7 +5307,7 @@ static int encode_coding_ccl (coding) struct coding_system *coding; { - struct ccl_program ccl; + struct ccl_program *ccl = &coding->spec.ccl->ccl; int multibytep = coding->dst_multibyte; int *charbuf = coding->charbuf; int *charbuf_end = charbuf + coding->charbuf_used; @@ -5318,35 +5318,34 @@ encode_coding_ccl (coding) Lisp_Object attrs, charset_list; CODING_GET_INFO (coding, attrs, charset_list); - setup_ccl_program (&ccl, CODING_CCL_ENCODER (coding)); - - ccl.last_block = coding->mode & CODING_MODE_LAST_BLOCK; - ccl.dst_multibyte = coding->dst_multibyte; + if (coding->consumed_char == coding->src_chars + && coding->mode & CODING_MODE_LAST_BLOCK) + ccl->last_block = 1; while (charbuf < charbuf_end) { - ccl_driver (&ccl, charbuf, destination_charbuf, + ccl_driver (ccl, charbuf, destination_charbuf, charbuf_end - charbuf, 1024, charset_list); if (multibytep) { - ASSURE_DESTINATION (ccl.produced * 2); - for (i = 0; i < ccl.produced; i++) + ASSURE_DESTINATION (ccl->produced * 2); + for (i = 0; i < ccl->produced; i++) EMIT_ONE_BYTE (destination_charbuf[i] & 0xFF); } else { - ASSURE_DESTINATION (ccl.produced); - for (i = 0; i < ccl.produced; i++) + ASSURE_DESTINATION (ccl->produced); + for (i = 0; i < ccl->produced; i++) *dst++ = destination_charbuf[i] & 0xFF; - produced_chars += ccl.produced; + produced_chars += ccl->produced; } - charbuf += ccl.consumed; - if (ccl.status == CCL_STAT_QUIT - || ccl.status == CCL_STAT_INVALID_CMD) + charbuf += ccl->consumed; + if (ccl->status == CCL_STAT_QUIT + || ccl->status == CCL_STAT_INVALID_CMD) break; } - switch (ccl.status) + switch (ccl->status) { case CCL_STAT_SUSPEND_BY_SRC: record_conversion_result (coding, CODING_RESULT_INSUFFICIENT_SRC); @@ -7537,6 +7536,7 @@ encode_coding (coding) Lisp_Object attrs; Lisp_Object translation_table; int max_lookup; + struct ccl_spec cclspec; attrs = CODING_ID_ATTRS (coding->id); if (coding->encoder == encode_coding_raw_text) @@ -7558,6 +7558,11 @@ encode_coding (coding) ALLOC_CONVERSION_WORK_AREA (coding); + if (coding->encoder == encode_coding_ccl) + { + coding->spec.ccl = &cclspec; + setup_ccl_program (&cclspec.ccl, CODING_CCL_ENCODER (coding)); + } do { coding_set_source (coding); consume_chars (coding, translation_table, max_lookup); -- cgit v1.2.1