emacs-diffs
[Top][All Lists]
Advanced

[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)
     {


reply via email to

[Prev in Thread] Current Thread [Next in Thread]