]> code.delx.au - gnu-emacs/commitdiff
merge trunk
authorKenichi Handa <handa@gnu.org>
Sun, 30 Sep 2012 14:39:46 +0000 (23:39 +0900)
committerKenichi Handa <handa@gnu.org>
Sun, 30 Sep 2012 14:39:46 +0000 (23:39 +0900)
src/ChangeLog
src/coding.c

index 6aaa6bc88f8b952a5233f1b89346aabce4060685..f69ab42bd90eb7e0ca8142abec6621a04960c68c 100644 (file)
@@ -1,3 +1,8 @@
+2012-09-30  Kenichi Handa  <handa@gnu.org>
+
+       * coding.c (decode_coding_ccl, encode_coding_ccl): Pay attention
+       to the buffer relocation which may be caused by ccl_driver.
+
 2012-09-30  Jan Djärv  <jan.h.d@swipnet.se>
 
        * nsfns.m (ns_frame_parm_handlers): Add x_set_fullscreen.
index 13f53ad5abc4cc7c8a576dba8b29995e4098ce79..32d300b99231cbc32343ace5e80240f919f74a27 100644 (file)
@@ -5059,6 +5059,7 @@ decode_coding_ccl (struct coding_system *coding)
   while (1)
     {
       const unsigned char *p = src;
+      ptrdiff_t offset;
       int i = 0;
 
       if (multibytep)
@@ -5076,8 +5077,17 @@ decode_coding_ccl (struct coding_system *coding)
 
       if (p == src_end && coding->mode & CODING_MODE_LAST_BLOCK)
        ccl->last_block = 1;
+      /* As ccl_driver calls DECODE_CHAR, buffer may be relocated.  */
+      charset_map_loaded = 0;
       ccl_driver (ccl, source_charbuf, charbuf, i, charbuf_end - charbuf,
                  charset_list);
+      if (charset_map_loaded
+         && (offset = coding_change_source (coding)))
+       {
+         p += offset;
+         src += offset;
+         src_end += offset;
+       }
       charbuf += ccl->produced;
       if (multibytep)
        src += source_byteidx[ccl->consumed];
@@ -5130,8 +5140,15 @@ encode_coding_ccl (struct coding_system *coding)
 
   do
     {
+      ptrdiff_t offset;
+
+      /* As ccl_driver calls DECODE_CHAR, buffer may be relocated.  */
+      charset_map_loaded = 0;
       ccl_driver (ccl, charbuf, destination_charbuf,
                  charbuf_end - charbuf, 1024, charset_list);
+      if (charset_map_loaded
+         && (offset = coding_change_destination (coding)))
+       dst += offset;
       if (multibytep)
        {
          ASSURE_DESTINATION (ccl->produced * 2);