aboutsummaryrefslogtreecommitdiffstats
path: root/src/undo.c
diff options
context:
space:
mode:
authorStefan Monnier2005-02-08 20:49:16 +0000
committerStefan Monnier2005-02-08 20:49:16 +0000
commit3419757dfd171e5032b2f6bd69ce17a71800611b (patch)
tree3a72bb8a92a42119f5237605a826a1b707befd89 /src/undo.c
parente7eaabae699e4e3242ca71084fbbdbf461a2e3f5 (diff)
downloademacs-3419757dfd171e5032b2f6bd69ce17a71800611b.tar.gz
emacs-3419757dfd171e5032b2f6bd69ce17a71800611b.zip
(Fprimitive_undo): Check veracity of delta,start,end.
Diffstat (limited to 'src/undo.c')
-rw-r--r--src/undo.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/undo.c b/src/undo.c
index 5483060eb48..86237e2c59a 100644
--- a/src/undo.c
+++ b/src/undo.c
@@ -556,16 +556,32 @@ Return what remains of the list. */)
556 } 556 }
557 else if (EQ (car, Qapply)) 557 else if (EQ (car, Qapply))
558 { 558 {
559 /* Element (apply FUNNAME . ARGS) means call FUNNAME to undo. */ 559 /* Element (apply FUN . ARGS) means call FUN to undo. */
560 car = Fcar (cdr); 560 car = Fcar (cdr);
561 cdr = Fcdr (cdr);
561 if (INTEGERP (car)) 562 if (INTEGERP (car))
562 { 563 {
563 /* Long format: (apply DELTA START END FUNNAME . ARGS). */ 564 /* Long format: (apply DELTA START END FUN . ARGS). */
564 cdr = Fcdr (Fcdr (Fcdr (cdr))); 565 Lisp_Object delta = car;
565 car = Fcar (cdr); 566 Lisp_Object start = Fcar (cdr);
567 Lisp_Object end = Fcar (Fcdr (cdr));
568 Lisp_Object start_mark = Fcopy_marker (start, Qnil);
569 Lisp_Object end_mark = Fcopy_marker (end, Qt);
570
571 cdr = Fcdr (Fcdr (cdr));
572 apply1 (Fcar (cdr), Fcdr (cdr));
573
574 /* Check that the function did what the entry said it
575 would do. */
576 if (!EQ (start, Fmarker_position (start_mark))
577 || (XINT (delta) + XINT (end)
578 != marker_position (end_mark)))
579 error ("Changes to be undone by function different than announced");
580 Fset_marker (start_mark, Qnil, Qnil);
581 Fset_marker (end_mark, Qnil, Qnil);
566 } 582 }
567 cdr = Fcdr (cdr); 583 else
568 apply1 (car, cdr); 584 apply1 (car, cdr);
569 did_apply = 1; 585 did_apply = 1;
570 } 586 }
571 else if (STRINGP (car) && INTEGERP (cdr)) 587 else if (STRINGP (car) && INTEGERP (cdr))