OpenCoverage

fc.def

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/builtins/fc.def
Source codeSwitch to Preprocessed file
LineSourceCount
1This file is fc.def, from which is created fc.c.-
2It implements the builtin "fc" in Bash.-
3-
4Copyright (C) 1987-2015 Free Software Foundation, Inc.-
5-
6This file is part of GNU Bash, the Bourne Again SHell.-
7-
8Bash is free software: you can redistribute it and/or modify-
9it under the terms of the GNU General Public License as published by-
10the Free Software Foundation, either version 3 of the License, or-
11(at your option) any later version.-
12-
13Bash is distributed in the hope that it will be useful,-
14but WITHOUT ANY WARRANTY; without even the implied warranty of-
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
16GNU General Public License for more details.-
17-
18You should have received a copy of the GNU General Public License-
19along with Bash. If not, see <http://www.gnu.org/licenses/>.-
20-
21$PRODUCES fc.c-
22-
23$BUILTIN fc-
24$FUNCTION fc_builtin-
25$DEPENDS_ON HISTORY-
26$SHORT_DOC fc [-e ename] [-lnr] [first] [last] or fc -s [pat=rep] [command]-
27Display or execute commands from the history list.-
28-
29fc is used to list or edit and re-execute commands from the history list.-
30FIRST and LAST can be numbers specifying the range, or FIRST can be a-
31string, which means the most recent command beginning with that-
32string.-
33-
34Options:-
35 -e ENAME select which editor to use. Default is FCEDIT, then EDITOR,-
36 then vi-
37 -l list lines instead of editing-
38 -n omit line numbers when listing-
39 -r reverse the order of the lines (newest listed first)-
40-
41With the `fc -s [pat=rep ...] [command]' format, COMMAND is-
42re-executed after the substitution OLD=NEW is performed.-
43-
44A useful alias to use with this is r='fc -s', so that typing `r cc'-
45runs the last command beginning with `cc' and typing `r' re-executes-
46the last command.-
47-
48Exit Status:-
49Returns success or status of executed command; non-zero if an error occurs.-
50$END-
51-
52#include <config.h>-
53-
54#if defined (HISTORY)-
55#if defined (HAVE_SYS_PARAM_H)-
56# include <sys/param.h>-
57#endif-
58#include "../bashtypes.h"-
59#include "posixstat.h"-
60#if ! defined(_MINIX) && defined (HAVE_SYS_FILE_H)-
61# include <sys/file.h>-
62#endif-
63-
64#if defined (HAVE_UNISTD_H)-
65# include <unistd.h>-
66#endif-
67-
68#include <stdio.h>-
69#include <chartypes.h>-
70-
71#include "../bashansi.h"-
72#include "../bashintl.h"-
73#include <errno.h>-
74-
75#include "../shell.h"-
76#include "../builtins.h"-
77#include "../flags.h"-
78#include "../parser.h"-
79#include "../bashhist.h"-
80#include "maxpath.h"-
81#include <readline/history.h>-
82#include "bashgetopt.h"-
83#include "common.h"-
84-
85#if !defined (errno)-
86extern int errno;-
87#endif /* !errno */-
88-
89extern int unlink __P((const char *));-
90-
91extern FILE *sh_mktmpfp __P((char *, int, char **));-
92-
93/* **************************************************************** */-
94/* */-
95/* The K*rn shell style fc command (Fix Command) */-
96/* */-
97/* **************************************************************** */-
98-
99/* fc builtin command (fix command) for Bash for those who-
100 like K*rn-style history better than csh-style.-
101-
102 fc [-e ename] [-nlr] [first] [last]-
103-
104 FIRST and LAST can be numbers specifying the range, or FIRST can be-
105 a string, which means the most recent command beginning with that-
106 string.-
107-
108 -e ENAME selects which editor to use. Default is FCEDIT, then EDITOR,-
109 then the editor which corresponds to the current readline editing-
110 mode, then vi.-
111-
112 -l means list lines instead of editing.-
113 -n means no line numbers listed.-
114 -r means reverse the order of the lines (making it newest listed first).-
115-
116 fc -e - [pat=rep ...] [command]-
117 fc -s [pat=rep ...] [command]-
118-
119 Equivalent to !command:sg/pat/rep execpt there can be multiple PAT=REP's.-
120*/-
121-
122/* Data structure describing a list of global replacements to perform. */-
123typedef struct repl {-
124 struct repl *next;-
125 char *pat;-
126 char *rep;-
127} REPL;-
128-
129/* Accessors for HIST_ENTRY lists that are called HLIST. */-
130#define histline(i) (hlist[(i)]->line)-
131#define histdata(i) (hlist[(i)]->data)-
132-
133#define FREE_RLIST() \-
134 do { \-
135 for (rl = rlist; rl; ) { \-
136 REPL *r; \-
137 r = rl->next; \-
138 if (rl->pat) \-
139 free (rl->pat); \-
140 if (rl->rep) \-
141 free (rl->rep); \-
142 free (rl); \-
143 rl = r; \-
144 } \-
145 } while (0)-
146-
147static char *fc_dosubs __P((char *, REPL *));-
148static char *fc_gethist __P((char *, HIST_ENTRY **));-
149static int fc_gethnum __P((char *, HIST_ENTRY **));-
150static int fc_number __P((WORD_LIST *));-
151static void fc_replhist __P((char *));-
152#ifdef INCLUDE_UNUSED-
153static char *fc_readline __P((FILE *));-
154static void fc_addhist __P((char *));-
155#endif-
156-
157static void-
158set_verbose_flag ()-
159{-
160 echo_input_at_read = verbose_flag;-
161}
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
162-
163/* String to execute on a file that we want to edit. */-
164#define FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-vi}}"-
165#if defined (STRICT_POSIX)-
166# define POSIX_FC_EDIT_COMMAND "${FCEDIT:-ed}"-
167#else-
168# define POSIX_FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-ed}}"-
169#endif-
170-
171int-
172fc_builtin (list)-
173 WORD_LIST *list;-
174{-
175 register int i;-
176 register char *sep;-
177 int numbering, reverse, listing, execute;-
178 int histbeg, histend, last_hist, retval, opt, rh, real_last;-
179 FILE *stream;-
180 REPL *rlist, *rl;-
181 char *ename, *command, *newcom, *fcedit;-
182 HIST_ENTRY **hlist;-
183 char *fn;-
184-
185 numbering = 1;-
186 reverse = listing = execute = 0;-
187 ename = (char *)NULL;-
188-
189 /* Parse out the options and set which of the two forms we're in. */-
190 reset_internal_getopt ();-
191 lcurrent = list; /* XXX */-
192 while (fc_number (loptend = lcurrent) == 0 &&
fc_number (lop...lcurrent) == 0Description
TRUEevaluated 35 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
5-35
193 (opt = internal_getopt (list, ":e:lnrs")) != -1)
(opt = interna...:lnrs")) != -1Description
TRUEevaluated 24 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 11 times by 1 test
Evaluated by:
  • Self test
11-24
194 {-
195 switch (opt)-
196 {-
197 case 'n':
executed 5 times by 1 test: case 'n':
Executed by:
  • Self test
5
198 numbering = 0;-
199 break;
executed 5 times by 1 test: break;
Executed by:
  • Self test
5
200-
201 case 'l':
executed 10 times by 1 test: case 'l':
Executed by:
  • Self test
10
202 listing = 1;-
203 break;
executed 10 times by 1 test: break;
Executed by:
  • Self test
10
204-
205 case 'r':
executed 2 times by 1 test: case 'r':
Executed by:
  • Self test
2
206 reverse = 1;-
207 break;
executed 2 times by 1 test: break;
Executed by:
  • Self test
2
208-
209 case 's':
executed 4 times by 1 test: case 's':
Executed by:
  • Self test
4
210 execute = 1;-
211 break;
executed 4 times by 1 test: break;
Executed by:
  • Self test
4
212-
213 case 'e':
executed 2 times by 1 test: case 'e':
Executed by:
  • Self test
2
214 ename = list_optarg;-
215 break;
executed 2 times by 1 test: break;
Executed by:
  • Self test
2
216-
217 CASE_HELPOPT;
never executed: return (258);
never executed: case -99:
0
218 default:
executed 1 time by 1 test: default:
Executed by:
  • Self test
1
219 builtin_usage ();-
220 return (EX_USAGE);
executed 1 time by 1 test: return (258);
Executed by:
  • Self test
1
221 }-
222 }-
223-
224 list = loptend;-
225-
226 if (ename && (*ename == '-') && (ename[1] == '\0'))
enameDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 14 times by 1 test
Evaluated by:
  • Self test
(*ename == '-')Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
(ename[1] == '\0')Description
TRUEnever evaluated
FALSEnever evaluated
0-14
227 execute = 1;
never executed: execute = 1;
0
228-
229 /* The "execute" form of the command (re-run, with possible string-
230 substitutions). */-
231 if (execute)
executeDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
4-12
232 {-
233 rlist = (REPL *)NULL;-
234 while (list && ((sep = (char *)strchr (list->word->word, '=')) != NULL))
listDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
((sep = (char ... ((void *)0) )Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-5
235 {-
236 *sep++ = '\0';-
237 rl = (REPL *)xmalloc (sizeof (REPL));-
238 rl->next = (REPL *)NULL;-
239 rl->pat = savestring (list->word->word);-
240 rl->rep = savestring (sep);-
241-
242 if (rlist == NULL)
rlist == ((void *)0)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-2
243 rlist = rl;
executed 2 times by 1 test: rlist = rl;
Executed by:
  • Self test
2
244 else-
245 {-
246 rl->next = rlist;-
247 rlist = rl;-
248 }
executed 1 time by 1 test: end of block
Executed by:
  • Self test
1
249 list = list->next;-
250 }
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
251-
252 /* If we have a list of substitutions to do, then reverse it-
253 to get the replacements in the proper order. */-
254-
255 rlist = REVERSE_LIST (rlist, REPL *);
rlistDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
rlist->nextDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-2
256-
257 hlist = history_list ();-
258-
259 /* If we still have something in list, it is a command spec.-
260 Otherwise, we use the most recent command in time. */-
261 command = fc_gethist (list ? list->word->word : (char *)NULL, hlist);-
262-
263 if (command == NULL)
command == ((void *)0)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
1-3
264 {-
265 builtin_error (_("no command found"));-
266 if (rlist)
rlistDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
267 FREE_RLIST ();
never executed: sh_xfree((rl->pat), "./fc.def", 267);
never executed: sh_xfree((rl->rep), "./fc.def", 267);
never executed: end of block
never executed: end of block
rl->patDescription
TRUEnever evaluated
FALSEnever evaluated
rl->repDescription
TRUEnever evaluated
FALSEnever evaluated
rlDescription
TRUEnever evaluated
FALSEnever evaluated
0
268-
269 return (EXECUTION_FAILURE);
executed 1 time by 1 test: return (1);
Executed by:
  • Self test
1
270 }-
271-
272 if (rlist)
rlistDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-2
273 {-
274 newcom = fc_dosubs (command, rlist);-
275 free (command);-
276 FREE_RLIST ();
executed 3 times by 1 test: sh_xfree((rl->pat), "./fc.def", 276);
Executed by:
  • Self test
executed 3 times by 1 test: sh_xfree((rl->rep), "./fc.def", 276);
Executed by:
  • Self test
executed 3 times by 1 test: end of block
Executed by:
  • Self test
rl->patDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
rl->repDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
rlDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-3
277 command = newcom;-
278 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
279-
280 fprintf (stderr, "%s\n", command);-
281 fc_replhist (command); /* replace `fc -s' with command */-
282 /* Posix says that the re-executed commands should be entered into the-
283 history. */-
284 return (parse_and_execute (command, "fc", SEVAL_NOHIST));
executed 3 times by 1 test: return (parse_and_execute (command, "fc", 0x004));
Executed by:
  • Self test
3
285 }-
286-
287 /* This is the second form of the command (the list-or-edit-and-rerun-
288 form). */-
289 hlist = history_list ();-
290 if (hlist == 0)
hlist == 0Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
0-12
291 return (EXECUTION_SUCCESS);
never executed: return (0);
0
292 for (i = 0; hlist[i]; i++);
executed 149 times by 1 test: ;
Executed by:
  • Self test
hlist[i]Description
TRUEevaluated 149 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
12-149
293-
294 /* With the Bash implementation of history, the current command line-
295 ("fc blah..." and so on) is already part of the history list by-
296 the time we get to this point. This just skips over that command-
297 and makes the last command that this deals with be the last command-
298 the user entered before the fc. We need to check whether the-
299 line was actually added (HISTIGNORE may have caused it to not be),-
300 so we check hist_last_line_added. */-
301-
302 /* Even though command substitution through parse_and_execute turns off-
303 remember_on_history, command substitution in a shell when set -o history-
304 has been enabled (interactive or not) should use it in the last_hist-
305 calculation as if it were on. */-
306 rh = remember_on_history || ((subshell_environment & SUBSHELL_COMSUB) && enable_history_list);
remember_on_historyDescription
TRUEevaluated 11 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
(subshell_environment & 0x04)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
enable_history_listDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-11
307 last_hist = i - rh - hist_last_line_added;-
308-
309 /* Make sure that real_last is calculated the same way here and in-
310 fc_gethnum. The return value from fc_gethnum is treated specially if-
311 it is == real_last and we are listing commands. */-
312 real_last = i;-
313 /* back up from the end to the last non-null history entry */-
314 while (hlist[real_last] == 0 && real_last > 0)
hlist[real_last] == 0Description
TRUEevaluated 12 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
real_last > 0Description
TRUEevaluated 12 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-12
315 real_last--;
executed 12 times by 1 test: real_last--;
Executed by:
  • Self test
12
316-
317 /* XXX */-
318 if (i == last_hist && hlist[last_hist] == 0)
i == last_histDescription
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
hlist[last_hist] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-12
319 while (last_hist >= 0 && hlist[last_hist] == 0)
last_hist >= 0Description
TRUEnever evaluated
FALSEnever evaluated
hlist[last_hist] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
320 last_hist--;
never executed: last_hist--;
0
321 if (last_hist < 0)
last_hist < 0Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
0-12
322 {-
323 sh_erange ((char *)NULL, _("history specification"));-
324 return (EXECUTION_FAILURE);
never executed: return (1);
0
325 }-
326-
327 if (list)
listDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
6
328 {-
329 histbeg = fc_gethnum (list->word->word, hlist);-
330 list = list->next;-
331-
332 if (list)
listDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
2-4
333 histend = fc_gethnum (list->word->word, hlist);
executed 2 times by 1 test: histend = fc_gethnum (list->word->word, hlist);
Executed by:
  • Self test
2
334 else if (histbeg == real_last)
histbeg == real_lastDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
1-3
335 histend = listing ? real_last : histbeg;
executed 1 time by 1 test: histend = listing ? real_last : histbeg;
Executed by:
  • Self test
listingDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
336 else-
337 histend = listing ? last_hist : histbeg;
executed 3 times by 1 test: histend = listing ? last_hist : histbeg;
Executed by:
  • Self test
listingDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3
338 }-
339 else-
340 {-
341 /* The default for listing is the last 16 history items. */-
342 if (listing)
listingDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-5
343 {-
344 histend = last_hist;-
345 histbeg = histend - 16 + 1; /* +1 because loop below uses >= */-
346 if (histbeg < 0)
histbeg < 0Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5
347 histbeg = 0;
executed 5 times by 1 test: histbeg = 0;
Executed by:
  • Self test
5
348 }
executed 5 times by 1 test: end of block
Executed by:
  • Self test
5
349 else-
350 /* For editing, it is the last history command. */-
351 histbeg = histend = last_hist;
executed 1 time by 1 test: histbeg = histend = last_hist;
Executed by:
  • Self test
1
352 }-
353-
354 /* "When not listing, the fc command that caused the editing shall not be-
355 entered into the history list." */-
356 if (listing == 0 && hist_last_line_added)
listing == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
hist_last_line_addedDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-10
357 {-
358 bash_delete_last_history ();-
359 /* If we're editing a single command -- the last command in the-
360 history -- and we just removed the dummy command added by-
361 edit_and_execute_command (), we need to check whether or not we-
362 just removed the last command in the history and need to back-
363 the pointer up. remember_on_history is off because we're running-
364 in parse_and_execute(). */-
365 if (histbeg == histend && histend == last_hist && hlist[last_hist] == 0)
histbeg == histendDescription
TRUEnever evaluated
FALSEnever evaluated
histend == last_histDescription
TRUEnever evaluated
FALSEnever evaluated
hlist[last_hist] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
366 last_hist = histbeg = --histend;
never executed: last_hist = histbeg = --histend;
0
367 }
never executed: end of block
0
368-
369 /* We print error messages for line specifications out of range. */-
370 if ((histbeg < 0) || (histend < 0))
(histbeg < 0)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 11 times by 1 test
Evaluated by:
  • Self test
(histend < 0)Description
TRUEnever evaluated
FALSEevaluated 11 times by 1 test
Evaluated by:
  • Self test
0-11
371 {-
372 sh_erange ((char *)NULL, _("history specification"));-
373 return (EXECUTION_FAILURE);
executed 1 time by 1 test: return (1);
Executed by:
  • Self test
1
374 }-
375-
376 if (histend < histbeg)
histend < histbegDescription
TRUEnever evaluated
FALSEevaluated 11 times by 1 test
Evaluated by:
  • Self test
0-11
377 {-
378 i = histend;-
379 histend = histbeg;-
380 histbeg = i;-
381-
382 reverse = 1;-
383 }
never executed: end of block
0
384-
385 if (listing)
listingDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-9
386 stream = stdout;
executed 9 times by 1 test: stream = stdout ;
Executed by:
  • Self test
9
387 else-
388 {-
389 numbering = 0;-
390 stream = sh_mktmpfp ("bash-fc", MT_USERANDOM|MT_USETMPDIR, &fn);-
391 if (stream == 0)
stream == 0Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-2
392 {-
393 builtin_error (_("%s: cannot open temp file: %s"), fn ? fn : "", strerror (errno));-
394 FREE (fn);
never executed: sh_xfree((fn), "./fc.def", 394);
fnDescription
TRUEnever evaluated
FALSEnever evaluated
0
395 return (EXECUTION_FAILURE);
never executed: return (1);
0
396 }-
397 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
398-
399 for (i = reverse ? histend : histbeg; reverse ? i >= histbeg : i <= histend; reverse ? i-- : i++)
reverse ? i >=...: i <= histendDescription
TRUEevaluated 44 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 11 times by 1 test
Evaluated by:
  • Self test
reverseDescription
TRUEnever evaluated
FALSEnever evaluated
0-44
400 {-
401 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 44 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 44 times by 1 test
Evaluated by:
  • Self test
0-44
402 if (numbering)
numberingDescription
TRUEevaluated 27 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 17 times by 1 test
Evaluated by:
  • Self test
17-27
403 fprintf (stream, "%d", i + history_base);
executed 27 times by 1 test: fprintf (stream, "%d", i + history_base);
Executed by:
  • Self test
27
404 if (listing)
listingDescription
TRUEevaluated 42 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-42
405 {-
406 if (posixly_correct)
posixly_correctDescription
TRUEnever evaluated
FALSEevaluated 42 times by 1 test
Evaluated by:
  • Self test
0-42
407 fputs ("\t", stream);
never executed: fputs ("\t", stream);
0
408 else-
409 fprintf (stream, "\t%c", histdata (i) ? '*' : ' ');
executed 42 times by 1 test: fprintf (stream, "\t%c", (hlist[(i)]->data) ? '*' : ' ');
Executed by:
  • Self test
42
410 }-
411 fprintf (stream, "%s\n", histline (i));-
412 }
executed 44 times by 1 test: end of block
Executed by:
  • Self test
44
413-
414 if (listing)
listingDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-9
415 return (sh_chkwrite (EXECUTION_SUCCESS));
executed 9 times by 1 test: return (sh_chkwrite (0));
Executed by:
  • Self test
9
416-
417 fflush (stream);-
418 if (ferror (stream))
ferror (stream)Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-2
419 {-
420 sh_wrerror ();-
421 fclose (stream);-
422 return (EXECUTION_FAILURE);
never executed: return (1);
0
423 }-
424 fclose (stream);-
425-
426 /* Now edit the file of commands. */-
427 if (ename)
enameDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
428 {-
429 command = (char *)xmalloc (strlen (ename) + strlen (fn) + 2);-
430 sprintf (command, "%s %s", ename, fn);-
431 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
432 else-
433 {-
434 fcedit = posixly_correct ? POSIX_FC_EDIT_COMMAND : FC_EDIT_COMMAND;
posixly_correctDescription
TRUEnever evaluated
FALSEnever evaluated
0
435 command = (char *)xmalloc (3 + strlen (fcedit) + strlen (fn));-
436 sprintf (command, "%s %s", fcedit, fn);-
437 }
never executed: end of block
0
438 retval = parse_and_execute (command, "fc", SEVAL_NOHIST);-
439 if (retval != EXECUTION_SUCCESS)
retval != 0Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-2
440 {-
441 unlink (fn);-
442 free (fn);-
443 return (EXECUTION_FAILURE);
never executed: return (1);
0
444 }-
445-
446#if defined (READLINE)-
447 /* If we're executing as part of a dispatched readline commnand like-
448 {emacs,vi}_edit_and_execute_command, the readline state will indicate it.-
449 We could remove the partial command from the history, but ksh93 doesn't-
450 so we stay compatible. */-
451#endif-
452-
453 /* Make sure parse_and_execute doesn't turn this off, even though a-
454 call to parse_and_execute farther up the function call stack (e.g.,-
455 if this is called by vi_edit_and_execute_command) may have already-
456 called bash_history_disable. */-
457 remember_on_history = 1;-
458-
459 /* Turn on the `v' flag while fc_execute_file runs so the commands-
460 will be echoed as they are read by the parser. */-
461 begin_unwind_frame ("fc builtin");-
462 add_unwind_protect (xfree, fn);-
463 add_unwind_protect (unlink, fn);-
464 add_unwind_protect (set_verbose_flag, (char *)NULL);-
465 echo_input_at_read = 1;-
466-
467 retval = fc_execute_file (fn);-
468 run_unwind_frame ("fc builtin");-
469-
470 return (retval);
executed 2 times by 1 test: return (retval);
Executed by:
  • Self test
2
471}-
472-
473/* Return 1 if LIST->word->word is a legal number for fc's use. */-
474static int-
475fc_number (list)-
476 WORD_LIST *list;-
477{-
478 char *s;-
479-
480 if (list == 0)
list == 0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34 times by 1 test
Evaluated by:
  • Self test
6-34
481 return 0;
executed 6 times by 1 test: return 0;
Executed by:
  • Self test
6
482 s = list->word->word;-
483 if (*s == '-')
*s == '-'Description
TRUEevaluated 27 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7 times by 1 test
Evaluated by:
  • Self test
7-27
484 s++;
executed 27 times by 1 test: s++;
Executed by:
  • Self test
27
485 return (legal_number (s, (intmax_t *)NULL));
executed 34 times by 1 test: return (legal_number (s, (intmax_t *) ((void *)0) ));
Executed by:
  • Self test
34
486}-
487-
488/* Return an absolute index into HLIST which corresponds to COMMAND. If-
489 COMMAND is a number, then it was specified in relative terms. If it-
490 is a string, then it is the start of a command line present in HLIST. */-
491static int-
492fc_gethnum (command, hlist)-
493 char *command;-
494 HIST_ENTRY **hlist;-
495{-
496 int sign, n, clen, rh;-
497 register int i, j, last_hist, real_last;-
498 register char *s;-
499-
500 sign = 1;-
501 /* Count history elements. */-
502 for (i = 0; hlist[i]; i++);
executed 204 times by 1 test: ;
Executed by:
  • Self test
hlist[i]Description
TRUEevaluated 204 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
12-204
503-
504 /* With the Bash implementation of history, the current command line-
505 ("fc blah..." and so on) is already part of the history list by-
506 the time we get to this point. This just skips over that command-
507 and makes the last command that this deals with be the last command-
508 the user entered before the fc. We need to check whether the-
509 line was actually added (HISTIGNORE may have caused it to not be),-
510 so we check hist_last_line_added. This needs to agree with the-
511 calculation of last_hist in fc_builtin above. */-
512 /* Even though command substitution through parse_and_execute turns off-
513 remember_on_history, command substitution in a shell when set -o history-
514 has been enabled (interactive or not) should use it in the last_hist-
515 calculation as if it were on. */-
516 rh = remember_on_history || ((subshell_environment & SUBSHELL_COMSUB) && enable_history_list);
remember_on_historyDescription
TRUEevaluated 11 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
(subshell_environment & 0x04)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
enable_history_listDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-11
517 last_hist = i - rh - hist_last_line_added;-
518-
519 if (i == last_hist && hlist[last_hist] == 0)
i == last_histDescription
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
hlist[last_hist] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-12
520 while (last_hist >= 0 && hlist[last_hist] == 0)
last_hist >= 0Description
TRUEnever evaluated
FALSEnever evaluated
hlist[last_hist] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
521 last_hist--;
never executed: last_hist--;
0
522 if (last_hist < 0)
last_hist < 0Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
0-12
523 return (-1);
never executed: return (-1);
0
524-
525 real_last = i;-
526 i = last_hist;-
527-
528 /* No specification defaults to most recent command. */-
529 if (command == NULL)
command == ((void *)0)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
2-10
530 return (i);
executed 2 times by 1 test: return (i);
Executed by:
  • Self test
2
531-
532 /* back up from the end to the last non-null history entry */-
533 while (hlist[real_last] == 0 && real_last > 0)
hlist[real_last] == 0Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test
real_last > 0Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-10
534 real_last--;
executed 10 times by 1 test: real_last--;
Executed by:
  • Self test
10
535-
536 /* Otherwise, there is a specification. It can be a number relative to-
537 the current position, or an absolute history number. */-
538 s = command;-
539-
540 /* Handle possible leading minus sign. */-
541 if (s && (*s == '-'))
sDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(*s == '-')Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7 times by 1 test
Evaluated by:
  • Self test
0-10
542 {-
543 sign = -1;-
544 s++;-
545 }
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
546-
547 if (s && DIGIT(*s))
sDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(*s) >= '0'Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(*s) <= '9'Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
0-10
548 {-
549 n = atoi (s);-
550 n *= sign;-
551-
552 /* If the value is negative or zero, then it is an offset from-
553 the current history item. */-
554 if (n < 0)
n < 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
3
555 {-
556 n += i + 1;-
557 return (n < 0 ? 0 : n);
executed 3 times by 1 test: return (n < 0 ? 0 : n);
Executed by:
  • Self test
3
558 }-
559 else if (n == 0)
n == 0Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
0-3
560 return ((sign == -1) ? real_last : i);
never executed: return ((sign == -1) ? real_last : i);
0
561 else-
562 {-
563 n -= history_base;-
564 return (i < n ? i : n);
executed 3 times by 1 test: return (i < n ? i : n);
Executed by:
  • Self test
3
565 }-
566 }-
567-
568 clen = strlen (command);-
569 for (j = i; j >= 0; j--)
j >= 0Description
TRUEevaluated 60 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
3-60
570 {-
571 if (STREQN (command, histline (j), clen))
never executed: __result = (((const unsigned char *) (const char *) ( command ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( (hlist[(j)]->line) ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
((clen == 0) ?...len ))) == 0))Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 59 times by 1 test
Evaluated by:
  • Self test
(clen == 0)Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • Self test
(command)[0] =...j)]->line))[0]Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 58 times by 1 test
Evaluated by:
  • Self test
(__extension__... clen ))) == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
__builtin_constant_p ( clen )Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
__builtin_cons..._p ( command )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( comma...e_t) ( clen ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...[(j)]->line) )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( (hlis...e_t) ( clen ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-60
572 return (j);
executed 1 time by 1 test: return (j);
Executed by:
  • Self test
1
573 }
executed 59 times by 1 test: end of block
Executed by:
  • Self test
59
574 return (-1);
executed 3 times by 1 test: return (-1);
Executed by:
  • Self test
3
575}-
576-
577/* Locate the most recent history line which begins with-
578 COMMAND in HLIST, and return a malloc()'ed copy of it. */-
579static char *-
580fc_gethist (command, hlist)-
581 char *command;-
582 HIST_ENTRY **hlist;-
583{-
584 int i;-
585-
586 if (hlist == 0)
hlist == 0Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
0-4
587 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
588-
589 i = fc_gethnum (command, hlist);-
590-
591 if (i >= 0)
i >= 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-3
592 return (savestring (histline (i)));
executed 3 times by 1 test: return ((char *)strcpy (sh_xmalloc((1 + strlen ((hlist[(i)]->line))), "./fc.def", 592), ((hlist[(i)]->line))));
Executed by:
  • Self test
3
593 else-
594 return ((char *)NULL);
executed 1 time by 1 test: return ((char *) ((void *)0) );
Executed by:
  • Self test
1
595}-
596-
597#ifdef INCLUDE_UNUSED-
598/* Read the edited history lines from STREAM and return them-
599 one at a time. This can read unlimited length lines. The-
600 caller should free the storage. */-
601static char *-
602fc_readline (stream)-
603 FILE *stream;-
604{-
605 register int c;-
606 int line_len = 0, lindex = 0;-
607 char *line = (char *)NULL;-
608-
609 while ((c = getc (stream)) != EOF)-
610 {-
611 if ((lindex + 2) >= line_len)-
612 line = (char *)xrealloc (line, (line_len += 128));-
613-
614 if (c == '\n')-
615 {-
616 line[lindex++] = '\n';-
617 line[lindex++] = '\0';-
618 return (line);-
619 }-
620 else-
621 line[lindex++] = c;-
622 }-
623-
624 if (!lindex)-
625 {-
626 if (line)-
627 free (line);-
628-
629 return ((char *)NULL);-
630 }-
631-
632 if (lindex + 2 >= line_len)-
633 line = (char *)xrealloc (line, lindex + 3);-
634-
635 line[lindex++] = '\n'; /* Finish with newline if none in file */-
636 line[lindex++] = '\0';-
637 return (line);-
638}-
639#endif-
640-
641/* Perform the SUBS on COMMAND.-
642 SUBS is a list of substitutions, and COMMAND is a simple string.-
643 Return a pointer to a malloc'ed string which contains the substituted-
644 command. */-
645static char *-
646fc_dosubs (command, subs)-
647 char *command;-
648 REPL *subs;-
649{-
650 register char *new, *t;-
651 register REPL *r;-
652-
653 for (new = savestring (command), r = subs; r; r = r->next)
rDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-3
654 {-
655 t = strsub (new, r->pat, r->rep, 1);-
656 free (new);-
657 new = t;-
658 }
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
659 return (new);
executed 2 times by 1 test: return (new);
Executed by:
  • Self test
2
660}-
661-
662/* Use `command' to replace the last entry in the history list, which,-
663 by this time, is `fc blah...'. The intent is that the new command-
664 become the history entry, and that `fc' should never appear in the-
665 history list. This way you can do `r' to your heart's content. */-
666static void-
667fc_replhist (command)-
668 char *command;-
669{-
670 int n;-
671-
672 if (command == 0 || *command == '\0')
command == 0Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
*command == '\0'Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
0-3
673 return;
never executed: return;
0
674-
675 n = strlen (command);-
676 if (command[n - 1] == '\n')
command[n - 1] == '\n'Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
1-2
677 command[n - 1] = '\0';
executed 1 time by 1 test: command[n - 1] = '\0';
Executed by:
  • Self test
1
678-
679 if (command && *command)
commandDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
*commandDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3
680 {-
681 bash_delete_last_history ();-
682 maybe_add_history (command); /* Obeys HISTCONTROL setting. */-
683 }
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
684}
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
685-
686#ifdef INCLUDE_UNUSED-
687/* Add LINE to the history, after removing a single trailing newline. */-
688static void-
689fc_addhist (line)-
690 char *line;-
691{-
692 register int n;-
693-
694 if (line == 0 || *line == 0)-
695 return;-
696-
697 n = strlen (line);-
698-
699 if (line[n - 1] == '\n')-
700 line[n - 1] = '\0';-
701-
702 if (line && *line)-
703 maybe_add_history (line); /* Obeys HISTCONTROL setting. */-
704}-
705#endif-
706-
707#endif /* HISTORY */-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2