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;