]> code.delx.au - gnu-emacs/commitdiff
(executing_macro_iterations, executing_macro): New vars.
authorRichard M. Stallman <rms@gnu.org>
Thu, 29 Aug 1996 04:38:05 +0000 (04:38 +0000)
committerRichard M. Stallman <rms@gnu.org>
Thu, 29 Aug 1996 04:38:05 +0000 (04:38 +0000)
(Fexecute_kbd_macro): Set them.

src/macros.c

index 2b413d6d7d4d86943fa56e5695706a54b9737e62..2592faeba19217906665480fd3a311946321c834 100644 (file)
@@ -29,9 +29,28 @@ Boston, MA 02111-1307, USA.  */
 
 Lisp_Object Qexecute_kbd_macro;
 
+/* Kbd macro currently being executed (a string or vector).  */
+
 Lisp_Object Vexecuting_macro;
+
+/* Index of next character to fetch from that macro.  */
+
 int executing_macro_index;
 
+/* Number of successful iterations so far
+   for innermost keyboard macro.
+   This is not bound at each level,
+   so after an error, it describes the innermost interrupted macro.  */
+
+int executing_macro_iterations;
+
+/* This is the macro that was executing.
+   This is not bound at each level,
+   so after an error, it describes the innermost interrupted macro.
+   We use it only as a kind of flag, so no need to protect it.  */
+
+Lisp_Object executing_macro;
+
 Lisp_Object Fexecute_kbd_macro ();
 \f
 DEFUN ("start-kbd-macro", Fstart_kbd_macro, Sstart_kbd_macro, 1, 1, "P",
@@ -196,6 +215,7 @@ defining others, use \\[name-last-kbd-macro].")
 
 /* Restore Vexecuting_macro and executing_macro_index - called when
    the unwind-protect in Fexecute_kbd_macro gets invoked.  */
+
 static Lisp_Object
 pop_kbd_macro (info)
      Lisp_Object info;
@@ -219,6 +239,7 @@ COUNT is a repeat count, or nil for once, or 0 for infinite loop.")
   int pdlcount = specpdl_ptr - specpdl;
   int repeat = 1;
   struct gcpro gcpro1;
+  int success_count = 0;
 
   if (!NILP (count))
     {
@@ -238,16 +259,21 @@ COUNT is a repeat count, or nil for once, or 0 for infinite loop.")
   do
     {
       Vexecuting_macro = final;
+      executing_macro = final;
       executing_macro_index = 0;
 
       current_kboard->Vprefix_arg = Qnil;
       command_loop_1 ();
 
+      executing_macro_iterations = ++success_count;
+
       QUIT;
     }
   while (--repeat
         && (STRINGP (Vexecuting_macro) || VECTORP (Vexecuting_macro)));
 
+  executing_macro = Qnil;
+
   UNGCPRO;
   return unbind_to (pdlcount, Qnil);
 }