OpenCoverage

macro.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/lib/readline/macro.c
Source codeSwitch to Preprocessed file
LineSourceCount
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. */-
62char *rl_executing_macro = (char *)NULL;-
63-
64/* The offset in the above string to the next character to be read. */-
65static int executing_macro_index;-
66-
67/* The current macro string being built. Characters get stuffed-
68 in here by add_macro_char (). */-
69static char *current_macro = (char *)NULL;-
70-
71/* The size of the buffer allocated to current_macro. */-
72static int current_macro_size;-
73-
74/* The index at which characters are being added to current_macro. */-
75static 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. */-
79struct saved_macro {-
80 struct saved_macro *next;-
81 char *string;-
82 int sindex;-
83};-
84-
85/* The list of saved macros. */-
86static struct saved_macro *macro_list = (struct saved_macro *)NULL;-
87-
88static 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. */-
92void-
93_rl_with_macro_input (char *string)-
94{-
95 if (macro_level > MAX_MACRO_LEVEL)
macro_level > 16Description
TRUEnever evaluated
FALSEnever evaluated
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. */-
113int-
114_rl_next_macro_key (void)-
115{-
116 int c;-
117-
118 if (rl_executing_macro == 0)
rl_executing_macro == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
119 return (0);
never executed: return (0);
0
120-
121 if (rl_executing_macro[executing_macro_index] == 0)
rl_executing_m...ro_index] == 0Description
TRUEnever evaluated
FALSEnever evaluated
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)
(rl_readline_s...& (0x0080000))Description
TRUEnever evaluated
FALSEnever evaluated
(rl_readline_s...08|0x0000040))Description
TRUEnever evaluated
FALSEnever evaluated
rl_executing_m...ro_index] == 0Description
TRUEnever evaluated
FALSEnever evaluated
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-
139int-
140_rl_peek_macro_key (void)-
141{-
142 if (rl_executing_macro == 0)
rl_executing_macro == 0Description
TRUEnever evaluated
FALSEnever evaluated
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))
rl_executing_m...ro_index] == 0Description
TRUEnever evaluated
FALSEnever evaluated
macro_list == 0Description
TRUEnever evaluated
FALSEnever evaluated
macro_list->string == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
145 return (0);
never executed: return (0);
0
146 if (rl_executing_macro[executing_macro_index] == 0 && macro_list && macro_list->string)
rl_executing_m...ro_index] == 0Description
TRUEnever evaluated
FALSEnever evaluated
macro_listDescription
TRUEnever evaluated
FALSEnever evaluated
macro_list->stringDescription
TRUEnever evaluated
FALSEnever evaluated
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-
151int-
152_rl_prev_macro_key (void)-
153{-
154 if (rl_executing_macro == 0)
rl_executing_macro == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
155 return (0);
never executed: return (0);
0
156-
157 if (executing_macro_index == 0)
executing_macro_index == 0Description
TRUEnever evaluated
FALSEnever evaluated
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. */-
165void-
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. */-
182void-
183_rl_pop_executing_macro (void)-
184{-
185 struct saved_macro *macro;-
186-
187 FREE (rl_executing_macro);
never executed: free (rl_executing_macro);
rl_executing_macroDescription
TRUEnever evaluated
FALSEnever evaluated
0
188 rl_executing_macro = (char *)NULL;-
189 executing_macro_index = 0;-
190-
191 if (macro_list)
macro_listDescription
TRUEnever evaluated
FALSEnever evaluated
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)
rl_executing_macro == 0Description
TRUEnever evaluated
FALSEnever evaluated
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. */-
207void-
208_rl_add_macro_char (int c)-
209{-
210 if (current_macro_index + 1 >= current_macro_size)
current_macro_...ent_macro_sizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
211 {-
212 if (current_macro == 0)
current_macro == 0Description
TRUEnever evaluated
FALSEnever evaluated
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-
222void-
223_rl_kill_kbd_macro (void)-
224{-
225 if (current_macro)
current_macroDescription
TRUEnever evaluated
FALSEnever evaluated
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);
rl_executing_macroDescription
TRUEnever evaluated
FALSEnever evaluated
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. */-
245int-
246rl_start_kbd_macro (int ignore1, int ignore2)-
247{-
248 if (RL_ISSTATE (RL_STATE_MACRODEF))
(rl_readline_s...& (0x0001000))Description
TRUEnever evaluated
FALSEnever evaluated
0
249 {-
250 _rl_abort_internal ();-
251 return 1;
never executed: return 1;
0
252 }-
253-
254 if (rl_explicit_arg)
rl_explicit_argDescription
TRUEnever evaluated
FALSEnever evaluated
0
255 {-
256 if (current_macro)
current_macroDescription
TRUEnever evaluated
FALSEnever evaluated
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. */-
269int-
270rl_end_kbd_macro (int count, int ignore)-
271{-
272 if (RL_ISSTATE (RL_STATE_MACRODEF) == 0)
(rl_readline_s...0001000)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
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. */-
288int-
289rl_call_last_kbd_macro (int count, int ignore)-
290{-
291 if (current_macro == 0)
current_macro == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
292 _rl_abort_internal ();
never executed: _rl_abort_internal ();
0
293-
294 if (RL_ISSTATE (RL_STATE_MACRODEF))
(rl_readline_s...& (0x0001000))Description
TRUEnever evaluated
FALSEnever evaluated
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--)
count--Description
TRUEnever evaluated
FALSEnever evaluated
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-
306int-
307rl_print_last_kbd_macro (int count, int ignore)-
308{-
309 char *m;-
310-
311 if (current_macro == 0)
current_macro == 0Description
TRUEnever evaluated
FALSEnever evaluated
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);
mDescription
TRUEnever evaluated
FALSEnever evaluated
0
322 rl_forced_update_display ();-
323 rl_display_fixed = 1;-
324-
325 return 0;
never executed: return 0;
0
326}-
327-
328void-
329rl_push_macro_input (char *macro)-
330{-
331 _rl_with_macro_input (macro);-
332}
never executed: end of block
0
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2