]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix the ccl decoder for the case that the output buffer is fullfilled.
authorKenichi Handa <handa@m17n.org>
Wed, 17 Feb 2010 06:47:32 +0000 (15:47 +0900)
committerKenichi Handa <handa@m17n.org>
Wed, 17 Feb 2010 06:47:32 +0000 (15:47 +0900)
src/ChangeLog
src/ccl.c
src/coding.c

index c6de809eb81a14bab041dedfd3d8b3ea0865e9f4..1143ea96633e79d8938c027d040039536a820df4 100644 (file)
@@ -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,
index bc3cfe09b77118bf78e73c4e51bb59c3d64bd659..c5523c2d44f71c244140f34d58d1dea231b3dc68 100644 (file)
--- a/src/ccl.c
+++ b/src/ccl.c
@@ -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;
 
index 935d32e6a5873f2354d7c9cb61c4ef72f499bc35..879cae5619419486c11c81c856c994e9d8421d44 100644 (file)
@@ -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)
     {