diff options
| author | Stefan Monnier | 2005-02-08 20:49:16 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2005-02-08 20:49:16 +0000 |
| commit | 3419757dfd171e5032b2f6bd69ce17a71800611b (patch) | |
| tree | 3a72bb8a92a42119f5237605a826a1b707befd89 /src/undo.c | |
| parent | e7eaabae699e4e3242ca71084fbbdbf461a2e3f5 (diff) | |
| download | emacs-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.c | 28 |
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)) |