From d0396581d5db3d6fd0b27db3511a281cf50b6bd2 Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Wed, 17 Feb 2010 15:47:32 +0900 Subject: [PATCH] Fix the ccl decoder for the case that the output buffer is fullfilled. --- src/ChangeLog | 10 ++++++++++ src/ccl.c | 3 --- src/coding.c | 52 +++++++++++++++++++++++---------------------------- 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index c6de809eb8..1143ea9663 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2010-02-17 Kenichi Handa + + * coding.c (decode_coding_ccl): Don't setup ccl program here. Fix + for the case that the output buffer is fullfilled. + (decode_coding): Setup ccl program here. Keep looping when the + decoder stopped because the output buffer is + fullfilled (bug#5534). + + * ccl.c (ccl_driver): Never reset ic to CCL_HEADER_MAIN. + 2010-02-13 Jan Djärv * xterm.c (x_clear_frame_area): Call gtk_widget_queue_draw if USE_GTK, diff --git a/src/ccl.c b/src/ccl.c index bc3cfe09b7..c5523c2d44 100644 --- a/src/ccl.c +++ b/src/ccl.c @@ -883,9 +883,6 @@ ccl_driver (ccl, source, destination, src_size, dst_size, charset_list) int eof_ic = ccl->eof_ic; int eof_hit = 0; - if (ic >= eof_ic) - ic = CCL_HEADER_MAIN; - if (ccl->buf_magnification == 0) /* We can't read/produce any bytes. */ dst = NULL; diff --git a/src/coding.c b/src/coding.c index 935d32e6a5..879cae5619 100644 --- a/src/coding.c +++ b/src/coding.c @@ -5220,18 +5220,16 @@ decode_coding_ccl (coding) int *charbuf_end = coding->charbuf + coding->charbuf_size; int consumed_chars = 0; int multibytep = coding->src_multibyte; - struct ccl_program ccl; + struct ccl_program *ccl = &coding->spec.ccl->ccl; int source_charbuf[1024]; int source_byteidx[1024]; Lisp_Object attrs, charset_list; CODING_GET_INFO (coding, attrs, charset_list); - setup_ccl_program (&ccl, CODING_CCL_DECODER (coding)); - while (src < src_end) + while (1) { const unsigned char *p = src; - int *source, *source_end; int i = 0; if (multibytep) @@ -5245,37 +5243,26 @@ decode_coding_ccl (coding) source_charbuf[i++] = *p++; if (p == src_end && coding->mode & CODING_MODE_LAST_BLOCK) - ccl.last_block = 1; - - source = source_charbuf; - source_end = source + i; - while (source < source_end) - { - ccl_driver (&ccl, source, charbuf, - source_end - source, charbuf_end - charbuf, - charset_list); - source += ccl.consumed; - charbuf += ccl.produced; - if (ccl.status != CCL_STAT_SUSPEND_BY_DST) - break; - } - if (source < source_end) - src += source_byteidx[source - source_charbuf]; + ccl->last_block = 1; + ccl_driver (ccl, source_charbuf, charbuf, i, charbuf_end - charbuf, + charset_list); + charbuf += ccl->produced; + if (multibytep && ccl->consumed < i) + src += source_byteidx[ccl->consumed]; else - src = p; - consumed_chars += source - source_charbuf; - - if (ccl.status != CCL_STAT_SUSPEND_BY_SRC - && ccl.status != CODING_RESULT_INSUFFICIENT_SRC) + src += ccl->consumed; + consumed_chars += ccl->consumed; + if (p == src_end || ccl->status != CCL_STAT_SUSPEND_BY_SRC) break; } - switch (ccl.status) + switch (ccl->status) { case CCL_STAT_SUSPEND_BY_SRC: record_conversion_result (coding, CODING_RESULT_INSUFFICIENT_SRC); break; case CCL_STAT_SUSPEND_BY_DST: + record_conversion_result (coding, CODING_RESULT_INSUFFICIENT_DST); break; case CCL_STAT_QUIT: case CCL_STAT_INVALID_CMD: @@ -7117,6 +7104,7 @@ decode_coding (coding) Lisp_Object attrs; Lisp_Object undo_list; Lisp_Object translation_table; + struct ccl_spec cclspec; int carryover; int i; @@ -7149,6 +7137,11 @@ decode_coding (coding) translation_table = get_translation_table (attrs, 0, NULL); carryover = 0; + if (coding->decoder == decode_coding_ccl) + { + coding->spec.ccl = &cclspec; + setup_ccl_program (&cclspec.ccl, CODING_CCL_DECODER (coding)); + } do { EMACS_INT pos = coding->dst_pos + coding->produced_char; @@ -7165,9 +7158,10 @@ decode_coding (coding) coding->charbuf[i] = coding->charbuf[coding->charbuf_used - carryover + i]; } - while (coding->consumed < coding->src_bytes - && (coding->result == CODING_RESULT_SUCCESS - || coding->result == CODING_RESULT_INVALID_SRC)); + while (coding->result == CODING_RESULT_INSUFFICIENT_DST + || (coding->consumed < coding->src_bytes + && (coding->result == CODING_RESULT_SUCCESS + || coding->result == CODING_RESULT_INVALID_SRC))); if (carryover > 0) { -- 2.20.1