OpenCoverage

general.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/general.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* general.c -- Stuff that is used by all files. */-
2-
3/* Copyright (C) 1987-2016 Free Software Foundation, Inc.-
4-
5 This file is part of GNU Bash, the Bourne Again SHell.-
6-
7 Bash is free software: you can redistribute it and/or modify-
8 it under the terms of the GNU General Public License as published by-
9 the Free Software Foundation, either version 3 of the License, or-
10 (at your option) any later version.-
11-
12 Bash is distributed in the hope that it will be useful,-
13 but WITHOUT ANY WARRANTY; without even the implied warranty of-
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
15 GNU General Public License for more details.-
16-
17 You should have received a copy of the GNU General Public License-
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.-
19*/-
20-
21#include "config.h"-
22-
23#include "bashtypes.h"-
24#if defined (HAVE_SYS_PARAM_H)-
25# include <sys/param.h>-
26#endif-
27#include "posixstat.h"-
28-
29#if defined (HAVE_UNISTD_H)-
30# include <unistd.h>-
31#endif-
32-
33#include "filecntl.h"-
34#include "bashansi.h"-
35#include <stdio.h>-
36#include "chartypes.h"-
37#include <errno.h>-
38-
39#include "bashintl.h"-
40-
41#include "shell.h"-
42#include "parser.h"-
43#include "flags.h"-
44#include "findcmd.h"-
45#include "test.h"-
46#include "trap.h"-
47-
48#include "builtins/common.h"-
49-
50#if defined (HAVE_MBSTR_H) && defined (HAVE_MBSCHR)-
51# include <mbstr.h> /* mbschr */-
52#endif-
53-
54#include <tilde/tilde.h>-
55-
56#if !defined (errno)-
57extern int errno;-
58#endif /* !errno */-
59-
60#ifdef __CYGWIN__-
61# include <sys/cygwin.h>-
62#endif-
63-
64static char *bash_special_tilde_expansions __P((char *));-
65static int unquoted_tilde_word __P((const char *));-
66static void initialize_group_array __P((void));-
67-
68/* A standard error message to use when getcwd() returns NULL. */-
69const char * const bash_getcwd_errstr = N_("getcwd: cannot access parent directories");-
70-
71/* Do whatever is necessary to initialize `Posix mode'. */-
72void-
73posix_initialize (on)-
74 int on;-
75{-
76 /* Things that should be turned on when posix mode is enabled. */-
77 if (on != 0)
on != 0Description
TRUEevaluated 162 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 133 times by 1 test
Evaluated by:
  • Self test
133-162
78 {-
79 interactive_comments = source_uses_path = expand_aliases = 1;-
80 inherit_errexit = 1;-
81 source_searches_cwd = 0;-
82 }
executed 162 times by 1 test: end of block
Executed by:
  • Self test
162
83-
84 /* Things that should be turned on when posix mode is disabled. */-
85 if (on == 0)
on == 0Description
TRUEevaluated 133 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 162 times by 1 test
Evaluated by:
  • Self test
133-162
86 {-
87 source_searches_cwd = 1;-
88 expand_aliases = interactive_shell;-
89 }
executed 133 times by 1 test: end of block
Executed by:
  • Self test
133
90}
executed 295 times by 1 test: end of block
Executed by:
  • Self test
295
91-
92/* **************************************************************** */-
93/* */-
94/* Functions to convert to and from and display non-standard types */-
95/* */-
96/* **************************************************************** */-
97-
98#if defined (RLIMTYPE)-
99RLIMTYPE-
100string_to_rlimtype (s)-
101 char *s;-
102{-
103 RLIMTYPE ret;-
104 int neg;-
105-
106 ret = 0;-
107 neg = 0;-
108 while (s && *s && whitespace (*s))
sDescription
TRUEevaluated 241 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
*sDescription
TRUEevaluated 241 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
((*s) == ' ')Description
TRUEnever evaluated
FALSEevaluated 241 times by 1 test
Evaluated by:
  • Self test
((*s) == '\t')Description
TRUEnever evaluated
FALSEevaluated 241 times by 1 test
Evaluated by:
  • Self test
0-241
109 s++;
never executed: s++;
0
110 if (s && (*s == '-' || *s == '+'))
sDescription
TRUEevaluated 241 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
*s == '-'Description
TRUEnever evaluated
FALSEevaluated 241 times by 1 test
Evaluated by:
  • Self test
*s == '+'Description
TRUEnever evaluated
FALSEevaluated 241 times by 1 test
Evaluated by:
  • Self test
0-241
111 {-
112 neg = *s == '-';-
113 s++;-
114 }
never executed: end of block
0
115 for ( ; s && *s && DIGIT (*s); s++)
sDescription
TRUEevaluated 942 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
*sDescription
TRUEevaluated 701 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 241 times by 1 test
Evaluated by:
  • Self test
(*s) >= '0'Description
TRUEevaluated 701 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(*s) <= '9'Description
TRUEevaluated 701 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-942
116 ret = (ret * 10) + TODIGIT (*s);
executed 701 times by 1 test: ret = (ret * 10) + ((*s) - '0');
Executed by:
  • Self test
701
117 return (neg ? -ret : ret);
executed 241 times by 1 test: return (neg ? -ret : ret);
Executed by:
  • Self test
241
118}-
119-
120void-
121print_rlimtype (n, addnl)-
122 RLIMTYPE n;-
123 int addnl;-
124{-
125 char s[INT_STRLEN_BOUND (RLIMTYPE) + 1], *p;-
126-
127 p = s + sizeof(s);-
128 *--p = '\0';-
129-
130 if (n < 0)
n < 0Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-2
131 {-
132 do-
133 *--p = '0' - n % 10;
never executed: *--p = '0' - n % 10;
0
134 while ((n /= 10) != 0);
(n /= 10) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
135-
136 *--p = '-';-
137 }
never executed: end of block
0
138 else-
139 {-
140 do-
141 *--p = '0' + n % 10;
executed 7 times by 1 test: *--p = '0' + n % 10;
Executed by:
  • Self test
7
142 while ((n /= 10) != 0);
(n /= 10) != 0Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-5
143 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
144-
145 printf ("%s%s", p, addnl ? "\n" : "");-
146}
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
147#endif /* RLIMTYPE */-
148-
149/* **************************************************************** */-
150/* */-
151/* Input Validation Functions */-
152/* */-
153/* **************************************************************** */-
154-
155/* Return non-zero if all of the characters in STRING are digits. */-
156int-
157all_digits (string)-
158 const char *string;-
159{-
160 register const char *s;-
161-
162 for (s = string; *s; s++)
*sDescription
TRUEevaluated 2056526 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 30136 times by 1 test
Evaluated by:
  • Self test
30136-2056526
163 if (DIGIT (*s) == 0)
((*s) >= '0' &...) <= '9') == 0Description
TRUEevaluated 2025850 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 30676 times by 1 test
Evaluated by:
  • Self test
(*s) >= '0'Description
TRUEevaluated 2056491 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 35 times by 1 test
Evaluated by:
  • Self test
(*s) <= '9'Description
TRUEevaluated 30676 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2025815 times by 1 test
Evaluated by:
  • Self test
35-2056491
164 return (0);
executed 2025850 times by 1 test: return (0);
Executed by:
  • Self test
2025850
165-
166 return (1);
executed 30136 times by 1 test: return (1);
Executed by:
  • Self test
30136
167}-
168-
169/* Return non-zero if the characters pointed to by STRING constitute a-
170 valid number. Stuff the converted number into RESULT if RESULT is-
171 not null. */-
172int-
173legal_number (string, result)-
174 const char *string;-
175 intmax_t *result;-
176{-
177 intmax_t value;-
178 char *ep;-
179-
180 if (result)
resultDescription
TRUEevaluated 3727658 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34 times by 1 test
Evaluated by:
  • Self test
34-3727658
181 *result = 0;
executed 3727658 times by 1 test: *result = 0;
Executed by:
  • Self test
3727658
182-
183 if (string == 0)
string == 0Description
TRUEnever evaluated
FALSEevaluated 3727692 times by 1 test
Evaluated by:
  • Self test
0-3727692
184 return 0;
never executed: return 0;
0
185-
186 errno = 0;-
187 value = strtoimax (string, &ep, 10);-
188 if (errno || ep == string)
(*__errno_location ())Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3727684 times by 1 test
Evaluated by:
  • Self test
ep == stringDescription
TRUEevaluated 2355150 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1372534 times by 1 test
Evaluated by:
  • Self test
8-3727684
189 return 0; /* errno is set on overflow or underflow */
executed 2355158 times by 1 test: return 0;
Executed by:
  • Self test
2355158
190-
191 /* Skip any trailing whitespace, since strtoimax does not. */-
192 while (whitespace (*ep))
((*ep) == ' ')Description
TRUEnever evaluated
FALSEevaluated 1372534 times by 1 test
Evaluated by:
  • Self test
((*ep) == '\t')Description
TRUEnever evaluated
FALSEevaluated 1372534 times by 1 test
Evaluated by:
  • Self test
0-1372534
193 ep++;
never executed: ep++;
0
194-
195 /* If *string is not '\0' but *ep is '\0' on return, the entire string-
196 is valid. */-
197 if (*string && *ep == '\0')
*stringDescription
TRUEevaluated 1372534 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
*ep == '\0'Description
TRUEevaluated 1372525 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
0-1372534
198 {-
199 if (result)
resultDescription
TRUEevaluated 1372520 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
5-1372520
200 *result = value;
executed 1372520 times by 1 test: *result = value;
Executed by:
  • Self test
1372520
201 /* The SunOS4 implementation of strtol() will happily ignore-
202 overflow conditions, so this cannot do overflow correctly-
203 on those systems. */-
204 return 1;
executed 1372525 times by 1 test: return 1;
Executed by:
  • Self test
1372525
205 }-
206 -
207 return (0);
executed 9 times by 1 test: return (0);
Executed by:
  • Self test
9
208}-
209-
210/* Return 1 if this token is a legal shell `identifier'; that is, it consists-
211 solely of letters, digits, and underscores, and does not begin with a-
212 digit. */-
213int-
214legal_identifier (name)-
215 const char *name;-
216{-
217 register const char *s;-
218 unsigned char c;-
219-
220 if (!name || !(c = *name) || (legal_variable_starter (c) == 0))
!nameDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7188194 times by 1 test
Evaluated by:
  • Self test
!(c = *name)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7188192 times by 1 test
Evaluated by:
  • Self test
(((1 && ((*__c...== '_')) == 0)Description
TRUEevaluated 777 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7187415 times by 1 test
Evaluated by:
  • Self test
((*__ctype_b_l...int) _ISalpha)Description
TRUEevaluated 7181802 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6390 times by 1 test
Evaluated by:
  • Self test
(c == '_')Description
TRUEevaluated 5613 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 777 times by 1 test
Evaluated by:
  • Self test
1-7188194
221 return (0);
executed 780 times by 1 test: return (0);
Executed by:
  • Self test
780
222-
223 for (s = name + 1; (c = *s) != 0; s++)
(c = *s) != 0Description
TRUEevaluated 4807146 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 7187241 times by 1 test
Evaluated by:
  • Self test
4807146-7187241
224 {-
225 if (legal_variable_char (c) == 0)
((1 && ((*__ct...c == '_') == 0Description
TRUEevaluated 174 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4806972 times by 1 test
Evaluated by:
  • Self test
((*__ctype_b_l...int) _ISalnum)Description
TRUEevaluated 4726728 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 80418 times by 1 test
Evaluated by:
  • Self test
c == '_'Description
TRUEevaluated 80244 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 174 times by 1 test
Evaluated by:
  • Self test
174-4806972
226 return (0);
executed 174 times by 1 test: return (0);
Executed by:
  • Self test
174
227 }
executed 4806972 times by 1 test: end of block
Executed by:
  • Self test
4806972
228 return (1);
executed 7187241 times by 1 test: return (1);
Executed by:
  • Self test
7187241
229}-
230-
231/* Return 1 if NAME is a valid value that can be assigned to a nameref-
232 variable. FLAGS can be 2, in which case the name is going to be used-
233 to create a variable. Other values are currently unused, but could-
234 be used to allow values to be stored and indirectly referenced, but-
235 not used in assignments. */-
236int-
237valid_nameref_value (name, flags)-
238 const char *name;-
239 int flags;-
240{-
241 if (name == 0 || *name == 0)
name == 0Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 518 times by 1 test
Evaluated by:
  • Self test
*name == 0Description
TRUEevaluated 30 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 488 times by 1 test
Evaluated by:
  • Self test
8-518
242 return 0;
executed 38 times by 1 test: return 0;
Executed by:
  • Self test
38
243-
244 /* valid identifier */-
245#if defined (ARRAY_VARS) -
246 if (legal_identifier (name) || (flags != 2 && valid_array_reference (name, 0)))
legal_identifier (name)Description
TRUEevaluated 283 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 205 times by 1 test
Evaluated by:
  • Self test
flags != 2Description
TRUEevaluated 197 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
valid_array_re...ence (name, 0)Description
TRUEevaluated 87 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 110 times by 1 test
Evaluated by:
  • Self test
8-283
247#else-
248 if (legal_identifier (name))-
249#endif-
250 return 1;
executed 370 times by 1 test: return 1;
Executed by:
  • Self test
370
251-
252 return 0;
executed 118 times by 1 test: return 0;
Executed by:
  • Self test
118
253}-
254-
255int-
256check_selfref (name, value, flags)-
257 const char *name;-
258 char *value;-
259 int flags;-
260{-
261 char *t;-
262-
263 if (STREQ (name, value))
never executed: __result = (((const unsigned char *) (const char *) ( name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(name)[0] == (value)[0]Description
TRUEevaluated 40 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 506 times by 1 test
Evaluated by:
  • Self test
__extension__ ... )))); }) == 0Description
TRUEevaluated 16 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 24 times by 1 test
Evaluated by:
  • Self test
__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-506
264 return 1;
executed 16 times by 1 test: return 1;
Executed by:
  • Self test
16
265-
266#if defined (ARRAY_VARS)-
267 if (valid_array_reference (value, 0))
valid_array_re...nce (value, 0)Description
TRUEevaluated 85 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 445 times by 1 test
Evaluated by:
  • Self test
85-445
268 {-
269 t = array_variable_name (value, 0, (char **)NULL, (int *)NULL);-
270 if (t && STREQ (name, t))
never executed: __result = (((const unsigned char *) (const char *) ( name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( t ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
tDescription
TRUEevaluated 85 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(name)[0] == (t)[0]Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 81 times by 1 test
Evaluated by:
  • Self test
__extension__ ... )))); }) == 0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
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-85
271 {-
272 free (t);-
273 return 1;
executed 4 times by 1 test: return 1;
Executed by:
  • Self test
4
274 }-
275 free (t);-
276 }
executed 81 times by 1 test: end of block
Executed by:
  • Self test
81
277#endif-
278-
279 return 0; /* not a self reference */
executed 526 times by 1 test: return 0;
Executed by:
  • Self test
526
280}-
281-
282/* Make sure that WORD is a valid shell identifier, i.e.-
283 does not contain a dollar sign, nor is quoted in any way. Nor-
284 does it consist of all digits. If CHECK_WORD is non-zero,-
285 the word is checked to ensure that it consists of only letters,-
286 digits, and underscores. */-
287int-
288check_identifier (word, check_word)-
289 WORD_DESC *word;-
290 int check_word;-
291{-
292 if ((word->flags & (W_HASDOLLAR|W_QUOTED)) || all_digits (word->word))
(word->flags &...001|0x000002))Description
TRUEnever evaluated
FALSEevaluated 2025662 times by 1 test
Evaluated by:
  • Self test
