changeset 107507:8960853cf85d

Fix the ccl encoder for the case that the output buffer is fullfilled.
author Kenichi Handa <handa@m17n.org>
date Tue, 16 Mar 2010 14:48:41 +0900
parents cd151730b160
children 21f4a7e7d29b 93ed6d3a6ac9
files src/ChangeLog src/coding.c
diffstat 2 files changed, 24 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Tue Mar 16 11:14:40 2010 +0900
+++ b/src/ChangeLog	Tue Mar 16 14:48:41 2010 +0900
@@ -2,6 +2,9 @@
 
 	* coding.c (decode_coding_ccl): Fix previous change for the
 	multibyte case.
+	(encode_coding_ccl): Don't setup ccl program here.  Fix for the
+	case that the output buffer is fullfilled.
+	(encode_coding): Setup ccl program here.
 
 2010-03-15  Andreas Politz  <politza@fh-trier.de>  (tiny change)
 
--- a/src/coding.c	Tue Mar 16 11:14:40 2010 +0900
+++ b/src/coding.c	Tue Mar 16 14:48:41 2010 +0900
@@ -5307,7 +5307,7 @@
 encode_coding_ccl (coding)
      struct coding_system *coding;
 {
-  struct ccl_program ccl;
+  struct ccl_program *ccl = &coding->spec.ccl->ccl;
   int multibytep = coding->dst_multibyte;
   int *charbuf = coding->charbuf;
   int *charbuf_end = charbuf + coding->charbuf_used;
@@ -5318,35 +5318,34 @@
   Lisp_Object attrs, charset_list;
 
   CODING_GET_INFO (coding, attrs, charset_list);
-  setup_ccl_program (&ccl, CODING_CCL_ENCODER (coding));
-
-  ccl.last_block = coding->mode & CODING_MODE_LAST_BLOCK;
-  ccl.dst_multibyte = coding->dst_multibyte;
+  if (coding->consumed_char == coding->src_chars
+      && coding->mode & CODING_MODE_LAST_BLOCK)
+    ccl->last_block = 1;
 
   while (charbuf < charbuf_end)
     {
-      ccl_driver (&ccl, charbuf, destination_charbuf,
+      ccl_driver (ccl, charbuf, destination_charbuf,
 		  charbuf_end - charbuf, 1024, charset_list);
       if (multibytep)
 	{
-	  ASSURE_DESTINATION (ccl.produced * 2);
-	  for (i = 0; i < ccl.produced; i++)
+	  ASSURE_DESTINATION (ccl->produced * 2);
+	  for (i = 0; i < ccl->produced; i++)
 	    EMIT_ONE_BYTE (destination_charbuf[i] & 0xFF);
 	}
       else
 	{
-	  ASSURE_DESTINATION (ccl.produced);
-	  for (i = 0; i < ccl.produced; i++)
+	  ASSURE_DESTINATION (ccl->produced);
+	  for (i = 0; i < ccl->produced; i++)
 	    *dst++ = destination_charbuf[i] & 0xFF;
-	  produced_chars += ccl.produced;
-	}
-      charbuf += ccl.consumed;
-      if (ccl.status == CCL_STAT_QUIT
-	  || ccl.status == CCL_STAT_INVALID_CMD)
+	  produced_chars += ccl->produced;
+	}
+      charbuf += ccl->consumed;
+      if (ccl->status == CCL_STAT_QUIT
+	  || ccl->status == CCL_STAT_INVALID_CMD)
 	break;
     }
 
-  switch (ccl.status)
+  switch (ccl->status)
     {
     case CCL_STAT_SUSPEND_BY_SRC:
       record_conversion_result (coding, CODING_RESULT_INSUFFICIENT_SRC);
@@ -7537,6 +7536,7 @@
   Lisp_Object attrs;
   Lisp_Object translation_table;
   int max_lookup;
+  struct ccl_spec cclspec;
 
   attrs = CODING_ID_ATTRS (coding->id);
   if (coding->encoder == encode_coding_raw_text)
@@ -7558,6 +7558,11 @@
 
   ALLOC_CONVERSION_WORK_AREA (coding);
 
+  if (coding->encoder == encode_coding_ccl)
+    {
+      coding->spec.ccl = &cclspec;
+      setup_ccl_program (&cclspec.ccl, CODING_CCL_ENCODER (coding));
+    }
   do {
     coding_set_source (coding);
     consume_chars (coding, translation_table, max_lookup);