Fix the ccl decoder for the case that the output buffer is fullfilled.
This commit is contained in:
parent
f1e0d76362
commit
d0396581d5
3 changed files with 33 additions and 32 deletions
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
52
src/coding.c
52
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)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue