# HG changeset patch # User Richard M. Stallman # Date 790541770 0 # Node ID fbb254882b9fbffb4919e77ddee6fdd617b00d64 # Parent f2f290b1341353ae60bb538a3f74b5000c34b7bf (subst_char_in_region_unwind): New function. (Fsubst_char_in_region): Use it to make undo_list t temporarily. diff -r f2f290b13413 -r fbb254882b9f src/editfns.c --- 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; }