changeset 107173:43af18bee02b

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:52:12 +0900
parents 1f564d6c5e1d (current diff) 0d1117b6ae66 (diff)
children 6e6072f0c0a2 26b8483edca9
files
diffstat 3 files changed, 34 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Tue Feb 16 17:03:29 2010 +0100
+++ b/src/ChangeLog	Wed Feb 17 15:52:12 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 17:03:29 2010 +0100
+++ b/src/ccl.c	Wed Feb 17 15:52:12 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 17:03:29 2010 +0100
+++ b/src/coding.c	Wed Feb 17 15:52:12 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)
     {