From: Richard M. Stallman Date: Mon, 13 Dec 1999 03:50:21 +0000 (+0000) Subject: (Fstart_kbd_macro): Handle case where last-kbd-macro X-Git-Tag: emacs-pretest-21.0.90~5782 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=f84db7d56a040a7e6bf21046d9a8970732eb71a1;p=emacs.git (Fstart_kbd_macro): Handle case where last-kbd-macro has been changed by the Lisp code. --- diff --git a/src/macros.c b/src/macros.c index a0212e1044a..5c37f0daa3d 100644 --- a/src/macros.c +++ b/src/macros.c @@ -90,10 +90,38 @@ Non-nil arg (prefix arg) means append to last macro defined;\n\ } 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;