diff src/editfns.c @ 10480:fbb254882b9f

(subst_char_in_region_unwind): New function. (Fsubst_char_in_region): Use it to make undo_list t temporarily.
author Richard M. Stallman <rms@gnu.org>
date Thu, 19 Jan 1995 18:56:10 +0000
parents a7fe0fb11314
children 9ab21ef32537
line wrap: on
line diff
--- a/src/editfns.c	Thu Jan 19 18:50:26 1995 +0000
+++ b/src/editfns.c	Thu Jan 19 18:56:10 1995 +0000
@@ -1266,6 +1266,13 @@
   return make_number (0);
 }
 
+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 @@
 {
   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 @@
   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 @@
     signal_after_change (XINT (start),
 			 stop - XINT (start), stop - XINT (start));
 
+  unbind_to (count, Qnil);
   return Qnil;
 }