diff options
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)) |