Mercurial > emacs
changeset 26825:66dfce1feb9c
(Fstart_kbd_macro): Handle case where last-kbd-macro
has been changed by the Lisp code.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Mon, 13 Dec 1999 03:50:21 +0000 |
parents | cfad7bbf8187 |
children | 8f36e5feb992 |
files | src/macros.c |
diffstat | 1 files changed, 30 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/macros.c Mon Dec 13 03:50:00 1999 +0000 +++ b/src/macros.c Mon Dec 13 03:50:21 1999 +0000 @@ -90,10 +90,38 @@ } else { - message ("Appending to kbd macro..."); - current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end; + int i, len; + + /* Check the type of last-kbd-macro in case Lisp code changed it. */ + if (!STRINGP (current_kboard->Vlast_kbd_macro) + && !VECTORP (current_kboard->Vlast_kbd_macro)) + current_kboard->Vlast_kbd_macro + = wrong_type_argument (Qarrayp, current_kboard->Vlast_kbd_macro); + + len = XINT (Flength (current_kboard->Vlast_kbd_macro)); + + /* Copy last-kbd-macro into the buffer, in case the Lisp code + has put another macro there. */ + if (current_kboard->kbd_macro_bufsize < len + 30) + { + current_kboard->kbd_macro_bufsize = len + 30; + current_kboard->kbd_macro_buffer + = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer, + (len + 30) * sizeof (Lisp_Object)); + } + for (i = 0; i < len; i++) + current_kboard->kbd_macro_buffer[i] + = Faref (current_kboard->Vlast_kbd_macro, make_number (i)); + + current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer + len; + current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr; + + /* Re-execute the macro we are appending to, + for consistency of behavior. */ Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, make_number (1)); + + message ("Appending to kbd macro..."); } current_kboard->defining_kbd_macro = Qt;