[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] /srv/bzr/emacs/trunk r99512: Fix the ccl decoder for the c
From: |
Kenichi Handa |
Subject: |
[Emacs-diffs] /srv/bzr/emacs/trunk r99512: Fix the ccl decoder for the case that the output buffer is fullfilled. |
Date: |
Wed, 17 Feb 2010 15:52:12 +0900 |
User-agent: |
Bazaar (2.0.3) |
------------------------------------------------------------
revno: 99512 [merge]
committer: Kenichi Handa <address@hidden>
branch nick: trunk
timestamp: Wed 2010-02-17 15:52:12 +0900
message:
Fix the ccl decoder for the case that the output buffer is fullfilled.
modified:
src/ChangeLog
src/ccl.c
src/coding.c
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog 2010-02-13 13:27:32 +0000
+++ b/src/ChangeLog 2010-02-17 06:47:32 +0000
@@ -1,3 +1,13 @@
+2010-02-17 Kenichi Handa <address@hidden>
+
+ * 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 <address@hidden>
* xterm.c (x_clear_frame_area): Call gtk_widget_queue_draw if USE_GTK,
=== modified file 'src/ccl.c'
--- a/src/ccl.c 2010-02-14 17:32:16 +0000
+++ b/src/ccl.c 2010-02-17 06:47:32 +0000
@@ -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;
=== modified file 'src/coding.c'
--- a/src/coding.c 2010-01-20 02:33:52 +0000
+++ b/src/coding.c 2010-02-17 06:47:32 +0000
@@ -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)
{
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] /srv/bzr/emacs/trunk r99512: Fix the ccl decoder for the case that the output buffer is fullfilled.,
Kenichi Handa <=