all_digits (word->word)Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2025657 times by 1 test
Evaluated by:
  • Self test
0-2025662
293 {-
294 internal_error (_("`%s': not a valid identifier"), word->word);-
295 return (0);
executed 5 times by 1 test: return (0);
Executed by:
  • Self test
5
296 }-
297 else if (check_word && legal_identifier (word->word) == 0)
check_wordDescription
TRUEevaluated 2014501 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 11156 times by 1 test
Evaluated by:
  • Self test
legal_identifi...rd->word) == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2014499 times by 1 test
Evaluated by:
  • Self test
2-2014501
298 {-
299 internal_error (_("`%s': not a valid identifier"), word->word);-
300 return (0);
executed 2 times by 1 test: return (0);
Executed by:
  • Self test
2
301 }-
302 else-
303 return (1);
executed 2025655 times by 1 test: return (1);
Executed by:
  • Self test
2025655
304}-
305-
306/* Return 1 if STRING is a function name that the shell will import from-
307 the environment. Currently we reject attempts to import shell functions-
308 containing slashes, beginning with newlines or containing blanks. In-
309 Posix mode, we require that STRING be a valid shell identifier. Not-
310 used yet. */-
311int-
312importable_function_name (string, len)-
313 const char *string;-
314 size_t len;-
315{-
316 if (absolute_program (string)) /* don't allow slash */
absolute_program (string)Description
TRUEnever evaluated
FALSEnever evaluated
0
317 return 0;
never executed: return 0;
0
318 if (*string == '\n') /* can't start with a newline */
*string == '\n'Description
TRUEnever evaluated
FALSEnever evaluated
0
319 return 0;
never executed: return 0;
0
320 if (shellblank (*string) || shellblank(string[len-1]))
(sh_syntaxtab[...ng)] & 0x2000)Description
TRUEnever evaluated
FALSEnever evaluated
(sh_syntaxtab[...1])] & 0x2000)Description
TRUEnever evaluated
FALSEnever evaluated
0
321 return 0;
never executed: return 0;
0
322 return (posixly_correct ? legal_identifier (string) : 1);
never executed: return (posixly_correct ? legal_identifier (string) : 1);
0
323}-
324-
325int-
326exportable_function_name (string)-
327 const char *string;-
328{-
329 if (absolute_program (string))
absolute_program (string)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 13 times by 1 test
Evaluated by:
  • Self test
1-13
330 return 0;
executed 1 time by 1 test: return 0;
Executed by:
  • Self test
1
331 if (mbschr (string, '=') != 0)
mbschr (string, '=') != 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
1-12
332 return 0;
executed 1 time by 1 test: return 0;
Executed by:
  • Self test
1
333 return 1;
executed 12 times by 1 test: return 1;
Executed by:
  • Self test
12
334}-
335-
336/* Return 1 if STRING comprises a valid alias name. The shell accepts-
337 essentially all characters except those which must be quoted to the-
338 parser (which disqualifies them from alias expansion anyway) and `/'. */-
339int-
340legal_alias_name (string, flags)-
341 const char *string;-
342 int flags;-
343{-
344 register const char *s;-
345-
346 for (s = string; *s; s++)
*sDescription
TRUEevaluated 343 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 93 times by 1 test
Evaluated by:
  • Self test
93-343
347 if (shellbreak (*s) || shellxquote (*s) || shellexp (*s) || (*s == '/'))
(sh_syntaxtab[...*s)] & 0x0002)Description
TRUEnever evaluated
FALSEevaluated 343 times by 1 test
Evaluated by:
  • Self test
