Mercurial > emacs
changeset 107171:dfc03b454687
Fix the ccl decoder for the case that the output buffer is fullfilled.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Wed, 17 Feb 2010 15:47:32 +0900 |
parents | d0c70cf98fc8 |
children | 0d1117b6ae66 |
files | src/ChangeLog src/ccl.c src/coding.c |
diffstat | 3 files changed, 34 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Tue Feb 16 16:39:44 2010 +0900 +++ b/src/ChangeLog Wed Feb 17 15:47:32 2010 +0900 @@ -1,3 +1,13 @@ +2010-02-17 Kenichi Handa <handa@m17n.org> + + * 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 <jan.h.d@swipnet.se> * xterm.c (x_clear_frame_area): Call gtk_widget_queue_draw if USE_GTK,
--- a/src/ccl.c Tue Feb 16 16:39:44 2010 +0900 +++ b/src/ccl.c Wed Feb 17 15:47:32 2010 +0900 @@ -883,9 +883,6 @@ 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;
--- a/src/coding.c Tue Feb 16 16:39:44 2010 +0900 +++ b/src/coding.c Wed Feb 17 15:47:32 2010 +0900 @@ -5220,18 +5220,16 @@ 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 @@ 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 @@ Lisp_Object attrs; Lisp_Object undo_list; Lisp_Object translation_table; + struct ccl_spec cclspec; int carryover; int i; @@ -7149,6 +7137,11 @@ 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 @@ 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) {