]> git.ipfire.org Git - thirdparty/bash.git/blame - lib/readline/macro.c
Bash-4.3 distribution sources and documentation
[thirdparty/bash.git] / lib / readline / macro.c
CommitLineData
ccc6cda3
JA
1/* macro.c -- keyboard macros for readline. */
2
3185942a 3/* Copyright (C) 1994-2009 Free Software Foundation, Inc.
ccc6cda3 4
3185942a
JA
5 This file is part of the GNU Readline Library (Readline), a library
6 for reading lines of text with interactive input and history editing.
ccc6cda3 7
3185942a
JA
8 Readline is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
ccc6cda3
JA
11 (at your option) any later version.
12
3185942a
JA
13 Readline is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ccc6cda3
JA
16 GNU General Public License for more details.
17
3185942a
JA
18 You should have received a copy of the GNU General Public License
19 along with Readline. If not, see <http://www.gnu.org/licenses/>.
20*/
21
ccc6cda3
JA
22#define READLINE_LIBRARY
23
24#if defined (HAVE_CONFIG_H)
25# include <config.h>
26#endif
27
28#include <sys/types.h>
29
30#if defined (HAVE_UNISTD_H)
31# include <unistd.h> /* for _POSIX_VERSION */
32#endif /* HAVE_UNISTD_H */
33
34#if defined (HAVE_STDLIB_H)
35# include <stdlib.h>
36#else
37# include "ansi_stdlib.h"
38#endif /* HAVE_STDLIB_H */
39
40#include <stdio.h>
41
42/* System-specific feature definitions and include files. */
43#include "rldefs.h"
44
45/* Some standard library routines. */
46#include "readline.h"
47#include "history.h"
48
bb70624e
JA
49#include "rlprivate.h"
50#include "xmalloc.h"
ccc6cda3 51
ccc6cda3
JA
52/* **************************************************************** */
53/* */
54/* Hacking Keyboard Macros */
55/* */
56/* **************************************************************** */
57
ccc6cda3
JA
58/* The currently executing macro string. If this is non-zero,
59 then it is a malloc ()'ed string where input is coming from. */
28ef6c31
JA
60char *rl_executing_macro = (char *)NULL;
61
ccc6cda3
JA
62/* The offset in the above string to the next character to be read. */
63static int executing_macro_index;
64
65/* The current macro string being built. Characters get stuffed
66 in here by add_macro_char (). */
67static char *current_macro = (char *)NULL;
68
69/* The size of the buffer allocated to current_macro. */
70static int current_macro_size;
71
72/* The index at which characters are being added to current_macro. */
73static int current_macro_index;
74
75/* A structure used to save nested macro strings.
76 It is a linked list of string/index for each saved macro. */
77struct saved_macro {
78 struct saved_macro *next;
79 char *string;
80 int sindex;
81};
82
83/* The list of saved macros. */
84static struct saved_macro *macro_list = (struct saved_macro *)NULL;
85
86/* Set up to read subsequent input from STRING.
87 STRING is free ()'ed when we are done with it. */
88void
89_rl_with_macro_input (string)
90 char *string;
91{
92 _rl_push_executing_macro ();
28ef6c31 93 rl_executing_macro = string;
ccc6cda3 94 executing_macro_index = 0;
28ef6c31 95 RL_SETSTATE(RL_STATE_MACROINPUT);
ccc6cda3
JA
96}
97
98/* Return the next character available from a macro, or 0 if
99 there are no macro characters. */
100int
101_rl_next_macro_key ()
102{
95732b49
JA
103 int c;
104
28ef6c31 105 if (rl_executing_macro == 0)
ccc6cda3
JA
106 return (0);
107
28ef6c31 108 if (rl_executing_macro[executing_macro_index] == 0)
ccc6cda3
JA
109 {
110 _rl_pop_executing_macro ();
111 return (_rl_next_macro_key ());
112 }
113
95732b49
JA
114#if defined (READLINE_CALLBACKS)
115 c = rl_executing_macro[executing_macro_index++];
0628567a 116 if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD|RL_STATE_MOREINPUT) && rl_executing_macro[executing_macro_index] == 0)
95732b49
JA
117 _rl_pop_executing_macro ();
118 return c;
119#else
28ef6c31 120 return (rl_executing_macro[executing_macro_index++]);
95732b49 121#endif
ccc6cda3
JA
122}
123
ac50fbac
CR
124int
125_rl_prev_macro_key ()
126{
127 if (rl_executing_macro == 0)
128 return (0);
129
130 if (executing_macro_index == 0)
131 return (0);
132
133 executing_macro_index--;
134 return (rl_executing_macro[executing_macro_index]);
135}
136
ccc6cda3
JA
137/* Save the currently executing macro on a stack of saved macros. */
138void
139_rl_push_executing_macro ()
140{
141 struct saved_macro *saver;
142
143 saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro));
144 saver->next = macro_list;
145 saver->sindex = executing_macro_index;
28ef6c31 146 saver->string = rl_executing_macro;
ccc6cda3
JA
147
148 macro_list = saver;
149}
150
151/* Discard the current macro, replacing it with the one
152 on the top of the stack of saved macros. */
153void
154_rl_pop_executing_macro ()
155{
156 struct saved_macro *macro;
157
28ef6c31
JA
158 FREE (rl_executing_macro);
159 rl_executing_macro = (char *)NULL;
ccc6cda3
JA
160 executing_macro_index = 0;
161
162 if (macro_list)
163 {
164 macro = macro_list;
28ef6c31 165 rl_executing_macro = macro_list->string;
ccc6cda3
JA
166 executing_macro_index = macro_list->sindex;
167 macro_list = macro_list->next;
3185942a 168 xfree (macro);
ccc6cda3 169 }
28ef6c31
JA
170
171 if (rl_executing_macro == 0)
172 RL_UNSETSTATE(RL_STATE_MACROINPUT);
ccc6cda3
JA
173}
174
175/* Add a character to the macro being built. */
176void
177_rl_add_macro_char (c)
178 int c;
179{
180 if (current_macro_index + 1 >= current_macro_size)
181 {
182 if (current_macro == 0)
f73dda09 183 current_macro = (char *)xmalloc (current_macro_size = 25);
ccc6cda3 184 else
f73dda09 185 current_macro = (char *)xrealloc (current_macro, current_macro_size += 25);
ccc6cda3
JA
186 }
187
188 current_macro[current_macro_index++] = c;
189 current_macro[current_macro_index] = '\0';
190}
191
192void
193_rl_kill_kbd_macro ()
194{
195 if (current_macro)
196 {
3185942a 197 xfree (current_macro);
ccc6cda3
JA
198 current_macro = (char *) NULL;
199 }
200 current_macro_size = current_macro_index = 0;
201
28ef6c31
JA
202 FREE (rl_executing_macro);
203 rl_executing_macro = (char *) NULL;
ccc6cda3
JA
204 executing_macro_index = 0;
205
28ef6c31 206 RL_UNSETSTATE(RL_STATE_MACRODEF);
ccc6cda3
JA
207}
208
209/* Begin defining a keyboard macro.
210 Keystrokes are recorded as they are executed.
211 End the definition with rl_end_kbd_macro ().
212 If a numeric argument was explicitly typed, then append this
213 definition to the end of the existing macro, and start by
214 re-executing the existing macro. */
215int
216rl_start_kbd_macro (ignore1, ignore2)
217 int ignore1, ignore2;
218{
7117c2d2 219 if (RL_ISSTATE (RL_STATE_MACRODEF))
ccc6cda3
JA
220 {
221 _rl_abort_internal ();
222 return -1;
223 }
224
225 if (rl_explicit_arg)
226 {
227 if (current_macro)
228 _rl_with_macro_input (savestring (current_macro));
229 }
230 else
231 current_macro_index = 0;
232
28ef6c31 233 RL_SETSTATE(RL_STATE_MACRODEF);
ccc6cda3
JA
234 return 0;
235}
236
237/* Stop defining a keyboard macro.
238 A numeric argument says to execute the macro right now,
239 that many times, counting the definition as the first time. */
240int
241rl_end_kbd_macro (count, ignore)
242 int count, ignore;
243{
7117c2d2 244 if (RL_ISSTATE (RL_STATE_MACRODEF) == 0)
ccc6cda3
JA
245 {
246 _rl_abort_internal ();
247 return -1;
248 }
249
ac50fbac 250 current_macro_index -= rl_key_sequence_length;
ccc6cda3
JA
251 current_macro[current_macro_index] = '\0';
252
28ef6c31 253 RL_UNSETSTATE(RL_STATE_MACRODEF);
ccc6cda3
JA
254
255 return (rl_call_last_kbd_macro (--count, 0));
256}
257
258/* Execute the most recently defined keyboard macro.
259 COUNT says how many times to execute it. */
260int
261rl_call_last_kbd_macro (count, ignore)
262 int count, ignore;
263{
264 if (current_macro == 0)
265 _rl_abort_internal ();
266
7117c2d2 267 if (RL_ISSTATE (RL_STATE_MACRODEF))
ccc6cda3 268 {
28ef6c31 269 rl_ding (); /* no recursive macros */
ccc6cda3
JA
270 current_macro[--current_macro_index] = '\0'; /* erase this char */
271 return 0;
272 }
273
274 while (count--)
275 _rl_with_macro_input (savestring (current_macro));
276 return 0;
277}
278
ac50fbac
CR
279int
280rl_print_last_kbd_macro (count, ignore)
281 int count, ignore;
282{
283 char *m;
284
285 if (current_macro == 0)
286 {
287 rl_ding ();
288 return 0;
289 }
290 m = _rl_untranslate_macro_value (current_macro, 1);
291 rl_crlf ();
292 printf ("%s", m);
293 fflush (stdout);
294 rl_crlf ();
295 FREE (m);
296 rl_forced_update_display ();
297 rl_display_fixed = 1;
298
299 return 0;
300}
301
ccc6cda3
JA
302void
303rl_push_macro_input (macro)
304 char *macro;
305{
306 _rl_with_macro_input (macro);
307}