New unwind-protect flavors to better type-check C callbacks.
[bpt/emacs.git] / src / macros.c
CommitLineData
5a7f5d07 1/* Keyboard macros.
bb1c6663 2
ab422c4d 3Copyright (C) 1985-1986, 1993, 2000-2013 Free Software Foundation, Inc.
5a7f5d07
JB
4
5This file is part of GNU Emacs.
6
9ec0b715 7GNU Emacs is free software: you can redistribute it and/or modify
5a7f5d07 8it under the terms of the GNU General Public License as published by
9ec0b715
GM
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
5a7f5d07
JB
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9ec0b715 18along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
5a7f5d07
JB
19
20
18160b98 21#include <config.h>
0328b6de 22
5a7f5d07
JB
23#include "lisp.h"
24#include "macros.h"
25#include "commands.h"
e5560ff7 26#include "character.h"
5a7f5d07
JB
27#include "buffer.h"
28#include "window.h"
077d751f 29#include "keyboard.h"
5a7f5d07 30
6e65b9cc 31static Lisp_Object Qexecute_kbd_macro;
955cbe7b 32static Lisp_Object Qkbd_macro_termination_hook;
5a7f5d07 33
d4087e06
RS
34/* Number of successful iterations so far
35 for innermost keyboard macro.
36 This is not bound at each level,
37 so after an error, it describes the innermost interrupted macro. */
38
48e30793 39EMACS_INT executing_kbd_macro_iterations;
d4087e06
RS
40
41/* This is the macro that was executing.
42 This is not bound at each level,
43 so after an error, it describes the innermost interrupted macro.
44 We use it only as a kind of flag, so no need to protect it. */
45
649d952d 46Lisp_Object executing_kbd_macro;
d4087e06 47
971de7fb 48Lisp_Object Fexecute_kbd_macro (Lisp_Object macro, Lisp_Object count, Lisp_Object loopfunc);
5a7f5d07 49\f
f90d3a6b 50DEFUN ("start-kbd-macro", Fstart_kbd_macro, Sstart_kbd_macro, 1, 2, "P",
70da46c3
PJ
51 doc: /* Record subsequent keyboard input, defining a keyboard macro.
52The commands are recorded even as they are executed.
53Use \\[end-kbd-macro] to finish recording and make the macro available.
54Use \\[name-last-kbd-macro] to give it a permanent name.
55Non-nil arg (prefix arg) means append to last macro defined;
f90d3a6b 56this begins by re-executing that macro as if you typed it again.
177c0ea7 57If optional second arg, NO-EXEC, is non-nil, do not re-execute last
f90d3a6b 58macro before appending to it. */)
5842a27b 59 (Lisp_Object append, Lisp_Object no_exec)
5a7f5d07 60{
1344aad4 61 if (!NILP (KVAR (current_kboard, defining_kbd_macro)))
5a7f5d07
JB
62 error ("Already defining kbd macro");
63
cd8b5aa3 64 if (!current_kboard->kbd_macro_buffer)
8b97da83 65 {
663e2b3f 66 current_kboard->kbd_macro_buffer = xmalloc (30 * word_size);
c86960f0 67 current_kboard->kbd_macro_bufsize = 30;
8b97da83 68 }
5a7f5d07 69 update_mode_lines++;
265a9e55 70 if (NILP (append))
5a7f5d07 71 {
9e7c370a
KH
72 if (current_kboard->kbd_macro_bufsize > 200)
73 {
9e7c370a 74 current_kboard->kbd_macro_buffer
98c6f1e3 75 = xrealloc (current_kboard->kbd_macro_buffer,
663e2b3f 76 30 * word_size);
6d84508d 77 current_kboard->kbd_macro_bufsize = 30;
9e7c370a 78 }
cd8b5aa3
KH
79 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer;
80 current_kboard->kbd_macro_end = current_kboard->kbd_macro_buffer;
2f73da9c 81 message1 ("Defining kbd macro...");
5a7f5d07
JB
82 }
83 else
84 {
6d84508d
PE
85 ptrdiff_t i;
86 EMACS_INT len;
7cded46f 87 bool cvt;
f84db7d5
RS
88
89 /* Check the type of last-kbd-macro in case Lisp code changed it. */
1344aad4 90 CHECK_VECTOR_OR_STRING (KVAR (current_kboard, Vlast_kbd_macro));
f84db7d5 91
1344aad4 92 len = XINT (Flength (KVAR (current_kboard, Vlast_kbd_macro)));
f84db7d5
RS
93
94 /* Copy last-kbd-macro into the buffer, in case the Lisp code
95 has put another macro there. */
96 if (current_kboard->kbd_macro_bufsize < len + 30)
97 {
d311d28c
PE
98 if (PTRDIFF_MAX < MOST_POSITIVE_FIXNUM + 30
99 && PTRDIFF_MAX < len + 30)
6d84508d 100 memory_full (SIZE_MAX);
d311d28c
PE
101 current_kboard->kbd_macro_buffer =
102 xpalloc (current_kboard->kbd_macro_buffer,
103 &current_kboard->kbd_macro_bufsize,
104 len + 30 - current_kboard->kbd_macro_bufsize, -1,
105 sizeof *current_kboard->kbd_macro_buffer);
f84db7d5 106 }
295fff2c
KS
107
108 /* Must convert meta modifier when copying string to vector. */
1344aad4 109 cvt = STRINGP (KVAR (current_kboard, Vlast_kbd_macro));
f84db7d5 110 for (i = 0; i < len; i++)
295fff2c
KS
111 {
112 Lisp_Object c;
1344aad4 113 c = Faref (KVAR (current_kboard, Vlast_kbd_macro), make_number (i));
3499aebf
SM
114 if (cvt && NATNUMP (c) && (XFASTINT (c) & 0x80))
115 XSETFASTINT (c, CHAR_META | (XFASTINT (c) & ~0x80));
295fff2c
KS
116 current_kboard->kbd_macro_buffer[i] = c;
117 }
f84db7d5
RS
118
119 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer + len;
120 current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr;
121
122 /* Re-execute the macro we are appending to,
123 for consistency of behavior. */
f90d3a6b 124 if (NILP (no_exec))
1344aad4 125 Fexecute_kbd_macro (KVAR (current_kboard, Vlast_kbd_macro),
f90d3a6b 126 make_number (1), Qnil);
f84db7d5 127
2f73da9c 128 message1 ("Appending to kbd macro...");
5a7f5d07 129 }
15dbb4d6 130 kset_defining_kbd_macro (current_kboard, Qt);
177c0ea7 131
5a7f5d07
JB
132 return Qnil;
133}
134
eeb8fc0d
KS
135/* Finish defining the current keyboard macro. */
136
137void
971de7fb 138end_kbd_macro (void)
eeb8fc0d 139{
15dbb4d6 140 kset_defining_kbd_macro (current_kboard, Qnil);
eeb8fc0d 141 update_mode_lines++;
15dbb4d6
PE
142 kset_last_kbd_macro
143 (current_kboard,
144 make_event_array ((current_kboard->kbd_macro_end
145 - current_kboard->kbd_macro_buffer),
146 current_kboard->kbd_macro_buffer));
eeb8fc0d
KS
147}
148
f90d3a6b 149DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 2, "p",
70da46c3
PJ
150 doc: /* Finish defining a keyboard macro.
151The definition was started by \\[start-kbd-macro].
152The macro is now available for use via \\[call-last-kbd-macro],
153or it can be given a name with \\[name-last-kbd-macro] and then invoked
154under that name.
155
156With numeric arg, repeat macro now that many times,
157counting the definition just completed as the first repetition.
f90d3a6b
KS
158An argument of zero means repeat until error.
159
177c0ea7 160In Lisp, optional second arg LOOPFUNC may be a function that is called prior to
f90d3a6b 161each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */)
5842a27b 162 (Lisp_Object repeat, Lisp_Object loopfunc)
5a7f5d07 163{
1344aad4 164 if (NILP (KVAR (current_kboard, defining_kbd_macro)))
d86ad277 165 error ("Not defining kbd macro");
5a7f5d07 166
86a3ca5e
EN
167 if (NILP (repeat))
168 XSETFASTINT (repeat, 1);
5a7f5d07 169 else
b7826503 170 CHECK_NUMBER (repeat);
5a7f5d07 171
1344aad4 172 if (!NILP (KVAR (current_kboard, defining_kbd_macro)))
5a7f5d07 173 {
eeb8fc0d 174 end_kbd_macro ();
2f73da9c 175 message1 ("Keyboard macro defined");
5a7f5d07
JB
176 }
177
86a3ca5e 178 if (XFASTINT (repeat) == 0)
1344aad4 179 Fexecute_kbd_macro (KVAR (current_kboard, Vlast_kbd_macro), repeat, loopfunc);
48e30793 180 else if (XINT (repeat) > 1)
5a7f5d07 181 {
2f73da9c 182 XSETINT (repeat, XINT (repeat) - 1);
48e30793
PE
183 Fexecute_kbd_macro (KVAR (current_kboard, Vlast_kbd_macro),
184 repeat, loopfunc);
5a7f5d07
JB
185 }
186 return Qnil;
187}
188
2f73da9c 189/* Store character c into kbd macro being defined. */
5a7f5d07 190
c3fd8dd5 191void
971de7fb 192store_kbd_macro_char (Lisp_Object c)
5a7f5d07 193{
08e1d6df
GM
194 struct kboard *kb = current_kboard;
195
1344aad4 196 if (!NILP (KVAR (kb, defining_kbd_macro)))
5a7f5d07 197 {
08e1d6df 198 if (kb->kbd_macro_ptr - kb->kbd_macro_buffer == kb->kbd_macro_bufsize)
5a7f5d07 199 {
6d84508d 200 ptrdiff_t ptr_offset, end_offset, nbytes;
177c0ea7 201
08e1d6df
GM
202 ptr_offset = kb->kbd_macro_ptr - kb->kbd_macro_buffer;
203 end_offset = kb->kbd_macro_end - kb->kbd_macro_buffer;
6d84508d
PE
204 if (min (PTRDIFF_MAX, SIZE_MAX) / sizeof *kb->kbd_macro_buffer / 2
205 < kb->kbd_macro_bufsize)
206 memory_full (SIZE_MAX);
c86960f0 207 nbytes = kb->kbd_macro_bufsize * (2 * sizeof *kb->kbd_macro_buffer);
38182d90 208 kb->kbd_macro_buffer = xrealloc (kb->kbd_macro_buffer, nbytes);
6d84508d 209 kb->kbd_macro_bufsize *= 2;
08e1d6df
GM
210 kb->kbd_macro_ptr = kb->kbd_macro_buffer + ptr_offset;
211 kb->kbd_macro_end = kb->kbd_macro_buffer + end_offset;
5a7f5d07 212 }
177c0ea7 213
08e1d6df 214 *kb->kbd_macro_ptr++ = c;
5a7f5d07
JB
215 }
216}
217
218/* Declare that all chars stored so far in the kbd macro being defined
219 really belong to it. This is done in between editor commands. */
220
c3fd8dd5 221void
971de7fb 222finalize_kbd_macro_chars (void)
5a7f5d07 223{
cd8b5aa3 224 current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr;
5a7f5d07 225}
199afd29 226
a7ca3326 227DEFUN ("cancel-kbd-macro-events", Fcancel_kbd_macro_events,
199afd29 228 Scancel_kbd_macro_events, 0, 0, 0,
70da46c3 229 doc: /* Cancel the events added to a keyboard macro for this command. */)
5842a27b 230 (void)
199afd29
RS
231{
232 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end;
6bbd7a29 233 return Qnil;
199afd29 234}
2d5f65a9
KH
235
236DEFUN ("store-kbd-macro-event", Fstore_kbd_macro_event,
237 Sstore_kbd_macro_event, 1, 1, 0,
70da46c3 238 doc: /* Store EVENT into the keyboard macro being defined. */)
5842a27b 239 (Lisp_Object event)
2d5f65a9
KH
240{
241 store_kbd_macro_char (event);
242 return Qnil;
243}
5a7f5d07
JB
244\f
245DEFUN ("call-last-kbd-macro", Fcall_last_kbd_macro, Scall_last_kbd_macro,
f90d3a6b 246 0, 2, "p",
70da46c3
PJ
247 doc: /* Call the last keyboard macro that you defined with \\[start-kbd-macro].
248
249A prefix argument serves as a repeat count. Zero means repeat until error.
250
251To make a macro permanent so you can call it even after
177c0ea7 252defining others, use \\[name-last-kbd-macro].
f90d3a6b 253
177c0ea7 254In Lisp, optional second arg LOOPFUNC may be a function that is called prior to
f90d3a6b 255each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */)
5842a27b 256 (Lisp_Object prefix, Lisp_Object loopfunc)
5a7f5d07 257{
4315204e
RS
258 /* Don't interfere with recognition of the previous command
259 from before this macro started. */
1344aad4 260 Vthis_command = KVAR (current_kboard, Vlast_command);
80184dac 261 /* C-x z after the macro should repeat the macro. */
f2d6a3df 262 Vreal_this_command = KVAR (current_kboard, Vlast_kbd_macro);
4315204e 263
1344aad4 264 if (! NILP (KVAR (current_kboard, defining_kbd_macro)))
5a7f5d07 265 error ("Can't execute anonymous macro while defining one");
1344aad4 266 else if (NILP (KVAR (current_kboard, Vlast_kbd_macro)))
5a7f5d07
JB
267 error ("No kbd macro has been defined");
268 else
1344aad4 269 Fexecute_kbd_macro (KVAR (current_kboard, Vlast_kbd_macro), prefix, loopfunc);
4315204e
RS
270
271 /* command_loop_1 sets this to nil before it returns;
272 get back the last command within the macro
273 so that it can be last, again, after we return. */
1344aad4 274 Vthis_command = KVAR (current_kboard, Vlast_command);
4315204e 275
5a7f5d07
JB
276 return Qnil;
277}
278
649d952d
KS
279/* Restore Vexecuting_kbd_macro and executing_kbd_macro_index.
280 Called when the unwind-protect in Fexecute_kbd_macro gets invoked. */
d4087e06 281
27e498e6 282static void
971de7fb 283pop_kbd_macro (Lisp_Object info)
5a7f5d07
JB
284{
285 Lisp_Object tem;
524ed533 286 Vexecuting_kbd_macro = XCAR (info);
80184dac 287 tem = XCDR (info);
649d952d 288 executing_kbd_macro_index = XINT (XCAR (tem));
f2d6a3df 289 Vreal_this_command = XCDR (tem);
2136b408 290 Frun_hooks (1, &Qkbd_macro_termination_hook);
5a7f5d07
JB
291}
292
a7ca3326 293DEFUN ("execute-kbd-macro", Fexecute_kbd_macro, Sexecute_kbd_macro, 1, 3, 0,
70da46c3
PJ
294 doc: /* Execute MACRO as string of editor command characters.
295If MACRO is a symbol, its function definition is used.
177c0ea7 296COUNT is a repeat count, or nil for once, or 0 for infinite loop.
f90d3a6b 297
177c0ea7 298Optional third arg LOOPFUNC may be a function that is called prior to
f90d3a6b 299each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */)
5842a27b 300 (Lisp_Object macro, Lisp_Object count, Lisp_Object loopfunc)
5a7f5d07
JB
301{
302 Lisp_Object final;
303 Lisp_Object tem;
d311d28c 304 ptrdiff_t pdlcount = SPECPDL_INDEX ();
48e30793 305 EMACS_INT repeat = 1;
f90d3a6b 306 struct gcpro gcpro1, gcpro2;
48e30793 307 EMACS_INT success_count = 0;
5a7f5d07 308
649d952d 309 executing_kbd_macro_iterations = 0;
4b7da890 310
1c8c5693
EN
311 if (!NILP (count))
312 {
313 count = Fprefix_numeric_value (count);
314 repeat = XINT (count);
315 }
5a7f5d07 316
502ddf23 317 final = indirect_function (macro);
65346ae6 318 if (!STRINGP (final) && !VECTORP (final))
d86ad277 319 error ("Keyboard macros must be strings or vectors");
5a7f5d07 320
524ed533 321 tem = Fcons (Vexecuting_kbd_macro,
649d952d 322 Fcons (make_number (executing_kbd_macro_index),
f2d6a3df 323 Vreal_this_command));
5a7f5d07
JB
324 record_unwind_protect (pop_kbd_macro, tem);
325
f90d3a6b 326 GCPRO2 (final, loopfunc);
5a7f5d07
JB
327 do
328 {
524ed533 329 Vexecuting_kbd_macro = final;
649d952d
KS
330 executing_kbd_macro = final;
331 executing_kbd_macro_index = 0;
5a7f5d07 332
15dbb4d6 333 kset_prefix_arg (current_kboard, Qnil);
f90d3a6b
KS
334
335 if (!NILP (loopfunc))
336 {
337 Lisp_Object cont;
338 cont = call0 (loopfunc);
339 if (NILP (cont))
340 break;
341 }
342
5a7f5d07 343 command_loop_1 ();
e86f81cc 344
649d952d 345 executing_kbd_macro_iterations = ++success_count;
d4087e06 346
e86f81cc 347 QUIT;
5a7f5d07 348 }
65346ae6 349 while (--repeat
524ed533 350 && (STRINGP (Vexecuting_kbd_macro) || VECTORP (Vexecuting_kbd_macro)));
5a7f5d07 351
649d952d 352 executing_kbd_macro = Qnil;
d4087e06 353
f2d6a3df 354 Vreal_this_command = Vexecuting_kbd_macro;
b80d5655 355
5a7f5d07 356 UNGCPRO;
52d9c145 357 return unbind_to (pdlcount, Qnil);
5a7f5d07
JB
358}
359\f
c3fd8dd5 360void
971de7fb 361init_macros (void)
5a7f5d07 362{
524ed533 363 Vexecuting_kbd_macro = Qnil;
649d952d 364 executing_kbd_macro = Qnil;
5a7f5d07
JB
365}
366
c3fd8dd5 367void
971de7fb 368syms_of_macros (void)
5a7f5d07 369{
cd3520a4 370 DEFSYM (Qexecute_kbd_macro, "execute-kbd-macro");
bb1c6663
GM
371
372 DEFVAR_LISP ("kbd-macro-termination-hook", Vkbd_macro_termination_hook,
373 doc: /* Normal hook run whenever a keyboard macro terminates.
374This is run whether the macro ends normally or prematurely due to an error. */);
375 Vkbd_macro_termination_hook = Qnil;
cd3520a4 376 DEFSYM (Qkbd_macro_termination_hook, "kbd-macro-termination-hook");
5a7f5d07
JB
377
378 defsubr (&Sstart_kbd_macro);
379 defsubr (&Send_kbd_macro);
380 defsubr (&Scall_last_kbd_macro);
381 defsubr (&Sexecute_kbd_macro);
199afd29 382 defsubr (&Scancel_kbd_macro_events);
2d5f65a9 383 defsubr (&Sstore_kbd_macro_event);
5a7f5d07 384
cd8b5aa3 385 DEFVAR_KBOARD ("defining-kbd-macro", defining_kbd_macro,
6cf374b1
LT
386 doc: /* Non-nil while a keyboard macro is being defined. Don't set this!
387The value is the symbol `append' while appending to the definition of
388an existing macro. */);
5a7f5d07 389
29208e82 390 DEFVAR_LISP ("executing-kbd-macro", Vexecuting_kbd_macro,
524ed533
RS
391 doc: /* Currently executing keyboard macro (string or vector).
392This is nil when not executing a keyboard macro. */);
5a7f5d07 393
29208e82 394 DEFVAR_INT ("executing-kbd-macro-index", executing_kbd_macro_index,
64799df5
KS
395 doc: /* Index in currently executing keyboard macro; undefined if none executing. */);
396
cd8b5aa3 397 DEFVAR_KBOARD ("last-kbd-macro", Vlast_kbd_macro,
70da46c3 398 doc: /* Last kbd macro defined, as a string or vector; nil if none defined. */);
5a7f5d07 399}