Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/bash/src/builtins/mapfile.def |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | This file is mapfile.def, from which is created mapfile.c. | - | ||||||||||||||||||
2 | It implements the builtin "mapfile" in Bash. | - | ||||||||||||||||||
3 | - | |||||||||||||||||||
4 | Copyright (C) 2005-2006 Rocky Bernstein for Free Software Foundation, Inc. | - | ||||||||||||||||||
5 | Copyright (C) 2008-2016 Free Software Foundation, Inc. | - | ||||||||||||||||||
6 | - | |||||||||||||||||||
7 | This file is part of GNU Bash, the Bourne Again SHell. | - | ||||||||||||||||||
8 | - | |||||||||||||||||||
9 | Bash is free software: you can redistribute it and/or modify | - | ||||||||||||||||||
10 | it under the terms of the GNU General Public License as published by | - | ||||||||||||||||||
11 | the Free Software Foundation, either version 3 of the License, or | - | ||||||||||||||||||
12 | (at your option) any later version. | - | ||||||||||||||||||
13 | - | |||||||||||||||||||
14 | Bash is distributed in the hope that it will be useful, | - | ||||||||||||||||||
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | ||||||||||||||||||
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | ||||||||||||||||||
17 | GNU General Public License for more details. | - | ||||||||||||||||||
18 | - | |||||||||||||||||||
19 | You should have received a copy of the GNU General Public License | - | ||||||||||||||||||
20 | along with Bash. If not, see <http://www.gnu.org/licenses/>. | - | ||||||||||||||||||
21 | - | |||||||||||||||||||
22 | $PRODUCES mapfile.c | - | ||||||||||||||||||
23 | - | |||||||||||||||||||
24 | $BUILTIN mapfile | - | ||||||||||||||||||
25 | $FUNCTION mapfile_builtin | - | ||||||||||||||||||
26 | $SHORT_DOC mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array] | - | ||||||||||||||||||
27 | Read lines from the standard input into an indexed array variable. | - | ||||||||||||||||||
28 | - | |||||||||||||||||||
29 | Read lines from the standard input into the indexed array variable ARRAY, or | - | ||||||||||||||||||
30 | from file descriptor FD if the -u option is supplied. The variable MAPFILE | - | ||||||||||||||||||
31 | is the default ARRAY. | - | ||||||||||||||||||
32 | - | |||||||||||||||||||
33 | Options: | - | ||||||||||||||||||
34 | -d delim Use DELIM to terminate lines, instead of newline | - | ||||||||||||||||||
35 | -n count Copy at most COUNT lines. If COUNT is 0, all lines are copied | - | ||||||||||||||||||
36 | -O origin Begin assigning to ARRAY at index ORIGIN. The default index is 0 | - | ||||||||||||||||||
37 | -s count Discard the first COUNT lines read | - | ||||||||||||||||||
38 | -t Remove a trailing DELIM from each line read (default newline) | - | ||||||||||||||||||
39 | -u fd Read lines from file descriptor FD instead of the standard input | - | ||||||||||||||||||
40 | -C callback Evaluate CALLBACK each time QUANTUM lines are read | - | ||||||||||||||||||
41 | -c quantum Specify the number of lines read between each call to | - | ||||||||||||||||||
42 | CALLBACK | - | ||||||||||||||||||
43 | - | |||||||||||||||||||
44 | Arguments: | - | ||||||||||||||||||
45 | ARRAY Array variable name to use for file data | - | ||||||||||||||||||
46 | - | |||||||||||||||||||
47 | If -C is supplied without -c, the default quantum is 5000. When | - | ||||||||||||||||||
48 | CALLBACK is evaluated, it is supplied the index of the next array | - | ||||||||||||||||||
49 | element to be assigned and the line to be assigned to that element | - | ||||||||||||||||||
50 | as additional arguments. | - | ||||||||||||||||||
51 | - | |||||||||||||||||||
52 | If not supplied with an explicit origin, mapfile will clear ARRAY before | - | ||||||||||||||||||
53 | assigning to it. | - | ||||||||||||||||||
54 | - | |||||||||||||||||||
55 | Exit Status: | - | ||||||||||||||||||
56 | Returns success unless an invalid option is given or ARRAY is readonly or | - | ||||||||||||||||||
57 | not an indexed array. | - | ||||||||||||||||||
58 | $END | - | ||||||||||||||||||
59 | - | |||||||||||||||||||
60 | $BUILTIN readarray | - | ||||||||||||||||||
61 | $FUNCTION mapfile_builtin | - | ||||||||||||||||||
62 | $SHORT_DOC readarray [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array] | - | ||||||||||||||||||
63 | Read lines from a file into an array variable. | - | ||||||||||||||||||
64 | - | |||||||||||||||||||
65 | A synonym for `mapfile'. | - | ||||||||||||||||||
66 | $END | - | ||||||||||||||||||
67 | - | |||||||||||||||||||
68 | #include <config.h> | - | ||||||||||||||||||
69 | - | |||||||||||||||||||
70 | #include "builtins.h" | - | ||||||||||||||||||
71 | #include "posixstat.h" | - | ||||||||||||||||||
72 | - | |||||||||||||||||||
73 | #if defined (HAVE_UNISTD_H) | - | ||||||||||||||||||
74 | # include <unistd.h> | - | ||||||||||||||||||
75 | #endif | - | ||||||||||||||||||
76 | - | |||||||||||||||||||
77 | #include "bashansi.h" | - | ||||||||||||||||||
78 | #include "bashintl.h" | - | ||||||||||||||||||
79 | - | |||||||||||||||||||
80 | #include <stdio.h> | - | ||||||||||||||||||
81 | #include <errno.h> | - | ||||||||||||||||||
82 | - | |||||||||||||||||||
83 | #include "../bashintl.h" | - | ||||||||||||||||||
84 | #include "../shell.h" | - | ||||||||||||||||||
85 | #include "common.h" | - | ||||||||||||||||||
86 | #include "bashgetopt.h" | - | ||||||||||||||||||
87 | - | |||||||||||||||||||
88 | #if !defined (errno) | - | ||||||||||||||||||
89 | extern int errno; | - | ||||||||||||||||||
90 | #endif | - | ||||||||||||||||||
91 | - | |||||||||||||||||||
92 | #if defined (ARRAY_VARS) | - | ||||||||||||||||||
93 | - | |||||||||||||||||||
94 | static int run_callback __P((const char *, unsigned int, const char *)); | - | ||||||||||||||||||
95 | - | |||||||||||||||||||
96 | #define DEFAULT_ARRAY_NAME "MAPFILE" | - | ||||||||||||||||||
97 | #define DEFAULT_VARIABLE_NAME "MAPLINE" /* not used right now */ | - | ||||||||||||||||||
98 | - | |||||||||||||||||||
99 | /* The value specifying how frequently `mapfile' calls the callback. */ | - | ||||||||||||||||||
100 | #define DEFAULT_QUANTUM 5000 | - | ||||||||||||||||||
101 | - | |||||||||||||||||||
102 | /* Values for FLAGS */ | - | ||||||||||||||||||
103 | #define MAPF_CLEARARRAY 0x01 | - | ||||||||||||||||||
104 | #define MAPF_CHOP 0x02 | - | ||||||||||||||||||
105 | - | |||||||||||||||||||
106 | static int delim; | - | ||||||||||||||||||
107 | - | |||||||||||||||||||
108 | static int | - | ||||||||||||||||||
109 | run_callback (callback, curindex, curline) | - | ||||||||||||||||||
110 | const char *callback; | - | ||||||||||||||||||
111 | unsigned int curindex; | - | ||||||||||||||||||
112 | const char *curline; | - | ||||||||||||||||||
113 | { | - | ||||||||||||||||||
114 | unsigned int execlen; | - | ||||||||||||||||||
115 | char *execstr, *qline; | - | ||||||||||||||||||
116 | int flags; | - | ||||||||||||||||||
117 | - | |||||||||||||||||||
118 | qline = sh_single_quote (curline); | - | ||||||||||||||||||
119 | execlen = strlen (callback) + strlen (qline) + 10; | - | ||||||||||||||||||
120 | /* 1 for each space between %s and %d, | - | ||||||||||||||||||
121 | another 1 for the last nul char for C string. */ | - | ||||||||||||||||||
122 | execlen += 3; | - | ||||||||||||||||||
123 | execstr = xmalloc (execlen); | - | ||||||||||||||||||
124 | - | |||||||||||||||||||
125 | flags = SEVAL_NOHIST; | - | ||||||||||||||||||
126 | #if 0 | - | ||||||||||||||||||
127 | if (interactive) | - | ||||||||||||||||||
128 | flags |= SEVAL_INTERACT; | - | ||||||||||||||||||
129 | #endif | - | ||||||||||||||||||
130 | snprintf (execstr, execlen, "%s %d %s", callback, curindex, qline); | - | ||||||||||||||||||
131 | free (qline); | - | ||||||||||||||||||
132 | return evalstring (execstr, NULL, flags); executed 31 times by 1 test: return evalstring (execstr, ((void *)0) , flags); Executed by:
| 31 | ||||||||||||||||||
133 | } | - | ||||||||||||||||||
134 | - | |||||||||||||||||||
135 | static void | - | ||||||||||||||||||
136 | do_chop(line, delim) | - | ||||||||||||||||||
137 | char *line; | - | ||||||||||||||||||
138 | unsigned char delim; | - | ||||||||||||||||||
139 | { | - | ||||||||||||||||||
140 | int length; | - | ||||||||||||||||||
141 | - | |||||||||||||||||||
142 | length = strlen (line); | - | ||||||||||||||||||
143 | if (length && line[length-1] == delim)
| 0-59 | ||||||||||||||||||
144 | line[length-1] = '\0'; executed 56 times by 1 test: line[length-1] = '\0'; Executed by:
| 56 | ||||||||||||||||||
145 | } executed 59 times by 1 test: end of block Executed by:
| 59 | ||||||||||||||||||
146 | - | |||||||||||||||||||
147 | static int | - | ||||||||||||||||||
148 | mapfile (fd, line_count_goal, origin, nskip, callback_quantum, callback, array_name, delim, flags) | - | ||||||||||||||||||
149 | int fd; | - | ||||||||||||||||||
150 | long line_count_goal, origin, nskip, callback_quantum; | - | ||||||||||||||||||
151 | char *callback, *array_name; | - | ||||||||||||||||||
152 | int delim; | - | ||||||||||||||||||
153 | int flags; | - | ||||||||||||||||||
154 | { | - | ||||||||||||||||||
155 | char *line; | - | ||||||||||||||||||
156 | size_t line_length; | - | ||||||||||||||||||
157 | unsigned int array_index, line_count; | - | ||||||||||||||||||
158 | SHELL_VAR *entry; | - | ||||||||||||||||||
159 | int unbuffered_read; | - | ||||||||||||||||||
160 | - | |||||||||||||||||||
161 | line = NULL; | - | ||||||||||||||||||
162 | line_length = 0; | - | ||||||||||||||||||
163 | unbuffered_read = 0; | - | ||||||||||||||||||
164 | - | |||||||||||||||||||
165 | /* The following check should be done before reading any lines. Doing it | - | ||||||||||||||||||
166 | here allows us to call bind_array_element instead of bind_array_variable | - | ||||||||||||||||||
167 | and skip the variable lookup on every call. */ | - | ||||||||||||||||||
168 | entry = find_or_make_array_variable (array_name, 1); | - | ||||||||||||||||||
169 | if (entry == 0 || readonly_p (entry) || noassign_p (entry))
| 0-23 | ||||||||||||||||||
170 | { | - | ||||||||||||||||||
171 | if (entry && readonly_p (entry))
| 0-2 | ||||||||||||||||||
172 | err_readonly (array_name); never executed: err_readonly (array_name); | 0 | ||||||||||||||||||
173 | - | |||||||||||||||||||
174 | return (EXECUTION_FAILURE); executed 2 times by 1 test: return (1); Executed by:
| 2 | ||||||||||||||||||
175 | } | - | ||||||||||||||||||
176 | else if (array_p (entry) == 0)
| 0-23 | ||||||||||||||||||
177 | { | - | ||||||||||||||||||
178 | builtin_error (_("%s: not an indexed array"), array_name); | - | ||||||||||||||||||
179 | return (EXECUTION_FAILURE); never executed: return (1); | 0 | ||||||||||||||||||
180 | } | - | ||||||||||||||||||
181 | else if (invisible_p (entry))
| 4-19 | ||||||||||||||||||
182 | VUNSETATTR (entry, att_invisible); /* no longer invisible */ executed 4 times by 1 test: ((entry)->attributes &= ~(0x0001000)); Executed by:
| 4 | ||||||||||||||||||
183 | - | |||||||||||||||||||
184 | if (flags & MAPF_CLEARARRAY)
| 2-21 | ||||||||||||||||||
185 | array_flush (array_cell (entry)); executed 21 times by 1 test: array_flush ((ARRAY *)((entry)->value)); Executed by:
| 21 | ||||||||||||||||||
186 | - | |||||||||||||||||||
187 | #ifndef __CYGWIN__ | - | ||||||||||||||||||
188 | unbuffered_read = (lseek (fd, 0L, SEEK_CUR) < 0) && (errno == ESPIPE);
| 0-21 | ||||||||||||||||||
189 | #else | - | ||||||||||||||||||
190 | unbuffered_read = 1; | - | ||||||||||||||||||
191 | #endif | - | ||||||||||||||||||
192 | - | |||||||||||||||||||
193 | if (delim != '\n')
| 1-22 | ||||||||||||||||||
194 | unbuffered_read = 1; executed 1 time by 1 test: unbuffered_read = 1; Executed by:
| 1 | ||||||||||||||||||
195 | - | |||||||||||||||||||
196 | zreset (); | - | ||||||||||||||||||
197 | - | |||||||||||||||||||
198 | /* Skip any lines at beginning of file? */ | - | ||||||||||||||||||
199 | for (line_count = 0; line_count < nskip; line_count++)
| 0-23 | ||||||||||||||||||
200 | if (zgetline (fd, &line, &line_length, delim, unbuffered_read) < 0)
| 0 | ||||||||||||||||||
201 | break; never executed: break; | 0 | ||||||||||||||||||
202 | - | |||||||||||||||||||
203 | line = 0; | - | ||||||||||||||||||
204 | line_length = 0; | - | ||||||||||||||||||
205 | - | |||||||||||||||||||
206 | /* Reset the buffer for bash own stream */ | - | ||||||||||||||||||
207 | for (array_index = origin, line_count = 1; | - | ||||||||||||||||||
208 | zgetline (fd, &line, &line_length, delim, unbuffered_read) != -1;
| 20-141 | ||||||||||||||||||
209 | array_index++) | - | ||||||||||||||||||
210 | { | - | ||||||||||||||||||
211 | /* Remove trailing newlines? */ | - | ||||||||||||||||||
212 | if (flags & MAPF_CHOP)
| 59-82 | ||||||||||||||||||
213 | do_chop (line, delim); executed 59 times by 1 test: do_chop (line, delim); Executed by:
| 59 | ||||||||||||||||||
214 | - | |||||||||||||||||||
215 | /* Has a callback been registered and if so is it time to call it? */ | - | ||||||||||||||||||
216 | if (callback && line_count && (line_count % callback_quantum) == 0)
| 0-81 | ||||||||||||||||||
217 | { | - | ||||||||||||||||||
218 | run_callback (callback, array_index, line); | - | ||||||||||||||||||
219 | - | |||||||||||||||||||
220 | /* Reset the buffer for bash own stream. */ | - | ||||||||||||||||||
221 | if (unbuffered_read == 0)
| 4-27 | ||||||||||||||||||
222 | zsyncfd (fd); executed 27 times by 1 test: zsyncfd (fd); Executed by:
| 27 | ||||||||||||||||||
223 | } executed 31 times by 1 test: end of block Executed by:
| 31 | ||||||||||||||||||
224 | - | |||||||||||||||||||
225 | /* XXX - bad things can happen if the callback modifies ENTRY, e.g., | - | ||||||||||||||||||
226 | unsetting it or changing it to a non-indexed-array type. */ | - | ||||||||||||||||||
227 | bind_array_element (entry, array_index, line, 0); | - | ||||||||||||||||||
228 | - | |||||||||||||||||||
229 | /* Have we exceeded # of lines to store? */ | - | ||||||||||||||||||
230 | line_count++; | - | ||||||||||||||||||
231 | if (line_count_goal != 0 && line_count > line_count_goal)
| 3-126 | ||||||||||||||||||
232 | break; executed 3 times by 1 test: break; Executed by:
| 3 | ||||||||||||||||||
233 | } executed 138 times by 1 test: end of block Executed by:
| 138 | ||||||||||||||||||
234 | - | |||||||||||||||||||
235 | free (line); | - | ||||||||||||||||||
236 | - | |||||||||||||||||||
237 | if (unbuffered_read == 0)
| 2-21 | ||||||||||||||||||
238 | zsyncfd (fd); executed 21 times by 1 test: zsyncfd (fd); Executed by:
| 21 | ||||||||||||||||||
239 | - | |||||||||||||||||||
240 | return EXECUTION_SUCCESS; executed 23 times by 1 test: return 0; Executed by:
| 23 | ||||||||||||||||||
241 | } | - | ||||||||||||||||||
242 | - | |||||||||||||||||||
243 | int | - | ||||||||||||||||||
244 | mapfile_builtin (list) | - | ||||||||||||||||||
245 | WORD_LIST *list; | - | ||||||||||||||||||
246 | { | - | ||||||||||||||||||
247 | int opt, code, fd, flags; | - | ||||||||||||||||||
248 | intmax_t intval; | - | ||||||||||||||||||
249 | long lines, origin, nskip, callback_quantum; | - | ||||||||||||||||||
250 | char *array_name, *callback; | - | ||||||||||||||||||
251 | - | |||||||||||||||||||
252 | fd = 0; | - | ||||||||||||||||||
253 | lines = origin = nskip = 0; | - | ||||||||||||||||||
254 | flags = MAPF_CLEARARRAY; | - | ||||||||||||||||||
255 | callback_quantum = DEFAULT_QUANTUM; | - | ||||||||||||||||||
256 | callback = 0; | - | ||||||||||||||||||
257 | delim = '\n'; | - | ||||||||||||||||||
258 | - | |||||||||||||||||||
259 | reset_internal_getopt (); | - | ||||||||||||||||||
260 | while ((opt = internal_getopt (list, "d:u:n:O:tC:c:s:")) != -1)
| 25 | ||||||||||||||||||
261 | { | - | ||||||||||||||||||
262 | switch (opt) | - | ||||||||||||||||||
263 | { | - | ||||||||||||||||||
264 | case 'd': executed 1 time by 1 test: case 'd': Executed by:
| 1 | ||||||||||||||||||
265 | delim = *list_optarg; | - | ||||||||||||||||||
266 | break; executed 1 time by 1 test: break; Executed by:
| 1 | ||||||||||||||||||
267 | case 'u': executed 1 time by 1 test: case 'u': Executed by:
| 1 | ||||||||||||||||||
268 | code = legal_number (list_optarg, &intval); | - | ||||||||||||||||||
269 | if (code == 0 || intval < 0 || intval != (int)intval)
| 0-1 | ||||||||||||||||||
270 | { | - | ||||||||||||||||||
271 | builtin_error (_("%s: invalid file descriptor specification"), list_optarg); | - | ||||||||||||||||||
272 | return (EXECUTION_FAILURE); never executed: return (1); | 0 | ||||||||||||||||||
273 | } | - | ||||||||||||||||||
274 | else | - | ||||||||||||||||||
275 | fd = intval; executed 1 time by 1 test: fd = intval; Executed by:
| 1 | ||||||||||||||||||
276 | - | |||||||||||||||||||
277 | if (sh_validfd (fd) == 0)
| 0-1 | ||||||||||||||||||
278 | { | - | ||||||||||||||||||
279 | builtin_error (_("%d: invalid file descriptor: %s"), fd, strerror (errno)); | - | ||||||||||||||||||
280 | return (EXECUTION_FAILURE); never executed: return (1); | 0 | ||||||||||||||||||
281 | } | - | ||||||||||||||||||
282 | break; executed 1 time by 1 test: break; Executed by:
| 1 | ||||||||||||||||||
283 | - | |||||||||||||||||||
284 | case 'n': executed 4 times by 1 test: case 'n': Executed by:
| 4 | ||||||||||||||||||
285 | code = legal_number (list_optarg, &intval); | - | ||||||||||||||||||
286 | if (code == 0 || intval < 0 || intval != (unsigned)intval)
| 0-4 | ||||||||||||||||||
287 | { | - | ||||||||||||||||||
288 | builtin_error (_("%s: invalid line count"), list_optarg); | - | ||||||||||||||||||
289 | return (EXECUTION_FAILURE); never executed: return (1); | 0 | ||||||||||||||||||
290 | } | - | ||||||||||||||||||
291 | else | - | ||||||||||||||||||
292 | lines = intval; executed 4 times by 1 test: lines = intval; Executed by:
| 4 | ||||||||||||||||||
293 | break; executed 4 times by 1 test: break; Executed by:
| 4 | ||||||||||||||||||
294 | - | |||||||||||||||||||
295 | case 'O': executed 2 times by 1 test: case 'O': Executed by:
| 2 | ||||||||||||||||||
296 | code = legal_number (list_optarg, &intval); | - | ||||||||||||||||||
297 | if (code == 0 || intval < 0 || intval != (unsigned)intval)
| 0-2 | ||||||||||||||||||
298 | { | - | ||||||||||||||||||
299 | builtin_error (_("%s: invalid array origin"), list_optarg); | - | ||||||||||||||||||
300 | return (EXECUTION_FAILURE); never executed: return (1); | 0 | ||||||||||||||||||
301 | } | - | ||||||||||||||||||
302 | else | - | ||||||||||||||||||
303 | origin = intval; executed 2 times by 1 test: origin = intval; Executed by:
| 2 | ||||||||||||||||||
304 | flags &= ~MAPF_CLEARARRAY; | - | ||||||||||||||||||
305 | break; executed 2 times by 1 test: break; Executed by:
| 2 | ||||||||||||||||||
306 | case 't': executed 5 times by 1 test: case 't': Executed by:
| 5 | ||||||||||||||||||
307 | flags |= MAPF_CHOP; | - | ||||||||||||||||||
308 | break; executed 5 times by 1 test: break; Executed by:
| 5 | ||||||||||||||||||
309 | case 'C': executed 6 times by 1 test: case 'C': Executed by:
| 6 | ||||||||||||||||||
310 | callback = list_optarg; | - | ||||||||||||||||||
311 | break; executed 6 times by 1 test: break; Executed by:
| 6 | ||||||||||||||||||
312 | case 'c': executed 6 times by 1 test: case 'c': Executed by:
| 6 | ||||||||||||||||||
313 | code = legal_number (list_optarg, &intval); | - | ||||||||||||||||||
314 | if (code == 0 || intval <= 0 || intval != (unsigned)intval)
| 0-6 | ||||||||||||||||||
315 | { | - | ||||||||||||||||||
316 | builtin_error (_("%s: invalid callback quantum"), list_optarg); | - | ||||||||||||||||||
317 | return (EXECUTION_FAILURE); never executed: return (1); | 0 | ||||||||||||||||||
318 | } | - | ||||||||||||||||||
319 | else | - | ||||||||||||||||||
320 | callback_quantum = intval; executed 6 times by 1 test: callback_quantum = intval; Executed by:
| 6 | ||||||||||||||||||
321 | break; executed 6 times by 1 test: break; Executed by:
| 6 | ||||||||||||||||||
322 | case 's': never executed: case 's': | 0 | ||||||||||||||||||
323 | code = legal_number (list_optarg, &intval); | - | ||||||||||||||||||
324 | if (code == 0 || intval < 0 || intval != (unsigned)intval)
| 0 | ||||||||||||||||||
325 | { | - | ||||||||||||||||||
326 | builtin_error (_("%s: invalid line count"), list_optarg); | - | ||||||||||||||||||
327 | return (EXECUTION_FAILURE); never executed: return (1); | 0 | ||||||||||||||||||
328 | } | - | ||||||||||||||||||
329 | else | - | ||||||||||||||||||
330 | nskip = intval; never executed: nskip = intval; | 0 | ||||||||||||||||||
331 | break; never executed: break; | 0 | ||||||||||||||||||
332 | CASE_HELPOPT; never executed: return (258); never executed: case -99: | 0 | ||||||||||||||||||
333 | default: never executed: default: | 0 | ||||||||||||||||||
334 | builtin_usage (); | - | ||||||||||||||||||
335 | return (EX_USAGE); never executed: return (258); | 0 | ||||||||||||||||||
336 | } | - | ||||||||||||||||||
337 | } | - | ||||||||||||||||||
338 | list = loptend; | - | ||||||||||||||||||
339 | - | |||||||||||||||||||
340 | if (list == 0)
| 0-25 | ||||||||||||||||||
341 | array_name = DEFAULT_ARRAY_NAME; never executed: array_name = "MAPFILE"; | 0 | ||||||||||||||||||
342 | else if (list->word == 0 || list->word->word == 0)
| 0-25 | ||||||||||||||||||
343 | { | - | ||||||||||||||||||
344 | builtin_error ("internal error: getting variable name"); | - | ||||||||||||||||||
345 | return (EXECUTION_FAILURE); never executed: return (1); | 0 | ||||||||||||||||||
346 | } | - | ||||||||||||||||||
347 | else if (list->word->word[0] == '\0')
| 0-25 | ||||||||||||||||||
348 | { | - | ||||||||||||||||||
349 | builtin_error (_("empty array variable name")); | - | ||||||||||||||||||
350 | return (EX_USAGE); never executed: return (258); | 0 | ||||||||||||||||||
351 | } | - | ||||||||||||||||||
352 | else | - | ||||||||||||||||||
353 | array_name = list->word->word; executed 25 times by 1 test: array_name = list->word->word; Executed by:
| 25 | ||||||||||||||||||
354 | - | |||||||||||||||||||
355 | if (legal_identifier (array_name) == 0)
| 0-25 | ||||||||||||||||||
356 | { | - | ||||||||||||||||||
357 | sh_invalidid (array_name); | - | ||||||||||||||||||
358 | return (EXECUTION_FAILURE); never executed: return (1); | 0 | ||||||||||||||||||
359 | } | - | ||||||||||||||||||
360 | - | |||||||||||||||||||
361 | return mapfile (fd, lines, origin, nskip, callback_quantum, callback, array_name, delim, flags); executed 25 times by 1 test: return mapfile (fd, lines, origin, nskip, callback_quantum, callback, array_name, delim, flags); Executed by:
| 25 | ||||||||||||||||||
362 | } | - | ||||||||||||||||||
363 | - | |||||||||||||||||||
364 | #else | - | ||||||||||||||||||
365 | - | |||||||||||||||||||
366 | int | - | ||||||||||||||||||
367 | mapfile_builtin (list) | - | ||||||||||||||||||
368 | WORD_LIST *list; | - | ||||||||||||||||||
369 | { | - | ||||||||||||||||||
370 | builtin_error (_("array variable support required")); | - | ||||||||||||||||||
371 | return (EXECUTION_FAILURE); | - | ||||||||||||||||||
372 | } | - | ||||||||||||||||||
373 | - | |||||||||||||||||||
374 | #endif /* ARRAY_VARS */ | - | ||||||||||||||||||
Source code | Switch to Preprocessed file |