summaryrefslogtreecommitdiff
path: root/src/macros.c
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1996-08-29 04:38:05 +0000
committerRichard M. Stallman <rms@gnu.org>1996-08-29 04:38:05 +0000
commitd4087e062b692c7301fd932e835aa55d527bce49 (patch)
treebe8d532b22985e1e02ec8d733111b753fd4d793b /src/macros.c
parent77aa8edfb641b58ed7e10f1484f32a78dab49f76 (diff)
downloademacs-d4087e062b692c7301fd932e835aa55d527bce49.tar.gz
(executing_macro_iterations, executing_macro): New vars.
(Fexecute_kbd_macro): Set them.
Diffstat (limited to 'src/macros.c')
-rw-r--r--src/macros.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/macros.c b/src/macros.c
index 2b413d6d7d4..2592faeba19 100644
--- a/src/macros.c
+++ b/src/macros.c
@@ -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);
}