(sh_syntaxtab[...*s)] & 0x0400)Description
TRUEnever evaluated
FALSEevaluated 343 times by 1 test
Evaluated by:
  • Self test
(*s) == '$'Description
TRUEnever evaluated
FALSEevaluated 343 times by 1 test
Evaluated by:
  • Self test
(*s) == '<'Description
TRUEnever evaluated
FALSEevaluated 343 times by 1 test
Evaluated by:
  • Self test
(*s) == '>'Description
TRUEnever evaluated
FALSEevaluated 343 times by 1 test
Evaluated by:
  • Self test
(*s == '/')Description
TRUEnever evaluated
FALSEevaluated 343 times by 1 test
Evaluated by:
  • Self test
0-343
348 return 0;
never executed: return 0;
0
349 return 1;
executed 93 times by 1 test: return 1;
Executed by:
  • Self test
93
350}-
351-
352/* Returns non-zero if STRING is an assignment statement. The returned value-
353 is the index of the `=' sign. If FLAGS&1 we are expecting a compound assignment-
354 and don't want an array subscript before the `='. */-
355int-
356assignment (string, flags)-
357 const char *string;-
358 int flags;-
359{-
360 register unsigned char c;-
361 register int newi, indx;-
362-
363 c = string[indx = 0];-
364-
365#if defined (ARRAY_VARS)-
366 if ((legal_variable_starter (c) == 0) && ((flags&1) == 0 || c != '[')) /* ] */
(((1 && ((*__c...== '_')) == 0)Description
TRUEevaluated 624518 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 38409330 times by 1 test
Evaluated by:
  • Self test
((*__ctype_b_l...int) _ISalpha)Description
TRUEevaluated 38380341 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 653507 times by 1 test
Evaluated by:
  • Self test
(c == '_')Description
TRUEevaluated 28989 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 624518 times by 1 test
Evaluated by:
  • Self test
(flags&1) == 0Description
TRUEevaluated 619166 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5352 times by 1 test
Evaluated by:
  • Self test
c != '['Description
TRUEevaluated 1144 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4208 times by 1 test
Evaluated by:
  • Self test
1144-38409330
367#else-
368 if (legal_variable_starter (c) == 0)-
369#endif-
370 return (0);
executed 620310 times by 1 test: return (0);
Executed by:
  • Self test
620310
371-
372 while (c = string[indx])
c = string[indx]Description
TRUEevaluated 92103721 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1707611 times by 1 test
Evaluated by:
  • Self test
1707611-92103721
373 {-
374 /* The following is safe. Note that '=' at the start of a word-
375 is not an assignment statement. */-
376 if (c == '=')
c == '='Description
TRUEevaluated 36693253 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 55410468 times by 1 test
Evaluated by:
  • Self test
36693253-55410468
377 return (indx);
executed 36693253 times by 1 test: return (indx);
Executed by:
  • Self test
36693253
378-
379#if defined (ARRAY_VARS)-
380 if (c == '[')
c == '['Description
TRUEevaluated 6145 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 55404323 times by 1 test
Evaluated by:
  • Self test
6145-55404323
381 {-
382 newi = skipsubscript (string, indx, (flags & 2) ? 1 : 0);-
383 /* XXX - why not check for blank subscripts here, if we do in-
384 valid_array_reference? */-
385 if (string[newi++] != ']')
string[newi++] != ']'Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6142 times by 1 test
Evaluated by:
  • Self test
3-6142
386 return (0);
executed 3 times by 1 test: return (0);
Executed by:
  • Self test
3
387 if (string[newi] == '+' && string[newi+1] == '=')
string[newi] == '+'Description
TRUEevaluated 30 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6112 times by 1 test
Evaluated by:
  • Self test
string[newi+1] == '='Description
TRUEevaluated 30 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-6112
388 return (newi + 1);
executed 30 times by 1 test: return (newi + 1);
Executed by:
  • Self test
30
389 return ((string[newi] == '=') ? newi : 0);
executed 6112 times by 1 test: return ((string[newi] == '=') ? newi : 0);
Executed by:
  • Self test
6112
390 }-
391#endif /* ARRAY_VARS */-
392-
393 /* Check for `+=' */-
394 if (c == '+' && string[indx+1] == '=')
c == '+'Description
TRUEevaluated 3186 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 55401137 times by 1 test
Evaluated by:
  • Self test
string[indx+1] == '='Description
TRUEevaluated 3163 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 23 times by 1 test
Evaluated by:
  • Self test
23-55401137
395 return (indx + 1);
executed 3163 times by 1 test: return (indx + 1);
Executed by:
  • Self test
3163
396-
397 /* Variable names in assignment statements may contain only letters,-
398 digits, and `_'. */-
399 if (legal_variable_char (c) == 0)
((1 && ((*__ct...c == '_') == 0Description
TRUEevaluated 3366 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 55397794 times by 1 test
Evaluated by:
  • Self test
((*__ctype_b_l...int) _ISalnum)Description
TRUEevaluated 55342190 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 58970 times by 1 test
Evaluated by:
  • Self test
c == '_'Description
TRUEevaluated 55604 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3366 times by 1 test
Evaluated by:
  • Self test
3366-55397794
400 return (0);
executed 3366 times by 1 test: return (0);
Executed by:
  • Self test
3366
401-
402 indx++;-
403 }
executed 55397794 times by 1 test: end of block
Executed by:
  • Self test
55397794
404 return (0);
executed 1707611 times by 1 test: return (0);
Executed by:
  • Self test
1707611
405}-
406-
407int-
408line_isblank (line)-
409 const char *line;-
410{-
411 register int i;-
412-
413 if (line == 0)
line == 0Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-2
414 return 0; /* XXX */
never executed: return 0;
0
415 for (i = 0; line[i]; i++)
line[i]Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
416 if (isblank ((unsigned char)line[i]) == 0)
((*__ctype_b_l..._ISblank) == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
417 break;
executed 2 times by 1 test: break;
Executed by:
  • Self test
2
418 return (line[i] == '\0');
executed 2 times by 1 test: return (line[i] == '\0');
Executed by:
  • Self test
2
419}-
420-
421/* **************************************************************** */-
422/* */-
423/* Functions to manage files and file descriptors */-
424/* */-
425/* **************************************************************** */-
426-
427/* A function to unset no-delay mode on a file descriptor. Used in shell.c-
428 to unset it on the fd passed as stdin. Should be called on stdin if-
429 readline gets an EAGAIN or EWOULDBLOCK when trying to read input. */-
430-
431#if !defined (O_NDELAY)-
432# if defined (FNDELAY)-
433# define O_NDELAY FNDELAY-
434# endif-
435#endif /* O_NDELAY */-
436-
437/* Make sure no-delay mode is not set on file descriptor FD. */-
438int-
439sh_unset_nodelay_mode (fd)-
440 int fd;-
441{-
442 int flags, bflags;-
443-
444 if ((flags = fcntl (fd, F_GETFL, 0)) < 0)
(flags = fcntl...d, 3 , 0)) < 0Description
TRUEnever evaluated
FALSEevaluated 5266 times by 1 test
Evaluated by:
  • Self test
0-5266
445 return -1;
never executed: return -1;
0
446-
447 bflags = 0;-
448-
449 /* This is defined to O_NDELAY in filecntl.h if O_NONBLOCK is not present-
450 and O_NDELAY is defined. */-
451#ifdef O_NONBLOCK-
452 bflags |= O_NONBLOCK;-
453#endif-
454-
455#ifdef O_NDELAY-
456 bflags |= O_NDELAY;-
457#endif-
458-
459 if (flags & bflags)
flags & bflagsDescription
TRUEnever evaluated
FALSEevaluated 5266 times by 1 test
Evaluated by:
  • Self test
0-5266
460 {-
461 flags &= ~bflags;-
462 return (fcntl (fd, F_SETFL, flags));
never executed: return (fcntl (fd, 4 , flags));
0
463 }-
464-
465 return 0;
executed 5266 times by 1 test: return 0;
Executed by:
  • Self test
5266
466}-
467-
468/* Just a wrapper for the define in include/filecntl.h */-
469int-
470sh_setclexec (fd)-
471 int fd;-
472{-
473 return (SET_CLOSE_ON_EXEC (fd));
never executed: return ((fcntl ((fd), 2 , 1 )));
0
474}-
475-
476/* Return 1 if file descriptor FD is valid; 0 otherwise. */-
477int-
478sh_validfd (fd)-
479 int fd;-
480{-
481 return (fcntl (fd, F_GETFD, 0) >= 0);
executed 1321224 times by 1 test: return (fcntl (fd, 1 , 0) >= 0);
Executed by:
  • Self test
1321224
482}-
483-
484int-
485fd_ispipe (fd)-
486 int fd;-
487{-
488 errno = 0;-
489 return ((lseek (fd, 0L, SEEK_CUR) < 0) && (errno == ESPIPE));
never executed: return ((lseek (fd, 0L, 1 ) < 0) && ( (*__errno_location ()) == 29 ));
0
490}-
491-
492/* There is a bug in the NeXT 2.1 rlogind that causes opens-
493 of /dev/tty to fail. */-
494-
495#if defined (__BEOS__)-
496/* On BeOS, opening in non-blocking mode exposes a bug in BeOS, so turn it-
497 into a no-op. This should probably go away in the future. */-
498# undef O_NONBLOCK-
499# define O_NONBLOCK 0-
500#endif /* __BEOS__ */-
501-
502void-
503check_dev_tty ()-
504{-
505 int tty_fd;-
506 char *tty;-
507-
508 tty_fd = open ("/dev/tty", O_RDWR|O_NONBLOCK);-
509-
510 if (tty_fd < 0)
tty_fd < 0Description
TRUEevaluated 5432 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5432
511 {-
512 tty = (char *)ttyname (fileno (stdin));-
513 if (tty == 0)
tty == 0Description
TRUEevaluated 5432 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5432
514 return;
executed 5432 times by 1 test: return;
Executed by:
  • Self test
5432
515 tty_fd = open (tty, O_RDWR|O_NONBLOCK);-
516 }
never executed: end of block
0
517 if (tty_fd >= 0)
tty_fd >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
518 close (tty_fd);
never executed: close (tty_fd);
0
519}
never executed: end of block
0
520-
521/* Return 1 if PATH1 and PATH2 are the same file. This is kind of-
522 expensive. If non-NULL STP1 and STP2 point to stat structures-
523 corresponding to PATH1 and PATH2, respectively. */-
524int-
525same_file (path1, path2, stp1, stp2)-
526 const char *path1, *path2;-
527 struct stat *stp1, *stp2;-
528{-
529 struct stat st1, st2;-
530-
531 if (stp1 == NULL)
stp1 == ((void *)0)Description
TRUEevaluated 5446 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5258 times by 1 test
Evaluated by:
  • Self test
5258-5446
532 {-
533 if (stat (path1, &st1) != 0)
stat (path1, &st1) != 0Description
TRUEnever evaluated
FALSEevaluated 5446 times by 1 test
Evaluated by:
  • Self test
0-5446
534 return (0);
never executed: return (0);
0
535 stp1 = &st1;-
536 }
executed 5446 times by 1 test: end of block
Executed by:
  • Self test
5446
537-
538 if (stp2 == NULL)
stp2 == ((void *)0)Description
TRUEevaluated 10701 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
3-10701
539 {-
540 if (stat (path2, &st2) != 0)
stat (path2, &st2) != 0Description
TRUEnever evaluated
FALSEevaluated 10701 times by 1 test
Evaluated by:
  • Self test
0-10701
541 return (0);
never executed: return (0);
0
542 stp2 = &st2;-
543 }
executed 10701 times by 1 test: end of block
Executed by:
  • Self test
10701
544-
545 return ((stp1->st_dev == stp2->st_dev) && (stp1->st_ino == stp2->st_ino));
executed 10704 times by 1 test: return ((stp1->st_dev == stp2->st_dev) && (stp1->st_ino == stp2->st_ino));
Executed by:
  • Self test
10704
546}-
547-
548/* Move FD to a number close to the maximum number of file descriptors-
549 allowed in the shell process, to avoid the user stepping on it with-
550 redirection and causing us extra work. If CHECK_NEW is non-zero,-
551 we check whether or not the file descriptors are in use before-
552 duplicating FD onto them. MAXFD says where to start checking the-
553 file descriptors. If it's less than 20, we get the maximum value-
554 available from getdtablesize(2). */-
555int-
556move_to_high_fd (fd, check_new, maxfd)-
557 int fd, check_new, maxfd;-
558{-
559 int script_fd, nfds, ignore;-
560-
561 if (maxfd < 20)
maxfd < 20Description
TRUEevaluated 5419 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 679164 times by 1 test
Evaluated by:
  • Self test
5419-679164
562 {-
563 nfds = getdtablesize ();-
564 if (nfds <= 0)
nfds <= 0Description
TRUEnever evaluated
FALSEevaluated 5419 times by 1 test
Evaluated by:
  • Self test
0-5419
565 nfds = 20;
never executed: nfds = 20;
0
566 if (nfds > HIGH_FD_MAX)
nfds > 256Description
TRUEevaluated 5419 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-5419
567 nfds = HIGH_FD_MAX; /* reasonable maximum */
executed 5419 times by 1 test: nfds = 256;
Executed by:
  • Self test
5419
568 }
executed 5419 times by 1 test: end of block
Executed by:
  • Self test
5419
569 else-
570 nfds = maxfd;
executed 679164 times by 1 test: nfds = maxfd;
Executed by:
  • Self test
679164
571-
572 for (nfds--; check_new && nfds > 3; nfds--)
check_newDescription
TRUEevaluated 687310 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
nfds > 3Description
TRUEevaluated 687310 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-687310
573 if (fcntl (nfds, F_GETFD, &ignore) == -1)
fcntl (nfds, 1...&ignore) == -1Description
TRUEevaluated 684583 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2727 times by 1 test
Evaluated by:
  • Self test
2727-684583
574 break;
executed 684583 times by 1 test: break;
Executed by:
  • Self test
684583
575-
576 if (nfds > 3 && fd != nfds && (script_fd = dup2 (fd, nfds)) != -1)
nfds > 3Description
TRUEevaluated 684583 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
fd != nfdsDescription
TRUEevaluated 684583 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(script_fd = d..., nfds)) != -1Description
TRUEevaluated 684583 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-684583
577 {-
578 if (check_new == 0 || fd != fileno (stderr)) /* don't close stderr */
check_new == 0Description
TRUEnever evaluated
FALSEevaluated 684583 times by 1 test
Evaluated by:
  • Self test
fd != fileno ( stderr )Description
TRUEevaluated 684583 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-684583
579 close (fd);
executed 684583 times by 1 test: close (fd);
Executed by:
  • Self test
684583
580 return (script_fd);
executed 684583 times by 1 test: return (script_fd);
Executed by:
  • Self test
684583
581 }-
582-
583 /* OK, we didn't find one less than our artificial maximum; return the-
584 original file descriptor. */-
585 return (fd);
never executed: return (fd);
0
586}-
587 -
588/* Return non-zero if the characters from SAMPLE are not all valid-
589 characters to be found in the first line of a shell script. We-
590 check up to the first newline, or SAMPLE_LEN, whichever comes first.-
591 All of the characters must be printable or whitespace. */-
592-
593int-
594check_binary_file (sample, sample_len)-
595 const char *sample;-
596 int sample_len;-
597{-
598 register int i;-
599 unsigned char c;-
600-
601 for (i = 0; i < sample_len; i++)
i < sample_lenDescription
TRUEevaluated 183200 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
5-183200
602 {-
603 c = sample[i];-
604 if (c == '\n')
c == '\n'Description
TRUEevaluated 5271 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177929 times by 1 test
Evaluated by:
  • Self test
5271-177929
605 return (0);
executed 5271 times by 1 test: return (0);
Executed by:
  • Self test
5271
606 if (c == '\0')
c == '\0'Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 177928 times by 1 test
Evaluated by:
  • Self test
1-177928
607 return (1);
executed 1 time by 1 test: return (1);
Executed by:
  • Self test
1
608 }
executed 177928 times by 1 test: end of block
Executed by:
  • Self test
177928
609-
610 return (0);
executed 5 times by 1 test: return (0);
Executed by:
  • Self test
5
611}-
612-
613/* **************************************************************** */-
614/* */-
615/* Functions to manipulate pipes */-
616/* */-
617/* **************************************************************** */-
618-
619int-
620sh_openpipe (pv)-
621 int *pv;-
622{-
623 int r;-
624-
625 if ((r = pipe (pv)) < 0)
(r = pipe (pv)) < 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • Self test
0-60
626 return r;
never executed: return r;
0
627-
628 pv[0] = move_to_high_fd (pv[0], 1, 64);-
629 pv[1] = move_to_high_fd (pv[1], 1, 64);-
630-
631 return 0;
executed 60 times by 1 test: return 0;
Executed by:
  • Self test
60
632}-
633-
634int-
635sh_closepipe (pv)-
636 int *pv;-
637{-
638 if (pv[0] >= 0)
pv[0] >= 0Description
TRUEevaluated 55 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3988339 times by 1 test
Evaluated by:
  • Self test
55-3988339
639 close (pv[0]);
executed 55 times by 1 test: close (pv[0]);
Executed by:
  • Self test
55
640-
641 if (pv[1] >= 0)
pv[1] >= 0Description
TRUEevaluated 53 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3988341 times by 1 test
Evaluated by:
  • Self test
53-3988341
642 close (pv[1]);
executed 53 times by 1 test: close (pv[1]);
Executed by:
  • Self test
53
643-
644 pv[0] = pv[1] = -1;-
645 return 0;
executed 3988394 times by 1 test: return 0;
Executed by:
  • Self test
3988394
646}-
647-
648/* **************************************************************** */-
649/* */-
650/* Functions to inspect pathnames */-
651/* */-
652/* **************************************************************** */-
653-
654int-
655file_exists (fn)-
656 const char *fn;-
657{-
658 struct stat sb;-
659-
660 return (stat (fn, &sb) == 0);
executed 21 times by 1 test: return (stat (fn, &sb) == 0);
Executed by:
  • Self test
21
661}-
662-
663int-
664file_isdir (fn)-
665 const char *fn;-
666{-
667 struct stat sb;-
668-
669 return ((stat (fn, &sb) == 0) && S_ISDIR (sb.st_mode));
executed 10796 times by 1 test: return ((stat (fn, &sb) == 0) && (((( sb.st_mode )) & 0170000) == (0040000)) );
Executed by:
  • Self test
10796
670}-
671-
672int-
673file_iswdir (fn)-
674 const char *fn;-
675{-
676 return (file_isdir (fn) && sh_eaccess (fn, W_OK) == 0);
executed 107 times by 1 test: return (file_isdir (fn) && sh_eaccess (fn, 2 ) == 0);
Executed by:
  • Self test
107
677}-
678-
679/* Return 1 if STRING is "." or "..", optionally followed by a directory-
680 separator */-
681int-
682path_dot_or_dotdot (string)-
683 const char *string;-
684{-
685 if (string == 0 || *string == '\0' || *string != '.')
string == 0Description
TRUEnever evaluated
FALSEnever evaluated
*string == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
*string != '.'Description
TRUEnever evaluated
FALSEnever evaluated
0
686 return (0);
never executed: return (0);
0
687-
688 /* string[0] == '.' */-
689 if (PATHSEP(string[1]) || (string[1] == '.' && PATHSEP(string[2])))
((string[1]) == '/')Description
TRUEnever evaluated
FALSEnever evaluated
(string[1]) == 0Description
TRUEnever evaluated
FALSEnever evaluated
string[1] == '.'Description
TRUEnever evaluated
FALSEnever evaluated
((string[2]) == '/')Description
TRUEnever evaluated
FALSEnever evaluated
(string[2]) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
690 return (1);
never executed: return (1);
0
691-
692 return (0);
never executed: return (0);
0
693}-
694-
695/* Return 1 if STRING contains an absolute pathname, else 0. Used by `cd'-
696 to decide whether or not to look up a directory name in $CDPATH. */-
697int-
698absolute_pathname (string)-
699 const char *string;-
700{-
701 if (string == 0 || *string == '\0')
string == 0Description
TRUEnever evaluated
FALSEevaluated 1460 times by 1 test
Evaluated by:
  • Self test
*string == '\0'Description
TRUEnever evaluated
FALSEevaluated 1460 times by 1 test
Evaluated by:
  • Self test
0-1460
702 return (0);
never executed: return (0);
0
703-
704 if (ABSPATH(string))
((string)[0] == '/')Description
TRUEevaluated 1329 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 131 times by 1 test
Evaluated by:
  • Self test
131-1329
705 return (1);
executed 1329 times by 1 test: return (1);
Executed by:
  • Self test
1329
706-
707 if (string[0] == '.' && PATHSEP(string[1])) /* . and ./ */
string[0] == '.'Description
TRUEevaluated 115 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 16 times by 1 test
Evaluated by:
  • Self test
((string[1]) == '/')Description
TRUEevaluated 115 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(string[1]) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-115
708 return (1);
executed 115 times by 1 test: return (1);
Executed by:
  • Self test
115
709-
710 if (string[0] == '.' && string[1] == '.' && PATHSEP(string[2])) /* .. and ../ */
string[0] == '.'Description
TRUEnever evaluated
FALSEevaluated 16 times by 1 test
Evaluated by:
  • Self test
string[1] == '.'Description
TRUEnever evaluated
FALSEnever evaluated
((string[2]) == '/')Description
TRUEnever evaluated
FALSEnever evaluated
(string[2]) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-16
711 return (1);
never executed: return (1);
0
712-
713 return (0);
executed 16 times by 1 test: return (0);
Executed by:
  • Self test
16
714}-
715-
716/* Return 1 if STRING is an absolute program name; it is absolute if it-
717 contains any slashes. This is used to decide whether or not to look-
718 up through $PATH. */-
719int-
720absolute_program (string)-
721 const char *string;-
722{-
723 return ((char *)mbschr (string, '/') != (char *)NULL);
executed 39693 times by 1 test: return ((char *)mbschr (string, '/') != (char *) ((void *)0) );
Executed by:
  • Self test
39693
724}-
725-
726/* **************************************************************** */-
727/* */-
728/* Functions to manipulate pathnames */-
729/* */-
730/* **************************************************************** */-
731-
732/* Turn STRING (a pathname) into an absolute pathname, assuming that-
733 DOT_PATH contains the symbolic location of `.'. This always-
734 returns a new string, even if STRING was an absolute pathname to-
735 begin with. */-
736char *-
737make_absolute (string, dot_path)-
738 const char *string, *dot_path;-
739{-
740 char *result;-
741-
742 if (dot_path == 0 || ABSPATH(string))
dot_path == 0Description
TRUEnever evaluated
FALSEevaluated 72 times by 1 test
Evaluated by:
  • Self test
((string)[0] == '/')Description
TRUEevaluated 70 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-72
743#ifdef __CYGWIN__-
744 {-
745 char pathbuf[PATH_MAX + 1];-
746-
747 /* WAS cygwin_conv_to_full_posix_path (string, pathbuf); */-
748 cygwin_conv_path (CCP_WIN_A_TO_POSIX, string, pathbuf, PATH_MAX);-
749 result = savestring (pathbuf);-
750 }-
751#else-
752 result = savestring (string);
executed 70 times by 1 test: result = (char *)strcpy (sh_xmalloc((1 + strlen (string)), "general.c", 752), (string));
Executed by:
  • Self test
70
753#endif-
754 else-
755 result = sh_makepath (dot_path, string, 0);
executed 2 times by 1 test: result = sh_makepath (dot_path, string, 0);
Executed by:
  • Self test
2
756-
757 return (result);
executed 72 times by 1 test: return (result);
Executed by:
  • Self test
72
758}-
759-
760/* Return the `basename' of the pathname in STRING (the stuff after the-
761 last '/'). If STRING is `/', just return it. */-
762char *-
763base_pathname (string)-
764 char *string;-
765{-
766 char *p;-
767-
768#if 0-
769 if (absolute_pathname (string) == 0)-
770 return (string);-
771#endif-
772-
773 if (string[0] == '/' && string[1] == 0)
string[0] == '/'Description
TRUEevaluated 21747 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 31 times by 1 test
Evaluated by:
  • Self test
string[1] == 0Description
TRUEnever evaluated
FALSEevaluated 21747 times by 1 test
Evaluated by:
  • Self test
0-21747
774 return (string);
never executed: return (string);
0
775-
776 p = (char *)strrchr (string, '/');-
777 return (p ? ++p : string);
executed 21778 times by 1 test: return (p ? ++p : string);
Executed by:
  • Self test
21778
778}-
779-
780/* Return the full pathname of FILE. Easy. Filenames that begin-
781 with a '/' are returned as themselves. Other filenames have-
782 the current working directory prepended. A new string is-
783 returned in either case. */-
784char *-
785full_pathname (file)-
786 char *file;-
787{-
788 char *ret;-
789-
790 file = (*file == '~') ? bash_tilde_expand (file, 0) : savestring (file);
(*file == '~')Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
0-3
791-
792 if (ABSPATH(file))
((file)[0] == '/')Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3
793 return (file);
executed 3 times by 1 test: return (file);
Executed by:
  • Self test
3
794-
795 ret = sh_makepath ((char *)NULL, file, (MP_DOCWD|MP_RMDOT));-
796 free (file);-
797-
798 return (ret);
never executed: return (ret);
0
799}-
800-
801/* A slightly related function. Get the prettiest name of this-
802 directory possible. */-
803static char tdir[PATH_MAX];-
804-
805/* Return a pretty pathname. If the first part of the pathname is-
806 the same as $HOME, then replace that with `~'. */-
807char *-
808polite_directory_format (name)-
809 char *name;-
810{-
811 char *home;-
812 int l;-
813-
814 home = get_string_value ("HOME");-
815 l = home ? strlen (home) : 0;
homeDescription
TRUEevaluated 73 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-73
816 if (l > 1 && strncmp (home, name, l) == 0 && (!name[l] || name[l] == '/'))
never executed: __result = (((const unsigned char *) (const char *) ( home ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
l > 1Description
TRUEevaluated 73 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(__extension__...e , l ))) == 0Description
TRUEnever evaluated
FALSEevaluated 73 times by 1 test
Evaluated by:
  • Self test
__builtin_constant_p ( l )Description
TRUEnever evaluated
FALSEevaluated 73 times by 1 test
Evaluated by:
  • Self test
__builtin_constant_p ( home )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( home ...size_t) ( l ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( name )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( name ...size_t) ( l ))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
!name[l]Description
TRUEnever evaluated
FALSEnever evaluated
name[l] == '/'Description
TRUEnever evaluated
FALSEnever evaluated
0-73
817 {-
818 strncpy (tdir + 1, name + l, sizeof(tdir) - 2);-
819 tdir[0] = '~';-
820 tdir[sizeof(tdir) - 1] = '\0';-
821 return (tdir);
never executed: return (tdir);
0
822 }-
823 else-
824 return (name);
executed 73 times by 1 test: return (name);
Executed by:
  • Self test
73
825}-
826-
827/* Trim NAME. If NAME begins with `~/', skip over tilde prefix. Trim to-
828 keep any tilde prefix and PROMPT_DIRTRIM trailing directory components-
829 and replace the intervening characters with `...' */-
830char *-
831trim_pathname (name, maxlen)-
832 char *name;-
833 int maxlen;-
834{-
835 int nlen, ndirs;-
836 intmax_t nskip;-
837 char *nbeg, *nend, *ntail, *v;-
838-
839 if (name == 0 || (nlen = strlen (name)) == 0)
name == 0Description
TRUEnever evaluated
FALSEnever evaluated
(nlen = strlen (name)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
840 return name;
never executed: return name;
0
841 nend = name + nlen;-
842-
843 v = get_string_value ("PROMPT_DIRTRIM");-
844 if (v == 0 || *v == 0)
v == 0Description
TRUEnever evaluated
FALSEnever evaluated
*v == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
845 return name;
never executed: return name;
0
846 if (legal_number (v, &nskip) == 0 || nskip <= 0)
legal_number (v, &nskip) == 0Description
TRUEnever evaluated
FALSEnever evaluated
nskip <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
847 return name;
never executed: return name;
0
848-
849 /* Skip over tilde prefix */-
850 nbeg = name;-
851 if (name[0] == '~')
name[0] == '~'Description
TRUEnever evaluated
FALSEnever evaluated
0
852 for (nbeg = name; *nbeg; nbeg++)
*nbegDescription
TRUEnever evaluated
FALSEnever evaluated
0
853 if (*nbeg == '/')
*nbeg == '/'Description
TRUEnever evaluated
FALSEnever evaluated
0
854 {-
855 nbeg++;-
856 break;
never executed: break;
0
857 }-
858 if (*nbeg == 0)
*nbeg == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
859 return name;
never executed: return name;
0
860-
861 for (ndirs = 0, ntail = nbeg; *ntail; ntail++)
*ntailDescription
TRUEnever evaluated
FALSEnever evaluated
0
862 if (*ntail == '/')
*ntail == '/'Description
TRUEnever evaluated
FALSEnever evaluated
0
863 ndirs++;
never executed: ndirs++;
0
864 if (ndirs < nskip)
ndirs < nskipDescription
TRUEnever evaluated
FALSEnever evaluated
0
865 return name;
never executed: return name;
0
866-
867 for (ntail = (*nend == '/') ? nend : nend - 1; ntail > nbeg; ntail--)
ntail > nbegDescription
TRUEnever evaluated
FALSEnever evaluated
0
868 {-
869 if (*ntail == '/')
*ntail == '/'Description
TRUEnever evaluated
FALSEnever evaluated
0
870 nskip--;
never executed: nskip--;
0
871 if (nskip == 0)
nskip == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
872 break;
never executed: break;
0
873 }
never executed: end of block
0
874 if (ntail == nbeg)
ntail == nbegDescription
TRUEnever evaluated
FALSEnever evaluated
0
875 return name;
never executed: return name;
0
876-
877 /* Now we want to return name[0..nbeg]+"..."+ntail, modifying name in place */-
878 nlen = ntail - nbeg;-
879 if (nlen <= 3)
nlen <= 3Description
TRUEnever evaluated
FALSEnever evaluated
0
880 return name;
never executed: return name;
0
881-
882 *nbeg++ = '.';-
883 *nbeg++ = '.';-
884 *nbeg++ = '.';-
885-
886 nlen = nend - ntail;-
887 memmove (nbeg, ntail, nlen);-
888 nbeg[nlen] = '\0';-
889-
890 return name;
never executed: return name;
0
891}-
892-
893/* Return a printable representation of FN without special characters. The-
894 caller is responsible for freeing memory if this returns something other-
895 than its argument. If FLAGS is non-zero, we are printing for portable-
896 re-input and should single-quote filenames appropriately. */-
897char *-
898printable_filename (fn, flags)-
899 char *fn;-
900 int flags;-
901{-
902 char *newf;-
903-
904 if (ansic_shouldquote (fn))
ansic_shouldquote (fn)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 24 times by 1 test
Evaluated by:
  • Self test
2-24
905 newf = ansic_quote (fn, 0, NULL);
executed 2 times by 1 test: newf = ansic_quote (fn, 0, ((void *)0) );
Executed by:
  • Self test
2
906 else if (flags && sh_contains_shell_metas (fn))
flagsDescription
TRUEnever evaluated
FALSEevaluated 24 times by 1 test
Evaluated by:
  • Self test
sh_contains_shell_metas (fn)Description
TRUEnever evaluated
FALSEnever evaluated
0-24
907 newf = sh_single_quote (fn);
never executed: newf = sh_single_quote (fn);
0
908 else-
909 newf = fn;
executed 24 times by 1 test: newf = fn;
Executed by:
  • Self test
24
910-
911 return newf;
executed 26 times by 1 test: return newf;
Executed by:
  • Self test
26
912}-
913-
914/* Given a string containing units of information separated by colons,-
915 return the next one pointed to by (P_INDEX), or NULL if there are no more.-
916 Advance (P_INDEX) to the character after the colon. */-
917char *-
918extract_colon_unit (string, p_index)-
919 char *string;-
920 int *p_index;-
921{-
922 int i, start, len;-
923 char *value;-
924-
925 if (string == 0)
string == 0Description
TRUEnever evaluated
FALSEevaluated 30739 times by 1 test
Evaluated by:
  • Self test
0-30739
926 return (string);
never executed: return (string);
0
927-
928 len = strlen (string);-
929 if (*p_index >= len)
*p_index >= lenDescription
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 30732 times by 1 test
Evaluated by:
  • Self test
7-30732
930 return ((char *)NULL);
executed 7 times by 1 test: return ((char *) ((void *)0) );
Executed by:
  • Self test
7
931-
932 i = *p_index;-
933-
934 /* Each call to this routine leaves the index pointing at a colon if-
935 there is more to the path. If I is > 0, then increment past the-
936 `:'. If I is 0, then the path has a leading colon. Trailing colons-
937 are handled OK by the `else' part of the if statement; an empty-
938 string is returned in that case. */-
939 if (i && string[i] == ':')
iDescription
TRUEevaluated 25341 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5391 times by 1 test
Evaluated by:
  • Self test
string[i] == ':'Description
TRUEevaluated 25341 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-25341
940 i++;
executed 25341 times by 1 test: i++;
Executed by:
  • Self test
25341
941-
942 for (start = i; string[i] && string[i] != ':'; i++)
string[i]Description
TRUEevaluated 530203 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 88 times by 1 test
Evaluated by:
  • Self test
string[i] != ':'Description
TRUEevaluated 499559 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 30644 times by 1 test
Evaluated by:
  • Self test
88-530203
943 ;
executed 499559 times by 1 test: ;
Executed by:
  • Self test
499559
944-
945 *p_index = i;-
946-
947 if (i == start)
i == startDescription
TRUEevaluated 12 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 30720 times by 1 test
Evaluated by:
  • Self test
12-30720
948 {-
949 if (string[i])
string[i]Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • Self test
0-12
950 (*p_index)++;
never executed: (*p_index)++;
0
951 /* Return "" in the case of a trailing `:'. */-
952 value = (char *)xmalloc (1);-
953 value[0] = '\0';-
954 }
executed 12 times by 1 test: end of block
Executed by:
  • Self test
12
955 else-
956 value = substring (string, start, i);
executed 30720 times by 1 test: value = substring (string, start, i);
Executed by:
  • Self test
30720
957-
958 return (value);
executed 30732 times by 1 test: return (value);
Executed by:
  • Self test
30732
959}-
960-
961/* **************************************************************** */-
962/* */-
963/* Tilde Initialization and Expansion */-
964/* */-
965/* **************************************************************** */-
966-
967#if defined (PUSHD_AND_POPD)-
968extern char *get_dirstack_from_string __P((char *));-
969#endif-
970-
971static char **bash_tilde_prefixes;-
972static char **bash_tilde_prefixes2;-
973static char **bash_tilde_suffixes;-
974static char **bash_tilde_suffixes2;-
975-
976/* If tilde_expand hasn't been able to expand the text, perhaps it-
977 is a special shell expansion. This function is installed as the-
978 tilde_expansion_preexpansion_hook. It knows how to expand ~- and ~+.-
979 If PUSHD_AND_POPD is defined, ~[+-]N expands to directories from the-
980 directory stack. */-
981static char *-
982bash_special_tilde_expansions (text)-
983 char *text;-
984{-
985 char *result;-
986-
987 result = (char *)NULL;-
988-
989 if (text[0] == '+' && text[1] == '\0')
text[0] == '+'Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test
text[1] == '\0'Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-9
990 result = get_string_value ("PWD");
executed 1 time by 1 test: result = get_string_value ("PWD");
Executed by:
  • Self test
1
991 else if (text[0] == '-' && text[1] == '\0')
text[0] == '-'Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
text[1] == '\0'Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
1-5
992 result = get_string_value ("OLDPWD");
executed 1 time by 1 test: result = get_string_value ("OLDPWD");
Executed by:
  • Self test
1
993#if defined (PUSHD_AND_POPD)-
994 else if (DIGIT (*text) || ((*text == '+' || *text == '-') && DIGIT (text[1])))
(*text) >= '0'Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
(*text) <= '9'Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
*text == '+'Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
*text == '-'Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
(text[1]) >= '0'Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
(text[1]) <= '9'Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-4
995 result = get_dirstack_from_string (text);
executed 7 times by 1 test: result = get_dirstack_from_string (text);
Executed by:
  • Self test
7
996#endif-
997-
998 return (result ? savestring (result) : (char *)NULL);
executed 10 times by 1 test: return (result ? (char *)strcpy (sh_xmalloc((1 + strlen (result)), "general.c", 998), (result)) : (char *) ((void *)0) );
Executed by:
  • Self test
10
999}-
1000-
1001/* Initialize the tilde expander. In Bash, we handle `~-' and `~+', as-
1002 well as handling special tilde prefixes; `:~" and `=~' are indications-
1003 that we should do tilde expansion. */-
1004void-
1005tilde_initialize ()-
1006{-
1007 static int times_called = 0;-
1008-
1009 /* Tell the tilde expander that we want a crack first. */-
1010 tilde_expansion_preexpansion_hook = bash_special_tilde_expansions;-
1011-
1012 /* Tell the tilde expander about special strings which start a tilde-
1013 expansion, and the special strings that end one. Only do this once.-
1014 tilde_initialize () is called from within bashline_reinitialize (). */-
1015 if (times_called++ == 0)
times_called++ == 0Description
TRUEevaluated 5432 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 15 times by 1 test
Evaluated by:
  • Self test
15-5432
1016 {-
1017 bash_tilde_prefixes = strvec_create (3);-
1018 bash_tilde_prefixes[0] = "=~";-
1019 bash_tilde_prefixes[1] = ":~";-
1020 bash_tilde_prefixes[2] = (char *)NULL;-
1021-
1022 bash_tilde_prefixes2 = strvec_create (2);-
1023 bash_tilde_prefixes2[0] = ":~";-
1024 bash_tilde_prefixes2[1] = (char *)NULL;-
1025-
1026 tilde_additional_prefixes = bash_tilde_prefixes;-
1027-
1028 bash_tilde_suffixes = strvec_create (3);-
1029 bash_tilde_suffixes[0] = ":";-
1030 bash_tilde_suffixes[1] = "=~"; /* XXX - ?? */-
1031 bash_tilde_suffixes[2] = (char *)NULL;-
1032-
1033 tilde_additional_suffixes = bash_tilde_suffixes;-
1034-
1035 bash_tilde_suffixes2 = strvec_create (2);-
1036 bash_tilde_suffixes2[0] = ":";-
1037 bash_tilde_suffixes2[1] = (char *)NULL;-
1038 }
executed 5432 times by 1 test: end of block
Executed by:
  • Self test
5432
1039}
executed 5447 times by 1 test: end of block
Executed by:
  • Self test
5447
1040-
1041/* POSIX.2, 3.6.1: A tilde-prefix consists of an unquoted tilde character-
1042 at the beginning of the word, followed by all of the characters preceding-
1043 the first unquoted slash in the word, or all the characters in the word-
1044 if there is no slash...If none of the characters in the tilde-prefix are-
1045 quoted, the characters in the tilde-prefix following the tilde shell be-
1046 treated as a possible login name. */-
1047-
1048#define TILDE_END(c) ((c) == '\0' || (c) == '/' || (c) == ':')-
1049-
1050static int-
1051unquoted_tilde_word (s)-
1052 const char *s;-
1053{-
1054 const char *r;-
1055-
1056 for (r = s; TILDE_END(*r) == 0; r++)
((*r) == '\0' ...) == ':') == 0Description
TRUEevaluated 67 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 50 times by 1 test
Evaluated by:
  • Self test
(*r) == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
(*r) == '/'Description
TRUEnever evaluated
FALSEnever evaluated
(*r) == ':'Description
TRUEnever evaluated
FALSEnever evaluated
0-67
1057 {-
1058 switch (*r)-
1059 {-
1060 case '\\':
never executed: case '\\':
0
1061 case '\'':
never executed: case '\'':
0
1062 case '"':
never executed: case '"':
0
1063 return 0;
never executed: return 0;
0
1064 }-
1065 }
executed 67 times by 1 test: end of block
Executed by:
  • Self test
67
1066 return 1;
executed 50 times by 1 test: return 1;
Executed by:
  • Self test
50
1067}-
1068-
1069/* Find the end of the tilde-prefix starting at S, and return the tilde-
1070 prefix in newly-allocated memory. Return the length of the string in-
1071 *LENP. FLAGS tells whether or not we're in an assignment context ---
1072 if so, `:' delimits the end of the tilde prefix as well. */-
1073char *-
1074bash_tilde_find_word (s, flags, lenp)-
1075 const char *s;-
1076 int flags, *lenp;-
1077{-
1078 const char *r;-
1079 char *ret;-
1080 int l;-
1081-
1082 for (r = s; *r && *r != '/'; r++)
*rDescription
TRUEevaluated 93 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 28 times by 1 test
Evaluated by:
  • Self test
*r != '/'Description
TRUEevaluated 75 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
18-93
1083 {-
1084 /* Short-circuit immediately if we see a quote character. Even though-
1085 POSIX says that `the first unquoted slash' (or `:') terminates the-
1086 tilde-prefix, in practice, any quoted portion of the tilde prefix-
1087 will cause it to not be expanded. */-
1088 if (*r == '\\' || *r == '\'' || *r == '"')
*r == '\\'Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 73 times by 1 test
Evaluated by:
  • Self test
*r == '\''Description
TRUEnever evaluated
FALSEevaluated 73 times by 1 test
Evaluated by:
  • Self test
*r == '"'Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 72 times by 1 test
Evaluated by:
  • Self test
0-73
1089 {-
1090 ret = savestring (s);-
1091 if (lenp)
lenpDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3
1092 *lenp = 0;
executed 3 times by 1 test: *lenp = 0;
Executed by:
  • Self test
3
1093 return ret;
executed 3 times by 1 test: return ret;
Executed by:
  • Self test
3
1094 }-
1095 else if (flags && *r == ':')
flagsDescription
TRUEevaluated 18 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 54 times by 1 test
Evaluated by:
  • Self test
*r == ':'Description
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
0-54
1096 break;
never executed: break;
0
1097 }
executed 72 times by 1 test: end of block
Executed by:
  • Self test
72
1098 l = r - s;-
1099 ret = xmalloc (l + 1);-
1100 strncpy (ret, s, l);-
1101 ret[l] = '\0';-
1102 if (lenp)
lenpDescription
TRUEevaluated 46 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-46
1103 *lenp = l;
executed 46 times by 1 test: *lenp = l;
Executed by:
  • Self test
46
1104 return ret;
executed 46 times by 1 test: return ret;
Executed by:
  • Self test
46
1105}-
1106 -
1107/* Tilde-expand S by running it through the tilde expansion library.-
1108 ASSIGN_P is 1 if this is a variable assignment, so the alternate-
1109 tilde prefixes should be enabled (`=~' and `:~', see above). If-
1110 ASSIGN_P is 2, we are expanding the rhs of an assignment statement,-
1111 so `=~' is not valid. */-
1112char *-
1113bash_tilde_expand (s, assign_p)-
1114 const char *s;-
1115 int assign_p;-
1116{-
1117 int old_immed, old_term, r;-
1118 char *ret;-
1119-
1120#if 0-
1121 old_immed = interrupt_immediately;-
1122 old_term = terminate_immediately;-
1123 /* We want to be able to interrupt tilde expansion. Ordinarily, we can just-
1124 jump to top_level, but we don't want to run any trap commands in a signal-
1125 handler context. We might be able to get away with just checking for-
1126 things like SIGINT and SIGQUIT. */-
1127 if (any_signals_trapped () < 0)-
1128 interrupt_immediately = 1;-
1129 terminate_immediately = 1;-
1130#endif-
1131-
1132 tilde_additional_prefixes = assign_p == 0 ? (char **)0
assign_p == 0Description
TRUEevaluated 33 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test
18-33
1133 : (assign_p == 2 ? bash_tilde_prefixes2 : bash_tilde_prefixes);
assign_p == 2Description
TRUEevaluated 16 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
2-16
1134 if (assign_p == 2)
assign_p == 2Description
TRUEevaluated 16 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 35 times by 1 test
Evaluated by:
  • Self test
16-35
1135 tilde_additional_suffixes = bash_tilde_suffixes2;
executed 16 times by 1 test: tilde_additional_suffixes = bash_tilde_suffixes2;
Executed by:
  • Self test
16
1136-
1137 r = (*s == '~') ? unquoted_tilde_word (s) : 1;
(*s == '~')Description
TRUEevaluated 50 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-50
1138 ret = r ? tilde_expand (s) : savestring (s);
rDescription
TRUEevaluated 51 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-51
1139-
1140#if 0-
1141 interrupt_immediately = old_immed;-
1142 terminate_immediately = old_term;-
1143#endif-
1144-
1145 QUIT;
never executed: termsig_handler (terminating_signal);
never executed: throw_to_top_level ();
terminating_signalDescription
TRUEnever evaluated
FALSEevaluated 51 times by 1 test
Evaluated by:
  • Self test
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 51 times by 1 test
Evaluated by:
  • Self test
0-51
1146-
1147 return (ret);
executed 51 times by 1 test: return (ret);
Executed by:
  • Self test
51
1148}-
1149-
1150/* **************************************************************** */-
1151/* */-
1152/* Functions to manipulate and search the group list */-
1153/* */-
1154/* **************************************************************** */-
1155-
1156static int ngroups, maxgroups;-
1157-
1158/* The set of groups that this user is a member of. */-
1159static GETGROUPS_T *group_array = (GETGROUPS_T *)NULL;-
1160-
1161#if !defined (NOGROUP)-
1162# define NOGROUP (gid_t) -1-
1163#endif-
1164-
1165static void-
1166initialize_group_array ()-
1167{-
1168 register int i;-
1169-
1170 if (maxgroups == 0)
maxgroups == 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3
1171 maxgroups = getmaxgroups ();
executed 3 times by 1 test: maxgroups = getmaxgroups ();
Executed by:
  • Self test
3
1172-
1173 ngroups = 0;-
1174 group_array = (GETGROUPS_T *)xrealloc (group_array, maxgroups * sizeof (GETGROUPS_T));-
1175-
1176#if defined (HAVE_GETGROUPS)-
1177 ngroups = getgroups (maxgroups, group_array);-
1178#endif-
1179-
1180 /* If getgroups returns nothing, or the OS does not support getgroups(),-
1181 make sure the groups array includes at least the current gid. */-
1182 if (ngroups == 0)
ngroups == 0Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
0-3
1183 {-
1184 group_array[0] = current_user.gid;-
1185 ngroups = 1;-
1186 }
never executed: end of block
0
1187-
1188 /* If the primary group is not in the groups array, add it as group_array[0]-
1189 and shuffle everything else up 1, if there's room. */-
1190 for (i = 0; i < ngroups; i++)
i < ngroupsDescription
TRUEevaluated 33 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-33
1191 if (current_user.gid == (gid_t)group_array[i])
current_user.g...group_array[i]Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 30 times by 1 test
Evaluated by:
  • Self test
3-30
1192 break;
executed 3 times by 1 test: break;
Executed by:
  • Self test
3
1193 if (i == ngroups && ngroups < maxgroups)
i == ngroupsDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
ngroups < maxgroupsDescription
TRUEnever evaluated
FALSEnever evaluated
0-3
1194 {-
1195 for (i = ngroups; i > 0; i--)
i > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1196 group_array[i] = group_array[i - 1];
never executed: group_array[i] = group_array[i - 1];
0
1197 group_array[0] = current_user.gid;-
1198 ngroups++;-
1199 }
never executed: end of block
0
1200-
1201 /* If the primary group is not group_array[0], swap group_array[0] and-
1202 whatever the current group is. The vast majority of systems should-
1203 not need this; a notable exception is Linux. */-
1204 if (group_array[0] != current_user.gid)
group_array[0]...rrent_user.gidDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3
1205 {-
1206 for (i = 0; i < ngroups; i++)
i < ngroupsDescription
TRUEevaluated 33 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-33
1207 if (group_array[i] == current_user.gid)
group_array[i]...rrent_user.gidDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 30 times by 1 test
Evaluated by:
  • Self test
3-30
1208 break;
executed 3 times by 1 test: break;
Executed by:
  • Self test
3
1209 if (i < ngroups)
i < ngroupsDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3
1210 {-
1211 group_array[i] = group_array[0];-
1212 group_array[0] = current_user.gid;-
1213 }
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
1214 }
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
1215}
executed 3 times by 1 test: end of block
Executed by:
  • Self test
3
1216-
1217/* Return non-zero if GID is one that we have in our groups list. */-
1218int-
1219#if defined (__STDC__) || defined ( _MINIX)-
1220group_member (gid_t gid)-
1221#else-
1222group_member (gid)-
1223 gid_t gid;-
1224#endif /* !__STDC__ && !_MINIX */-
1225{-
1226#if defined (HAVE_GETGROUPS)-
1227 register int i;-
1228#endif-
1229-
1230 /* Short-circuit if possible, maybe saving a call to getgroups(). */-
1231 if (gid == current_user.gid || gid == current_user.egid)
gid == current_user.gidDescription
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
gid == current_user.egidDescription
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
0-8
1232 return (1);
never executed: return (1);
0
1233-
1234#if defined (HAVE_GETGROUPS)-
1235 if (ngroups == 0)
ngroups == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test
2-6
1236 initialize_group_array ();
executed 2 times by 1 test: initialize_group_array ();
Executed by:
  • Self test
2
1237-
1238 /* In case of error, the user loses. */-
1239 if (ngroups <= 0)
ngroups <= 0Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
0-8
1240 return (0);
never executed: return (0);
0
1241-
1242 /* Search through the list looking for GID. */-
1243 for (i = 0; i < ngroups; i++)
i < ngroupsDescription
TRUEevaluated 88 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
8-88
1244 if (gid == (gid_t)group_array[i])
gid == (gid_t)group_array[i]Description
TRUEnever evaluated
FALSEevaluated 88 times by 1 test
Evaluated by:
  • Self test
0-88
1245 return (1);
never executed: return (1);
0
1246#endif-
1247-
1248 return (0);
executed 8 times by 1 test: return (0);
Executed by:
  • Self test
8
1249}-
1250-
1251char **-
1252get_group_list (ngp)-
1253 int *ngp;-
1254{-
1255 static char **group_vector = (char **)NULL;-
1256 register int i;-
1257-
1258 if (group_vector)
group_vectorDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
1259 {-
1260 if (ngp)
ngpDescription
TRUEnever evaluated
FALSEnever evaluated
0
1261 *ngp = ngroups;
never executed: *ngp = ngroups;
0
1262 return group_vector;
never executed: return group_vector;
0
1263 }-
1264-
1265 if (ngroups == 0)
ngroups == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1
1266 initialize_group_array ();
executed 1 time by 1 test: initialize_group_array ();
Executed by:
  • Self test
1
1267-
1268 if (ngroups <= 0)
ngroups <= 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
1269 {-
1270 if (ngp)
ngpDescription
TRUEnever evaluated
FALSEnever evaluated
0
1271 *ngp = 0;
never executed: *ngp = 0;
0
1272 return (char **)NULL;
never executed: return (char **) ((void *)0) ;
0
1273 }-
1274-
1275 group_vector = strvec_create (ngroups);-
1276 for (i = 0; i < ngroups; i++)
i < ngroupsDescription
TRUEevaluated 11 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-11
1277 group_vector[i] = itos (group_array[i]);
executed 11 times by 1 test: group_vector[i] = itos (group_array[i]);
Executed by:
  • Self test
11
1278-
1279 if (ngp)
ngpDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1
1280 *ngp = ngroups;
executed 1 time by 1 test: *ngp = ngroups;
Executed by:
  • Self test
1
1281 return group_vector;
executed 1 time by 1 test: return group_vector;
Executed by:
  • Self test
1
1282}-
1283-
1284int *-
1285get_group_array (ngp)-
1286 int *ngp;-
1287{-
1288 int i;-
1289 static int *group_iarray = (int *)NULL;-
1290-
1291 if (group_iarray)
group_iarrayDescription
TRUEnever evaluated
FALSEnever evaluated
0
1292 {-
1293 if (ngp)
ngpDescription
TRUEnever evaluated
FALSEnever evaluated
0
1294 *ngp = ngroups;
never executed: *ngp = ngroups;
0
1295 return (group_iarray);
never executed: return (group_iarray);
0
1296 }-
1297-
1298 if (ngroups == 0)
ngroups == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1299 initialize_group_array ();
never executed: initialize_group_array ();
0
1300-
1301 if (ngroups <= 0)
ngroups <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1302 {-
1303 if (ngp)
ngpDescription
TRUEnever evaluated
FALSEnever evaluated
0
1304 *ngp = 0;
never executed: *ngp = 0;
0
1305 return (int *)NULL;
never executed: return (int *) ((void *)0) ;
0
1306 }-
1307-
1308 group_iarray = (int *)xmalloc (ngroups * sizeof (int));-
1309 for (i = 0; i < ngroups; i++)
i < ngroupsDescription
TRUEnever evaluated
FALSEnever evaluated
0
1310 group_iarray[i] = (int)group_array[i];
never executed: group_iarray[i] = (int)group_array[i];
0
1311-
1312 if (ngp)
ngpDescription
TRUEnever evaluated
FALSEnever evaluated
0
1313 *ngp = ngroups;
never executed: *ngp = ngroups;
0
1314 return group_iarray;
never executed: return group_iarray;
0
1315}-
1316-
1317/* **************************************************************** */-
1318/* */-
1319/* Miscellaneous functions */-
1320/* */-
1321/* **************************************************************** */-
1322-
1323/* Return a value for PATH that is guaranteed to find all of the standard-
1324 utilities. This uses Posix.2 configuration variables, if present. It-
1325 uses a value defined in config.h as a last resort. */-
1326char *-
1327conf_standard_path ()-
1328{-
1329#if defined (_CS_PATH) && defined (HAVE_CONFSTR)-
1330 char *p;-
1331 size_t len;-
1332-
1333 len = (size_t)confstr (_CS_PATH, (char *)NULL, (size_t)0);-
1334 if (len > 0)
len > 0Description
TRUEevaluated 27 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-27
1335 {-
1336 p = (char *)xmalloc (len + 2);-
1337 *p = '\0';-
1338 confstr (_CS_PATH, p, len);-
1339 return (p);
executed 27 times by 1 test: return (p);
Executed by:
  • Self test
27
1340 }-
1341 else-
1342 return (savestring (STANDARD_UTILS_PATH));
never executed: return ((char *)strcpy (sh_xmalloc((1 + strlen ("/bin:/usr/bin:/sbin:/usr/sbin:/etc:/usr/etc")), "general.c", 1342), ("/bin:/usr/bin:/sbin:/usr/sbin:/etc:/usr/etc")));
0
1343#else /* !_CS_PATH || !HAVE_CONFSTR */-
1344# if defined (CS_PATH)-
1345 return (savestring (CS_PATH));-
1346# else-
1347 return (savestring (STANDARD_UTILS_PATH));-
1348# endif /* !CS_PATH */-
1349#endif /* !_CS_PATH || !HAVE_CONFSTR */-
1350}-
1351-
1352int-
1353default_columns ()-
1354{-
1355 char *v;-
1356 int c;-
1357-
1358 c = -1;-
1359 v = get_string_value ("COLUMNS");-
1360 if (v && *v)
vDescription
TRUEnever evaluated
FALSEevaluated 7 times by 1 test
Evaluated by:
  • Self test
*vDescription
TRUEnever evaluated
FALSEnever evaluated
0-7
1361 {-
1362 c = atoi (v);-
1363 if (c > 0)
c > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1364 return c;
never executed: return c;
0
1365 }
never executed: end of block
0
1366-
1367 if (check_window_size)
check_window_sizeDescription
TRUEnever evaluated
FALSEevaluated 7 times by 1 test
Evaluated by:
  • Self test
0-7
1368 get_new_window_size (0, (int *)0, &c);
never executed: get_new_window_size (0, (int *)0, &c);
0
1369-
1370 return (c > 0 ? c : 80);
executed 7 times by 1 test: return (c > 0 ? c : 80);
Executed by:
  • Self test
7
1371}-
1372-
1373 -
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2