]> git.eshelyaron.com Git - emacs.git/commitdiff
(subst_char_in_region_unwind): New function.
authorRichard M. Stallman <rms@gnu.org>
Thu, 19 Jan 1995 18:56:10 +0000 (18:56 +0000)
committerRichard M. Stallman <rms@gnu.org>
Thu, 19 Jan 1995 18:56:10 +0000 (18:56 +0000)
(Fsubst_char_in_region): Use it to make undo_list t temporarily.

src/editfns.c

index 657aca333f95fd8374118b48e926858b05cac512..6abbe0e9a2642fefb5c97f8f034c0eafcc3bd2fc 100644 (file)
@@ -1266,6 +1266,13 @@ determines whether case is significant or ignored.")
   return make_number (0);
 }
 \f
+static Lisp_Object
+subst_char_in_region_unwind (arg)
+     Lisp_Object arg;
+{
+  return current_buffer->undo_list = arg;
+}
+
 DEFUN ("subst-char-in-region", Fsubst_char_in_region,
   Ssubst_char_in_region, 4, 5, 0,
   "From START to END, replace FROMCHAR with TOCHAR each time it occurs.\n\
@@ -1276,6 +1283,7 @@ and don't mark the buffer as really changed.")
 {
   register int pos, stop, look;
   int changed = 0;
+  int count = specpdl_ptr - specpdl;
 
   validate_region (&start, &end);
   CHECK_NUMBER (fromchar, 2);
@@ -1285,6 +1293,16 @@ and don't mark the buffer as really changed.")
   stop = XINT (end);
   look = XINT (fromchar);
 
+  /* If we don't want undo, turn off putting stuff on the list.
+     That's faster than getting rid of things,
+     and it prevents even the entry for a first change.  */
+  if (!NILP (noundo))
+    {
+      record_unwind_protect (subst_char_in_region_unwind,
+                            current_buffer->undo_list);
+      current_buffer->undo_list = Qt;
+    }
+
   while (pos < stop)
     {
       if (FETCH_CHAR (pos) == look)
@@ -1315,6 +1333,7 @@ and don't mark the buffer as really changed.")
     signal_after_change (XINT (start),
                         stop - XINT (start), stop - XINT (start));
 
+  unbind_to (count, Qnil);
   return Qnil;
 }