]> code.delx.au - gnu-emacs/commitdiff
(code_convert_region_unwind): Argument format changed.
authorKenichi Handa <handa@m17n.org>
Wed, 14 Sep 2005 07:06:20 +0000 (07:06 +0000)
committerKenichi Handa <handa@m17n.org>
Wed, 14 Sep 2005 07:06:20 +0000 (07:06 +0000)
(run_pre_post_conversion_on_str): If pre-write-conversion function
changed the current buffer, delete the new buffer.
(run_pre_write_conversin_on_c_str): Likewise.

src/ChangeLog
src/coding.c

index 44fcf21a2426f78c89ce4ebd6c54e361cabded59..7ec41e85fe276c90ad6c907667c0d3637e9d605f 100644 (file)
@@ -1,5 +1,10 @@
 2005-09-14  Kenichi Handa  <handa@m17n.org>
 
+       * coding.c (code_convert_region_unwind): Argument format changed.
+       (run_pre_post_conversion_on_str): If pre-write-conversion function
+       changed the current buffer, delete the new buffer.
+       (run_pre_write_conversin_on_c_str): Likewise.
+
        * fileio.c (Fexpand_file_name): Check multibyteness of
        default_directory.
 
index 794f49495fb259723452deb7532d92cf2cf82e0c..fa9a37b94527aa18d5ff205d678ca67cc020f640 100644 (file)
@@ -5353,8 +5353,8 @@ static int shrink_conversion_region_threshhold = 1024;
       }                                                                        \
   } while (0)
 
-/* ARG is (CODING . BUFFER) where CODING is what to be set in
-   Vlast_coding_system_used and BUFFER if non-nil is a buffer to
+/* ARG is (CODING BUFFER ...) where CODING is what to be set in
+   Vlast_coding_system_used and the remaining elements are buffers to
    kill.  */
 static Lisp_Object
 code_convert_region_unwind (arg)
@@ -5362,8 +5362,8 @@ code_convert_region_unwind (arg)
 {
   inhibit_pre_post_conversion = 0;
   Vlast_coding_system_used = XCAR (arg);
-  if (! NILP (XCDR (arg)))
-    Fkill_buffer (XCDR (arg));
+  for (arg = XCDR (arg); ! NILP (arg); arg = XCDR (arg))
+    Fkill_buffer (XCAR (arg));
   return Qnil;
 }
 
@@ -6081,6 +6081,7 @@ run_pre_post_conversion_on_str (str, coding, encodep)
   int multibyte = STRING_MULTIBYTE (str);
   Lisp_Object old_deactivate_mark;
   Lisp_Object buffer_to_kill;
+  Lisp_Object unwind_arg;
 
   record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
   /* It is not crucial to specbind this.  */
@@ -6091,15 +6092,25 @@ run_pre_post_conversion_on_str (str, coding, encodep)
      unibyte<->multibyte conversion.  For that, we adjust the
      multibyteness of the working buffer to that of STR.  */
   buffer_to_kill = set_conversion_work_buffer (multibyte);
-  record_unwind_protect (code_convert_region_unwind,
-                        Fcons (Vlast_coding_system_used, buffer_to_kill));
+  if (NILP (buffer_to_kill))
+    unwind_arg = Fcons (Vlast_coding_system_used, Qnil);
+  else
+    unwind_arg = list2 (Vlast_coding_system_used, buffer_to_kill);
+  record_unwind_protect (code_convert_region_unwind, unwind_arg);
 
   insert_from_string (str, 0, 0,
                      SCHARS (str), SBYTES (str), 0);
   UNGCPRO;
   inhibit_pre_post_conversion = 1;
   if (encodep)
-    call2 (coding->pre_write_conversion, make_number (BEG), make_number (Z));
+    {
+      struct buffer *prev = current_buffer;
+
+      call2 (coding->pre_write_conversion, make_number (BEG), make_number (Z));
+      if (prev != current_buffer)
+       /* We must kill the current buffer too.  */
+       Fsetcdr (unwind_arg, Fcons (Fcurrent_buffer (), XCDR (unwind_arg)));
+    }
   else
     {
       Vlast_coding_system_used = coding->symbol;
@@ -6133,6 +6144,7 @@ run_pre_write_conversin_on_c_str (str, size, nchars, nbytes, coding)
 {
   struct gcpro gcpro1, gcpro2;
   struct buffer *cur = current_buffer;
+  struct buffer *prev;
   Lisp_Object old_deactivate_mark, old_last_coding_system_used;
   Lisp_Object args[3];
   Lisp_Object buffer_to_kill;
@@ -6149,6 +6161,7 @@ run_pre_write_conversin_on_c_str (str, size, nchars, nbytes, coding)
   insert_1_both (*str, nchars, nbytes, 0, 0, 0);
   UNGCPRO;
   inhibit_pre_post_conversion = 1;
+  prev = current_buffer;
   args[0] = coding->pre_write_conversion;
   args[1] = make_number (BEG);
   args[2] = make_number (Z);
@@ -6168,6 +6181,8 @@ run_pre_write_conversin_on_c_str (str, size, nchars, nbytes, coding)
   bcopy (BEG_ADDR, *str, coding->produced);
   coding->src_multibyte
     = ! NILP (current_buffer->enable_multibyte_characters);
+  if (prev != current_buffer)
+    Fkill_buffer (Fcurrent_buffer ());
   set_buffer_internal (cur);
   if (! NILP (buffer_to_kill))
     Fkill_buffer (buffer_to_kill);