(executing_macro_iterations, executing_macro): New vars.

(Fexecute_kbd_macro): Set them.
This commit is contained in:
Richard M. Stallman 1996-08-29 04:38:05 +00:00
parent 77aa8edfb6
commit d4087e062b

View 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 ();
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);
}