Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/bash/src/lib/readline/macro.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* macro.c -- keyboard macros for readline. */ | - | ||||||||||||||||||
2 | - | |||||||||||||||||||
3 | /* Copyright (C) 1994-2009,2017 Free Software Foundation, Inc. | - | ||||||||||||||||||
4 | - | |||||||||||||||||||
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. | - | ||||||||||||||||||
7 | - | |||||||||||||||||||
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 | - | ||||||||||||||||||
11 | (at your option) any later version. | - | ||||||||||||||||||
12 | - | |||||||||||||||||||
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 | - | ||||||||||||||||||
16 | GNU General Public License for more details. | - | ||||||||||||||||||
17 | - | |||||||||||||||||||
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 | - | |||||||||||||||||||
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 | - | |||||||||||||||||||
49 | #include "rlprivate.h" | - | ||||||||||||||||||
50 | #include "xmalloc.h" | - | ||||||||||||||||||
51 | - | |||||||||||||||||||
52 | #define MAX_MACRO_LEVEL 16 | - | ||||||||||||||||||
53 | - | |||||||||||||||||||
54 | /* **************************************************************** */ | - | ||||||||||||||||||
55 | /* */ | - | ||||||||||||||||||
56 | /* Hacking Keyboard Macros */ | - | ||||||||||||||||||
57 | /* */ | - | ||||||||||||||||||
58 | /* **************************************************************** */ | - | ||||||||||||||||||
59 | - | |||||||||||||||||||
60 | /* The currently executing macro string. If this is non-zero, | - | ||||||||||||||||||
61 | then it is a malloc ()'ed string where input is coming from. */ | - | ||||||||||||||||||
62 | char *rl_executing_macro = (char *)NULL; | - | ||||||||||||||||||
63 | - | |||||||||||||||||||
64 | /* The offset in the above string to the next character to be read. */ | - | ||||||||||||||||||
65 | static int executing_macro_index; | - | ||||||||||||||||||
66 | - | |||||||||||||||||||
67 | /* The current macro string being built. Characters get stuffed | - | ||||||||||||||||||
68 | in here by add_macro_char (). */ | - | ||||||||||||||||||
69 | static char *current_macro = (char *)NULL; | - | ||||||||||||||||||
70 | - | |||||||||||||||||||
71 | /* The size of the buffer allocated to current_macro. */ | - | ||||||||||||||||||
72 | static int current_macro_size; | - | ||||||||||||||||||
73 | - | |||||||||||||||||||
74 | /* The index at which characters are being added to current_macro. */ | - | ||||||||||||||||||
75 | static int current_macro_index; | - | ||||||||||||||||||
76 | - | |||||||||||||||||||
77 | /* A structure used to save nested macro strings. | - | ||||||||||||||||||
78 | It is a linked list of string/index for each saved macro. */ | - | ||||||||||||||||||
79 | struct saved_macro { | - | ||||||||||||||||||
80 | struct saved_macro *next; | - | ||||||||||||||||||
81 | char *string; | - | ||||||||||||||||||
82 | int sindex; | - | ||||||||||||||||||
83 | }; | - | ||||||||||||||||||
84 | - | |||||||||||||||||||
85 | /* The list of saved macros. */ | - | ||||||||||||||||||
86 | static struct saved_macro *macro_list = (struct saved_macro *)NULL; | - | ||||||||||||||||||
87 | - | |||||||||||||||||||
88 | static int macro_level = 0; | - | ||||||||||||||||||
89 | - | |||||||||||||||||||
90 | /* Set up to read subsequent input from STRING. | - | ||||||||||||||||||
91 | STRING is free ()'ed when we are done with it. */ | - | ||||||||||||||||||
92 | void | - | ||||||||||||||||||
93 | _rl_with_macro_input (char *string) | - | ||||||||||||||||||
94 | { | - | ||||||||||||||||||
95 | if (macro_level > MAX_MACRO_LEVEL)
| 0 | ||||||||||||||||||
96 | { | - | ||||||||||||||||||
97 | _rl_errmsg ("maximum macro execution nesting level exceeded"); | - | ||||||||||||||||||
98 | _rl_abort_internal (); | - | ||||||||||||||||||
99 | return; never executed: return; | 0 | ||||||||||||||||||
100 | } | - | ||||||||||||||||||
101 | - | |||||||||||||||||||
102 | #if 0 | - | ||||||||||||||||||
103 | if (rl_executing_macro) /* XXX - later */ | - | ||||||||||||||||||
104 | #endif | - | ||||||||||||||||||
105 | _rl_push_executing_macro (); | - | ||||||||||||||||||
106 | rl_executing_macro = string; | - | ||||||||||||||||||
107 | executing_macro_index = 0; | - | ||||||||||||||||||
108 | RL_SETSTATE(RL_STATE_MACROINPUT); | - | ||||||||||||||||||
109 | } never executed: end of block | 0 | ||||||||||||||||||
110 | - | |||||||||||||||||||
111 | /* Return the next character available from a macro, or 0 if | - | ||||||||||||||||||
112 | there are no macro characters. */ | - | ||||||||||||||||||
113 | int | - | ||||||||||||||||||
114 | _rl_next_macro_key (void) | - | ||||||||||||||||||
115 | { | - | ||||||||||||||||||
116 | int c; | - | ||||||||||||||||||
117 | - | |||||||||||||||||||
118 | if (rl_executing_macro == 0)
| 0 | ||||||||||||||||||
119 | return (0); never executed: return (0); | 0 | ||||||||||||||||||
120 | - | |||||||||||||||||||
121 | if (rl_executing_macro[executing_macro_index] == 0)
| 0 | ||||||||||||||||||
122 | { | - | ||||||||||||||||||
123 | _rl_pop_executing_macro (); | - | ||||||||||||||||||
124 | return (_rl_next_macro_key ()); never executed: return (_rl_next_macro_key ()); | 0 | ||||||||||||||||||
125 | } | - | ||||||||||||||||||
126 | - | |||||||||||||||||||
127 | #if defined (READLINE_CALLBACKS) | - | ||||||||||||||||||
128 | c = rl_executing_macro[executing_macro_index++]; | - | ||||||||||||||||||
129 | if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD|RL_STATE_MOREINPUT) && rl_executing_macro[executing_macro_index] == 0)
| 0 | ||||||||||||||||||
130 | _rl_pop_executing_macro (); never executed: _rl_pop_executing_macro (); | 0 | ||||||||||||||||||
131 | return c; never executed: return c; | 0 | ||||||||||||||||||
132 | #else | - | ||||||||||||||||||
133 | /* XXX - consider doing the same as the callback code, just not testing | - | ||||||||||||||||||
134 | whether we're running in callback mode */ | - | ||||||||||||||||||
135 | return (rl_executing_macro[executing_macro_index++]); | - | ||||||||||||||||||
136 | #endif | - | ||||||||||||||||||
137 | } | - | ||||||||||||||||||
138 | - | |||||||||||||||||||
139 | int | - | ||||||||||||||||||
140 | _rl_peek_macro_key (void) | - | ||||||||||||||||||
141 | { | - | ||||||||||||||||||
142 | if (rl_executing_macro == 0)
| 0 | ||||||||||||||||||
143 | return (0); never executed: return (0); | 0 | ||||||||||||||||||
144 | if (rl_executing_macro[executing_macro_index] == 0 && (macro_list == 0 || macro_list->string == 0))
| 0 | ||||||||||||||||||
145 | return (0); never executed: return (0); | 0 | ||||||||||||||||||
146 | if (rl_executing_macro[executing_macro_index] == 0 && macro_list && macro_list->string)
| 0 | ||||||||||||||||||
147 | return (macro_list->string[0]); never executed: return (macro_list->string[0]); | 0 | ||||||||||||||||||
148 | return (rl_executing_macro[executing_macro_index]); never executed: return (rl_executing_macro[executing_macro_index]); | 0 | ||||||||||||||||||
149 | } | - | ||||||||||||||||||
150 | - | |||||||||||||||||||
151 | int | - | ||||||||||||||||||
152 | _rl_prev_macro_key (void) | - | ||||||||||||||||||
153 | { | - | ||||||||||||||||||
154 | if (rl_executing_macro == 0)
| 0 | ||||||||||||||||||
155 | return (0); never executed: return (0); | 0 | ||||||||||||||||||
156 | - | |||||||||||||||||||
157 | if (executing_macro_index == 0)
| 0 | ||||||||||||||||||
158 | return (0); never executed: return (0); | 0 | ||||||||||||||||||
159 | - | |||||||||||||||||||
160 | executing_macro_index--; | - | ||||||||||||||||||
161 | return (rl_executing_macro[executing_macro_index]); never executed: return (rl_executing_macro[executing_macro_index]); | 0 | ||||||||||||||||||
162 | } | - | ||||||||||||||||||
163 | - | |||||||||||||||||||
164 | /* Save the currently executing macro on a stack of saved macros. */ | - | ||||||||||||||||||
165 | void | - | ||||||||||||||||||
166 | _rl_push_executing_macro (void) | - | ||||||||||||||||||
167 | { | - | ||||||||||||||||||
168 | struct saved_macro *saver; | - | ||||||||||||||||||
169 | - | |||||||||||||||||||
170 | saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro)); | - | ||||||||||||||||||
171 | saver->next = macro_list; | - | ||||||||||||||||||
172 | saver->sindex = executing_macro_index; | - | ||||||||||||||||||
173 | saver->string = rl_executing_macro; | - | ||||||||||||||||||
174 | - | |||||||||||||||||||
175 | macro_list = saver; | - | ||||||||||||||||||
176 | - | |||||||||||||||||||
177 | macro_level++; | - | ||||||||||||||||||
178 | } never executed: end of block | 0 | ||||||||||||||||||
179 | - | |||||||||||||||||||
180 | /* Discard the current macro, replacing it with the one | - | ||||||||||||||||||
181 | on the top of the stack of saved macros. */ | - | ||||||||||||||||||
182 | void | - | ||||||||||||||||||
183 | _rl_pop_executing_macro (void) | - | ||||||||||||||||||
184 | { | - | ||||||||||||||||||
185 | struct saved_macro *macro; | - | ||||||||||||||||||
186 | - | |||||||||||||||||||
187 | FREE (rl_executing_macro); never executed: free (rl_executing_macro);
| 0 | ||||||||||||||||||
188 | rl_executing_macro = (char *)NULL; | - | ||||||||||||||||||
189 | executing_macro_index = 0; | - | ||||||||||||||||||
190 | - | |||||||||||||||||||
191 | if (macro_list)
| 0 | ||||||||||||||||||
192 | { | - | ||||||||||||||||||
193 | macro = macro_list; | - | ||||||||||||||||||
194 | rl_executing_macro = macro_list->string; | - | ||||||||||||||||||
195 | executing_macro_index = macro_list->sindex; | - | ||||||||||||||||||
196 | macro_list = macro_list->next; | - | ||||||||||||||||||
197 | xfree (macro); | - | ||||||||||||||||||
198 | } never executed: end of block | 0 | ||||||||||||||||||
199 | - | |||||||||||||||||||
200 | macro_level--; | - | ||||||||||||||||||
201 | - | |||||||||||||||||||
202 | if (rl_executing_macro == 0)
| 0 | ||||||||||||||||||
203 | RL_UNSETSTATE(RL_STATE_MACROINPUT); never executed: (rl_readline_state &= ~(0x0000800)); | 0 | ||||||||||||||||||
204 | } never executed: end of block | 0 | ||||||||||||||||||
205 | - | |||||||||||||||||||
206 | /* Add a character to the macro being built. */ | - | ||||||||||||||||||
207 | void | - | ||||||||||||||||||
208 | _rl_add_macro_char (int c) | - | ||||||||||||||||||
209 | { | - | ||||||||||||||||||
210 | if (current_macro_index + 1 >= current_macro_size)
| 0 | ||||||||||||||||||
211 | { | - | ||||||||||||||||||
212 | if (current_macro == 0)
| 0 | ||||||||||||||||||
213 | current_macro = (char *)xmalloc (current_macro_size = 25); never executed: current_macro = (char *)xmalloc (current_macro_size = 25); | 0 | ||||||||||||||||||
214 | else | - | ||||||||||||||||||
215 | current_macro = (char *)xrealloc (current_macro, current_macro_size += 25); never executed: current_macro = (char *)xrealloc (current_macro, current_macro_size += 25); | 0 | ||||||||||||||||||
216 | } | - | ||||||||||||||||||
217 | - | |||||||||||||||||||
218 | current_macro[current_macro_index++] = c; | - | ||||||||||||||||||
219 | current_macro[current_macro_index] = '\0'; | - | ||||||||||||||||||
220 | } never executed: end of block | 0 | ||||||||||||||||||
221 | - | |||||||||||||||||||
222 | void | - | ||||||||||||||||||
223 | _rl_kill_kbd_macro (void) | - | ||||||||||||||||||
224 | { | - | ||||||||||||||||||
225 | if (current_macro)
| 0 | ||||||||||||||||||
226 | { | - | ||||||||||||||||||
227 | xfree (current_macro); | - | ||||||||||||||||||
228 | current_macro = (char *) NULL; | - | ||||||||||||||||||
229 | } never executed: end of block | 0 | ||||||||||||||||||
230 | current_macro_size = current_macro_index = 0; | - | ||||||||||||||||||
231 | - | |||||||||||||||||||
232 | FREE (rl_executing_macro); never executed: free (rl_executing_macro);
| 0 | ||||||||||||||||||
233 | rl_executing_macro = (char *) NULL; | - | ||||||||||||||||||
234 | executing_macro_index = 0; | - | ||||||||||||||||||
235 | - | |||||||||||||||||||
236 | RL_UNSETSTATE(RL_STATE_MACRODEF); | - | ||||||||||||||||||
237 | } never executed: end of block | 0 | ||||||||||||||||||
238 | - | |||||||||||||||||||
239 | /* Begin defining a keyboard macro. | - | ||||||||||||||||||
240 | Keystrokes are recorded as they are executed. | - | ||||||||||||||||||
241 | End the definition with rl_end_kbd_macro (). | - | ||||||||||||||||||
242 | If a numeric argument was explicitly typed, then append this | - | ||||||||||||||||||
243 | definition to the end of the existing macro, and start by | - | ||||||||||||||||||
244 | re-executing the existing macro. */ | - | ||||||||||||||||||
245 | int | - | ||||||||||||||||||
246 | rl_start_kbd_macro (int ignore1, int ignore2) | - | ||||||||||||||||||
247 | { | - | ||||||||||||||||||
248 | if (RL_ISSTATE (RL_STATE_MACRODEF))
| 0 | ||||||||||||||||||
249 | { | - | ||||||||||||||||||
250 | _rl_abort_internal (); | - | ||||||||||||||||||
251 | return 1; never executed: return 1; | 0 | ||||||||||||||||||
252 | } | - | ||||||||||||||||||
253 | - | |||||||||||||||||||
254 | if (rl_explicit_arg)
| 0 | ||||||||||||||||||
255 | { | - | ||||||||||||||||||
256 | if (current_macro)
| 0 | ||||||||||||||||||
257 | _rl_with_macro_input (savestring (current_macro)); never executed: _rl_with_macro_input (strcpy ((char *)xmalloc (1 + strlen (current_macro)), (current_macro))); | 0 | ||||||||||||||||||
258 | } never executed: end of block | 0 | ||||||||||||||||||
259 | else | - | ||||||||||||||||||
260 | current_macro_index = 0; never executed: current_macro_index = 0; | 0 | ||||||||||||||||||
261 | - | |||||||||||||||||||
262 | RL_SETSTATE(RL_STATE_MACRODEF); | - | ||||||||||||||||||
263 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
264 | } | - | ||||||||||||||||||
265 | - | |||||||||||||||||||
266 | /* Stop defining a keyboard macro. | - | ||||||||||||||||||
267 | A numeric argument says to execute the macro right now, | - | ||||||||||||||||||
268 | that many times, counting the definition as the first time. */ | - | ||||||||||||||||||
269 | int | - | ||||||||||||||||||
270 | rl_end_kbd_macro (int count, int ignore) | - | ||||||||||||||||||
271 | { | - | ||||||||||||||||||
272 | if (RL_ISSTATE (RL_STATE_MACRODEF) == 0)
| 0 | ||||||||||||||||||
273 | { | - | ||||||||||||||||||
274 | _rl_abort_internal (); | - | ||||||||||||||||||
275 | return 1; never executed: return 1; | 0 | ||||||||||||||||||
276 | } | - | ||||||||||||||||||
277 | - | |||||||||||||||||||
278 | current_macro_index -= rl_key_sequence_length; | - | ||||||||||||||||||
279 | current_macro[current_macro_index] = '\0'; | - | ||||||||||||||||||
280 | - | |||||||||||||||||||
281 | RL_UNSETSTATE(RL_STATE_MACRODEF); | - | ||||||||||||||||||
282 | - | |||||||||||||||||||
283 | return (rl_call_last_kbd_macro (--count, 0)); never executed: return (rl_call_last_kbd_macro (--count, 0)); | 0 | ||||||||||||||||||
284 | } | - | ||||||||||||||||||
285 | - | |||||||||||||||||||
286 | /* Execute the most recently defined keyboard macro. | - | ||||||||||||||||||
287 | COUNT says how many times to execute it. */ | - | ||||||||||||||||||
288 | int | - | ||||||||||||||||||
289 | rl_call_last_kbd_macro (int count, int ignore) | - | ||||||||||||||||||
290 | { | - | ||||||||||||||||||
291 | if (current_macro == 0)
| 0 | ||||||||||||||||||
292 | _rl_abort_internal (); never executed: _rl_abort_internal (); | 0 | ||||||||||||||||||
293 | - | |||||||||||||||||||
294 | if (RL_ISSTATE (RL_STATE_MACRODEF))
| 0 | ||||||||||||||||||
295 | { | - | ||||||||||||||||||
296 | rl_ding (); /* no recursive macros */ | - | ||||||||||||||||||
297 | current_macro[--current_macro_index] = '\0'; /* erase this char */ | - | ||||||||||||||||||
298 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
299 | } | - | ||||||||||||||||||
300 | - | |||||||||||||||||||
301 | while (count--)
| 0 | ||||||||||||||||||
302 | _rl_with_macro_input (savestring (current_macro)); never executed: _rl_with_macro_input (strcpy ((char *)xmalloc (1 + strlen (current_macro)), (current_macro))); | 0 | ||||||||||||||||||
303 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
304 | } | - | ||||||||||||||||||
305 | - | |||||||||||||||||||
306 | int | - | ||||||||||||||||||
307 | rl_print_last_kbd_macro (int count, int ignore) | - | ||||||||||||||||||
308 | { | - | ||||||||||||||||||
309 | char *m; | - | ||||||||||||||||||
310 | - | |||||||||||||||||||
311 | if (current_macro == 0)
| 0 | ||||||||||||||||||
312 | { | - | ||||||||||||||||||
313 | rl_ding (); | - | ||||||||||||||||||
314 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
315 | } | - | ||||||||||||||||||
316 | m = _rl_untranslate_macro_value (current_macro, 1); | - | ||||||||||||||||||
317 | rl_crlf (); | - | ||||||||||||||||||
318 | printf ("%s", m); | - | ||||||||||||||||||
319 | fflush (stdout); | - | ||||||||||||||||||
320 | rl_crlf (); | - | ||||||||||||||||||
321 | FREE (m); never executed: free (m);
| 0 | ||||||||||||||||||
322 | rl_forced_update_display (); | - | ||||||||||||||||||
323 | rl_display_fixed = 1; | - | ||||||||||||||||||
324 | - | |||||||||||||||||||
325 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
326 | } | - | ||||||||||||||||||
327 | - | |||||||||||||||||||
328 | void | - | ||||||||||||||||||
329 | rl_push_macro_input (char *macro) | - | ||||||||||||||||||
330 | { | - | ||||||||||||||||||
331 | _rl_with_macro_input (macro); | - | ||||||||||||||||||
332 | } never executed: end of block | 0 | ||||||||||||||||||
Source code | Switch to Preprocessed file |