OpenCoverage

cat.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/src/cat.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* cat -- concatenate files and print on the standard output.-
2 Copyright (C) 1988-2018 Free Software Foundation, Inc.-
3-
4 This program is free software: you can redistribute it and/or modify-
5 it under the terms of the GNU General Public License as published by-
6 the Free Software Foundation, either version 3 of the License, or-
7 (at your option) any later version.-
8-
9 This program is distributed in the hope that it will be useful,-
10 but WITHOUT ANY WARRANTY; without even the implied warranty of-
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
12 GNU General Public License for more details.-
13-
14 You should have received a copy of the GNU General Public License-
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */-
16-
17/* Differences from the Unix cat:-
18 * Always unbuffered, -u is ignored.-
19 * Usually much faster than other versions of cat, the difference-
20 is especially apparent when using the -v option.-
21-
22 By tege@sics.se, Torbjorn Granlund, advised by rms, Richard Stallman. */-
23-
24#include <config.h>-
25-
26#include <stdio.h>-
27#include <getopt.h>-
28#include <sys/types.h>-
29-
30#if HAVE_STROPTS_H-
31# include <stropts.h>-
32#endif-
33#include <sys/ioctl.h>-
34-
35#include "system.h"-
36#include "ioblksize.h"-
37#include "die.h"-
38#include "error.h"-
39#include "fadvise.h"-
40#include "full-write.h"-
41#include "safe-read.h"-
42#include "xbinary-io.h"-
43-
44/* The official name of this program (e.g., no 'g' prefix). */-
45#define PROGRAM_NAME "cat"-
46-
47#define AUTHORS \-
48 proper_name ("Torbjorn Granlund"), \-
49 proper_name ("Richard M. Stallman")-
50-
51/* Name of input file. May be "-". */-
52static char const *infile;-
53-
54/* Descriptor on which input file is open. */-
55static int input_desc;-
56-
57/* Buffer for line numbers.-
58 An 11 digit counter may overflow within an hour on a P2/466,-
59 an 18 digit counter needs about 1000y */-
60#define LINE_COUNTER_BUF_LEN 20-
61static char line_buf[LINE_COUNTER_BUF_LEN] =-
62 {-
63 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',-
64 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0',-
65 '\t', '\0'-
66 };-
67-
68/* Position in 'line_buf' where printing starts. This will not change-
69 unless the number of lines is larger than 999999. */-
70static char *line_num_print = line_buf + LINE_COUNTER_BUF_LEN - 8;-
71-
72/* Position of the first digit in 'line_buf'. */-
73static char *line_num_start = line_buf + LINE_COUNTER_BUF_LEN - 3;-
74-
75/* Position of the last digit in 'line_buf'. */-
76static char *line_num_end = line_buf + LINE_COUNTER_BUF_LEN - 3;-
77-
78/* Preserves the 'cat' function's local 'newlines' between invocations. */-
79static int newlines2 = 0;-
80-
81void-
82usage (int status)-
83{-
84 if (status != EXIT_SUCCESS)
status != 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 20 times by 1 test
Evaluated by:
  • cat
3-20
85 emit_try_help ();
executed 3 times by 1 test: end of block
Executed by:
  • cat
3
86 else-
87 {-
88 printf (_("\-
89Usage: %s [OPTION]... [FILE]...\n\-
90"),-
91 program_name);-
92 fputs (_("\-
93Concatenate FILE(s) to standard output.\n\-
94"), stdout);-
95-
96 emit_stdin_note ();-
97-
98 fputs (_("\-
99\n\-
100 -A, --show-all equivalent to -vET\n\-
101 -b, --number-nonblank number nonempty output lines, overrides -n\n\-
102 -e equivalent to -vE\n\-
103 -E, --show-ends display $ at end of each line\n\-
104 -n, --number number all output lines\n\-
105 -s, --squeeze-blank suppress repeated empty output lines\n\-
106"), stdout);-
107 fputs (_("\-
108 -t equivalent to -vT\n\-
109 -T, --show-tabs display TAB characters as ^I\n\-
110 -u (ignored)\n\-
111 -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB\n\-
112"), stdout);-
113 fputs (HELP_OPTION_DESCRIPTION, stdout);-
114 fputs (VERSION_OPTION_DESCRIPTION, stdout);-
115 printf (_("\-
116\n\-
117Examples:\n\-
118 %s f - g Output f's contents, then standard input, then g's contents.\n\-
119 %s Copy standard input to standard output.\n\-
120"),-
121 program_name, program_name);-
122 emit_ancillary_info (PROGRAM_NAME);-
123 }
executed 20 times by 1 test: end of block
Executed by:
  • cat
20
124 exit (status);
executed 23 times by 1 test: exit (status);
Executed by:
  • cat
23
125}-
126-
127/* Compute the next line number. */-
128-
129static void-
130next_line_num (void)-
131{-
132 char *endp = line_num_end;-
133 do-
134 {-
135 if ((*endp)++ < '9')
(*endp)++ < '9'Description
TRUEevaluated 17 times by 1 test
Evaluated by:
  • cat
FALSEnever evaluated
0-17
136 return;
executed 17 times by 1 test: return;
Executed by:
  • cat
17
137 *endp-- = '0';-
138 }
never executed: end of block
0
139 while (endp >= line_num_start);
endp >= line_num_startDescription
TRUEnever evaluated
FALSEnever evaluated
0
140 if (line_num_start > line_buf)
line_num_start > line_bufDescription
TRUEnever evaluated
FALSEnever evaluated
0
141 *--line_num_start = '1';
never executed: *--line_num_start = '1';
0
142 else-
143 *line_buf = '>';
never executed: *line_buf = '>';
0
144 if (line_num_start < line_num_print)
line_num_start...line_num_printDescription
TRUEnever evaluated
FALSEnever evaluated
0
145 line_num_print--;
never executed: line_num_print--;
0
146}
never executed: end of block
0
147-
148/* Plain cat. Copies the file behind 'input_desc' to STDOUT_FILENO.-
149 Return true if successful. */-
150-
151static bool-
152simple_cat (-
153 /* Pointer to the buffer, used by reads and writes. */-
154 char *buf,-
155-
156 /* Number of characters preferably read or written by each read and write-
157 call. */-
158 size_t bufsize)-
159{-
160 /* Actual number of characters read, and therefore written. */-
161 size_t n_read;-
162-
163 /* Loop until the end of the file. */-
164-
165 while (true)-
166 {-
167 /* Read a block of input. */-
168-
169 n_read = safe_read (input_desc, buf, bufsize);-
170 if (n_read == SAFE_READ_ERROR)
n_read == ((size_t) -1)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 5767 times by 1 test
Evaluated by:
  • cat
4-5767
171 {-
172 error (0, errno, "%s", quotef (infile));-
173 return false;
executed 4 times by 1 test: return 0 ;
Executed by:
  • cat
4
174 }-
175-
176 /* End of this file? */-
177-
178 if (n_read == 0)
n_read == 0Description
TRUEevaluated 2421 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 3346 times by 1 test
Evaluated by:
  • cat
2421-3346
179 return true;
executed 2421 times by 1 test: return 1 ;
Executed by:
  • cat
2421
180-
181 /* Write this block out. */-
182-
183 {-
184 /* The following is ok, since we know that 0 < n_read. */-
185 size_t n = n_read;-
186 if (full_write (STDOUT_FILENO, buf, n) != n)
full_write ( 1 , buf, n) != nDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cat
FALSEevaluated 3345 times by 1 test
Evaluated by:
  • cat
1-3345
187 die (EXIT_FAILURE, errno, _("write error"));
executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"write error\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "write error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "write error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
Executed by:
  • cat
1
188 }-
189 }
executed 3345 times by 1 test: end of block
Executed by:
  • cat
3345
190}
never executed: end of block
0
191-
192/* Write any pending output to STDOUT_FILENO.-
193 Pending is defined to be the *BPOUT - OUTBUF bytes starting at OUTBUF.-
194 Then set *BPOUT to OUTPUT if it's not already that value. */-
195-
196static inline void-
197write_pending (char *outbuf, char **bpout)-
198{-
199 size_t n_write = *bpout - outbuf;-
200 if (0 < n_write)
0 < n_writeDescription
TRUEevaluated 13 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 11 times by 1 test
Evaluated by:
  • cat
11-13
201 {-
202 if (full_write (STDOUT_FILENO, outbuf, n_write) != n_write)
full_write ( 1...te) != n_writeDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cat
FALSEevaluated 12 times by 1 test
Evaluated by:
  • cat
1-12
203 die (EXIT_FAILURE, errno, _("write error"));
executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"write error\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "write error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "write error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
Executed by:
  • cat
1
204 *bpout = outbuf;-
205 }
executed 12 times by 1 test: end of block
Executed by:
  • cat
12
206}
executed 23 times by 1 test: end of block
Executed by:
  • cat
23
207-
208/* Cat the file behind INPUT_DESC to the file behind OUTPUT_DESC.-
209 Return true if successful.-
210 Called if any option more than -u was specified.-
211-
212 A newline character is always put at the end of the buffer, to make-
213 an explicit test for buffer end unnecessary. */-
214-
215static bool-
216cat (-
217 /* Pointer to the beginning of the input buffer. */-
218 char *inbuf,-
219-
220 /* Number of characters read in each read call. */-
221 size_t insize,-
222-
223 /* Pointer to the beginning of the output buffer. */-
224 char *outbuf,-
225-
226 /* Number of characters written by each write call. */-
227 size_t outsize,-
228-
229 /* Variables that have values according to the specified options. */-
230 bool show_nonprinting,-
231 bool show_tabs,-
232 bool number,-
233 bool number_nonblank,-
234 bool show_ends,-
235 bool squeeze_blank)-
236{-
237 /* Last character read from the input buffer. */-
238 unsigned char ch;-
239-
240 /* Pointer to the next character in the input buffer. */-
241 char *bpin;-
242-
243 /* Pointer to the first non-valid byte in the input buffer, i.e., the-
244 current end of the buffer. */-
245 char *eob;-
246-
247 /* Pointer to the position where the next character shall be written. */-
248 char *bpout;-
249-
250 /* Number of characters read by the last read call. */-
251 size_t n_read;-
252-
253 /* Determines how many consecutive newlines there have been in the-
254 input. 0 newlines makes NEWLINES -1, 1 newline makes NEWLINES 1,-
255 etc. Initially 0 to indicate that we are at the beginning of a-
256 new line. The "state" of the procedure is determined by-
257 NEWLINES. */-
258 int newlines = newlines2;-
259-
260#ifdef FIONREAD-
261 /* If nonzero, use the FIONREAD ioctl, as an optimization.-
262 (On Ultrix, it is not supported on NFS file systems.) */-
263 bool use_fionread = true;-
264#endif-
265-
266 /* The inbuf pointers are initialized so that BPIN > EOB, and thereby input-
267 is read immediately. */-
268-
269 eob = inbuf;-
270 bpin = eob + 1;-
271-
272 bpout = outbuf;-
273-
274 while (true)-
275 {-
276 do-
277 {-
278 /* Write if there are at least OUTSIZE bytes in OUTBUF. */-
279-
280 if (outbuf + outsize <= bpout)
outbuf + outsize <= bpoutDescription
TRUEnever evaluated
FALSEevaluated 181 times by 1 test
Evaluated by:
  • cat
0-181
281 {-
282 char *wp = outbuf;-
283 size_t remaining_bytes;-
284 do-
285 {-
286 if (full_write (STDOUT_FILENO, wp, outsize) != outsize)
full_write ( 1...ze) != outsizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
287 die (EXIT_FAILURE, errno, _("write error"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"write error\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "write error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "write error" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
0
288 wp += outsize;-
289 remaining_bytes = bpout - wp;-
290 }
never executed: end of block
0
291 while (outsize <= remaining_bytes);
outsize <= remaining_bytesDescription
TRUEnever evaluated
FALSEnever evaluated
0
292-
293 /* Move the remaining bytes to the beginning of the-
294 buffer. */-
295-
296 memmove (outbuf, wp, remaining_bytes);-
297 bpout = outbuf + remaining_bytes;-
298 }
never executed: end of block
0
299-
300 /* Is INBUF empty? */-
301-
302 if (bpin > eob)
bpin > eobDescription
TRUEevaluated 25 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 156 times by 1 test
Evaluated by:
  • cat
25-156
303 {-
304 bool input_pending = false;-
305#ifdef FIONREAD-
306 int n_to_read = 0;-
307-
308 /* Is there any input to read immediately?-
309 If not, we are about to wait,-
310 so write all buffered output before waiting. */-
311-
312 if (use_fionread
use_fionreadDescription
TRUEevaluated 25 times by 1 test
Evaluated by:
  • cat
FALSEnever evaluated
0-25
313 && ioctl (input_desc, FIONREAD, &n_to_read) < 0)
ioctl (input_d...n_to_read) < 0Description
TRUEnever evaluated
FALSEevaluated 25 times by 1 test
Evaluated by:
  • cat
0-25
314 {-
315 /* Ultrix returns EOPNOTSUPP on NFS;-
316 HP-UX returns ENOTTY on pipes.-
317 SunOS returns EINVAL and-
318 More/BSD returns ENODEV on special files-
319 like /dev/null.-
320 Irix-5 returns ENOSYS on pipes. */-
321 if (errno == EOPNOTSUPP || errno == ENOTTY
(*__errno_location ()) == 95Description
TRUEnever evaluated
FALSEnever evaluated
(*__errno_location ()) == 25Description
TRUEnever evaluated
FALSEnever evaluated
0
322 || errno == EINVAL || errno == ENODEV
(*__errno_location ()) == 22Description
TRUEnever evaluated
FALSEnever evaluated
(*__errno_location ()) == 19Description
TRUEnever evaluated
FALSEnever evaluated
0
323 || errno == ENOSYS)
(*__errno_location ()) == 38Description
TRUEnever evaluated
FALSEnever evaluated
0
324 use_fionread = false;
never executed: use_fionread = 0 ;
0
325 else-
326 {-
327 error (0, errno, _("cannot do ioctl on %s"),-
328 quoteaf (infile));-
329 newlines2 = newlines;-
330 return false;
never executed: return 0 ;
0
331 }-
332 }-
333 if (n_to_read != 0)
n_to_read != 0Description
TRUEevaluated 12 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cat
12-13
334 input_pending = true;
executed 12 times by 1 test: input_pending = 1 ;
Executed by:
  • cat
12
335#endif-
336-
337 if (!input_pending)
!input_pendingDescription
TRUEevaluated 13 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 12 times by 1 test
Evaluated by:
  • cat
12-13
338 write_pending (outbuf, &bpout);
executed 13 times by 1 test: write_pending (outbuf, &bpout);
Executed by:
  • cat
13
339-
340 /* Read more input into INBUF. */-
341-
342 n_read = safe_read (input_desc, inbuf, insize);-
343 if (n_read == SAFE_READ_ERROR)
n_read == ((size_t) -1)Description
TRUEnever evaluated
FALSEevaluated 24 times by 1 test
Evaluated by:
  • cat
0-24
344 {-
345 error (0, errno, "%s", quotef (infile));-
346 write_pending (outbuf, &bpout);-
347 newlines2 = newlines;-
348 return false;
never executed: return 0 ;
0
349 }-
350 if (n_read == 0)
n_read == 0Description
TRUEevaluated 11 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cat
11-13
351 {-
352 write_pending (outbuf, &bpout);-
353 newlines2 = newlines;-
354 return true;
executed 11 times by 1 test: return 1 ;
Executed by:
  • cat
11
355 }-
356-
357 /* Update the pointers and insert a sentinel at the buffer-
358 end. */-
359-
360 bpin = inbuf;-
361 eob = bpin + n_read;-
362 *eob = '\n';-
363 }
executed 13 times by 1 test: end of block
Executed by:
  • cat
13
364 else-
365 {-
366 /* It was a real (not a sentinel) newline. */-
367-
368 /* Was the last line empty?-
369 (i.e., have two or more consecutive newlines been read?) */-
370-
371 if (++newlines > 0)
++newlines > 0Description
TRUEevaluated 9 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 147 times by 1 test
Evaluated by:
  • cat
9-147
372 {-
373 if (newlines >= 2)
newlines >= 2Description
TRUEnever evaluated
FALSEevaluated 9 times by 1 test
Evaluated by:
  • cat
0-9
374 {-
375 /* Limit this to 2 here. Otherwise, with lots of-
376 consecutive newlines, the counter could wrap-
377 around at INT_MAX. */-
378 newlines = 2;-
379-
380 /* Are multiple adjacent empty lines to be substituted-
381 by single ditto (-s), and this was the second empty-
382 line? */-
383 if (squeeze_blank)
squeeze_blankDescription
TRUEnever evaluated
FALSEnever evaluated
0
384 {-
385 ch = *bpin++;-
386 continue;
never executed: continue;
0
387 }-
388 }
never executed: end of block
0
389-
390 /* Are line numbers to be written at empty lines (-n)? */-
391-
392 if (number && !number_nonblank)
numberDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 4 times by 1 test
Evaluated by:
  • cat
!number_nonblankDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • cat
FALSEnever evaluated
0-5
393 {-
394 next_line_num ();-
395 bpout = stpcpy (bpout, line_num_print);-
396 }
executed 5 times by 1 test: end of block
Executed by:
  • cat
5
397 }
executed 9 times by 1 test: end of block
Executed by:
  • cat
9
398-
399 /* Output a currency symbol if requested (-e). */-
400-
401 if (show_ends)
show_endsDescription
TRUEevaluated 137 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 19 times by 1 test
Evaluated by:
  • cat
19-137
402 *bpout++ = '$';
executed 137 times by 1 test: *bpout++ = '$';
Executed by:
  • cat
137
403-
404 /* Output the newline. */-
405-
406 *bpout++ = '\n';-
407 }
executed 156 times by 1 test: end of block
Executed by:
  • cat
156
408 ch = *bpin++;-
409 }
executed 169 times by 1 test: end of block
Executed by:
  • cat
169
410 while (ch == '\n');
ch == '\n'Description
TRUEevaluated 22 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 147 times by 1 test
Evaluated by:
  • cat
22-147
411-
412 /* Are we at the beginning of a line, and line numbers are requested? */-
413-
414 if (newlines >= 0 && number)
newlines >= 0Description
TRUEevaluated 147 times by 1 test
Evaluated by:
  • cat
FALSEnever evaluated
numberDescription
TRUEevaluated 12 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 135 times by 1 test
Evaluated by:
  • cat
0-147
415 {-
416 next_line_num ();-
417 bpout = stpcpy (bpout, line_num_print);-
418 }
executed 12 times by 1 test: end of block
Executed by:
  • cat
12
419-
420 /* Here CH cannot contain a newline character. */-
421-
422 /* The loops below continue until a newline character is found,-
423 which means that the buffer is empty or that a proper newline-
424 has been found. */-
425-
426 /* If quoting, i.e., at least one of -v, -e, or -t specified,-
427 scan for chars that need conversion. */-
428 if (show_nonprinting)
show_nonprintingDescription
TRUEevaluated 31 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 116 times by 1 test
Evaluated by:
  • cat
31-116
429 {-
430 while (true)-
431 {-
432 if (ch >= 32)
ch >= 32Description
TRUEevaluated 531 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 114 times by 1 test
Evaluated by:
  • cat
114-531
433 {-
434 if (ch < 127)
ch < 127Description
TRUEevaluated 531 times by 1 test
Evaluated by:
  • cat
FALSEnever evaluated
0-531
435 *bpout++ = ch;
executed 531 times by 1 test: *bpout++ = ch;
Executed by:
  • cat
531
436 else if (ch == 127)
ch == 127Description
TRUEnever evaluated
FALSEnever evaluated
0
437 {-
438 *bpout++ = '^';-
439 *bpout++ = '?';-
440 }
never executed: end of block
0
441 else-
442 {-
443 *bpout++ = 'M';-
444 *bpout++ = '-';-
445 if (ch >= 128 + 32)
ch >= 128 + 32Description
TRUEnever evaluated
FALSEnever evaluated
0
446 {-
447 if (ch < 128 + 127)
ch < 128 + 127Description
TRUEnever evaluated
FALSEnever evaluated
0
448 *bpout++ = ch - 128;
never executed: *bpout++ = ch - 128;
0
449 else-
450 {-
451 *bpout++ = '^';-
452 *bpout++ = '?';-
453 }
never executed: end of block
0
454 }-
455 else-
456 {-
457 *bpout++ = '^';-
458 *bpout++ = ch - 128 + 64;-
459 }
never executed: end of block
0
460 }-
461 }-
462 else if (ch == '\t' && !show_tabs)
ch == '\t'Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cat
FALSEevaluated 113 times by 1 test
Evaluated by:
  • cat
!show_tabsDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cat
0-113
463 *bpout++ = '\t';
never executed: *bpout++ = '\t';
0
464 else if (ch == '\n')
ch == '\n'Description
TRUEevaluated 31 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 83 times by 1 test
Evaluated by:
  • cat
31-83
465 {-
466 newlines = -1;-
467 break;
executed 31 times by 1 test: break;
Executed by:
  • cat
31
468 }-
469 else-
470 {-
471 *bpout++ = '^';-
472 *bpout++ = ch + 64;-
473 }
executed 83 times by 1 test: end of block
Executed by:
  • cat
83
474-
475 ch = *bpin++;-
476 }
executed 614 times by 1 test: end of block
Executed by:
  • cat
614
477 }
executed 31 times by 1 test: end of block
Executed by:
  • cat
31
478 else-
479 {-
480 /* Not quoting, neither of -v, -e, or -t specified. */-
481 while (true)-
482 {-
483 if (ch == '\t' && show_tabs)
ch == '\t'Description
TRUEevaluated 132 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 2962 times by 1 test
Evaluated by:
  • cat
show_tabsDescription
TRUEnever evaluated
FALSEevaluated 132 times by 1 test
Evaluated by:
  • cat
0-2962
484 {-
485 *bpout++ = '^';-
486 *bpout++ = ch + 64;-
487 }
never executed: end of block
0
488 else if (ch != '\n')
ch != '\n'Description
TRUEevaluated 2978 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 116 times by 1 test
Evaluated by:
  • cat
116-2978
489 *bpout++ = ch;
executed 2978 times by 1 test: *bpout++ = ch;
Executed by:
  • cat
2978
490 else-
491 {-
492 newlines = -1;-
493 break;
executed 116 times by 1 test: break;
Executed by:
  • cat
116
494 }-
495-
496 ch = *bpin++;-
497 }
executed 2978 times by 1 test: end of block
Executed by:
  • cat
2978
498 }
executed 116 times by 1 test: end of block
Executed by:
  • cat
116
499 }-
500}
never executed: end of block
0
501-
502int-
503main (int argc, char **argv)-
504{-
505 /* Optimal size of i/o operations of output. */-
506 size_t outsize;-
507-
508 /* Optimal size of i/o operations of input. */-
509 size_t insize;-
510-
511 size_t page_size = getpagesize ();-
512-
513 /* Pointer to the input buffer. */-
514 char *inbuf;-
515-
516 /* Pointer to the output buffer. */-
517 char *outbuf;-
518-
519 bool ok = true;-
520 int c;-
521-
522 /* Index in argv to processed argument. */-
523 int argind;-
524-
525 /* Device number of the output (file or whatever). */-
526 dev_t out_dev;-
527-
528 /* I-node number of the output. */-
529 ino_t out_ino;-
530-
531 /* True if the output is a regular file. */-
532 bool out_isreg;-
533-
534 /* Nonzero if we have ever read standard input. */-
535 bool have_read_stdin = false;-
536-
537 struct stat stat_buf;-
538-
539 /* Variables that are set according to the specified options. */-
540 bool number = false;-
541 bool number_nonblank = false;-
542 bool squeeze_blank = false;-
543 bool show_ends = false;-
544 bool show_nonprinting = false;-
545 bool show_tabs = false;-
546 int file_open_mode = O_RDONLY;-
547-
548 static struct option const long_options[] =-
549 {-
550 {"number-nonblank", no_argument, NULL, 'b'},-
551 {"number", no_argument, NULL, 'n'},-
552 {"squeeze-blank", no_argument, NULL, 's'},-
553 {"show-nonprinting", no_argument, NULL, 'v'},-
554 {"show-ends", no_argument, NULL, 'E'},-
555 {"show-tabs", no_argument, NULL, 'T'},-
556 {"show-all", no_argument, NULL, 'A'},-
557 {GETOPT_HELP_OPTION_DECL},-
558 {GETOPT_VERSION_OPTION_DECL},-
559 {NULL, 0, NULL, 0}-
560 };-
561-
562 initialize_main (&argc, &argv);-
563 set_program_name (argv[0]);-
564 setlocale (LC_ALL, "");-
565 bindtextdomain (PACKAGE, LOCALEDIR);-
566 textdomain (PACKAGE);-
567-
568 /* Arrange to close stdout if we exit via the-
569 case_GETOPT_HELP_CHAR or case_GETOPT_VERSION_CHAR code.-
570 Normally STDOUT_FILENO is used rather than stdout, so-
571 close_stdout does nothing. */-
572 atexit (close_stdout);-
573-
574 /* Parse command line options. */-
575-
576 while ((c = getopt_long (argc, argv, "benstuvAET", long_options, NULL))
(c = getopt_lo... *)0) )) != -1Description
TRUEevaluated 58 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 1908 times by 1 test
Evaluated by:
  • cat
58-1908
577 != -1)
(c = getopt_lo... *)0) )) != -1Description
TRUEevaluated 58 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 1908 times by 1 test
Evaluated by:
  • cat
58-1908
578 {-
579 switch (c)-
580 {-
581 case 'b':
executed 2 times by 1 test: case 'b':
Executed by:
  • cat
2
582 number = true;-
583 number_nonblank = true;-
584 break;
executed 2 times by 1 test: break;
Executed by:
  • cat
2
585-
586 case 'e':
executed 1 time by 1 test: case 'e':
Executed by:
  • cat
1
587 show_ends = true;-
588 show_nonprinting = true;-
589 break;
executed 1 time by 1 test: break;
Executed by:
  • cat
1
590-
591 case 'n':
executed 7 times by 1 test: case 'n':
Executed by:
  • cat
7
592 number = true;-
593 break;
executed 7 times by 1 test: break;
Executed by:
  • cat
7
594-
595 case 's':
executed 2 times by 1 test: case 's':
Executed by:
  • cat
2
596 squeeze_blank = true;-
597 break;
executed 2 times by 1 test: break;
Executed by:
  • cat
2
598-
599 case 't':
executed 1 time by 1 test: case 't':
Executed by:
  • cat
1
600 show_tabs = true;-
601 show_nonprinting = true;-
602 break;
executed 1 time by 1 test: break;
Executed by:
  • cat
1
603-
604 case 'u':
executed 1 time by 1 test: case 'u':
Executed by:
  • cat
1
605 /* We provide the -u feature unconditionally. */-
606 break;
executed 1 time by 1 test: break;
Executed by:
  • cat
1
607-
608 case 'v':
executed 3 times by 1 test: case 'v':
Executed by:
  • cat
3
609 show_nonprinting = true;-
610 break;
executed 3 times by 1 test: break;
Executed by:
  • cat
3
611-
612 case 'A':
executed 7 times by 1 test: case 'A':
Executed by:
  • cat
7
613 show_nonprinting = true;-
614 show_ends = true;-
615 show_tabs = true;-
616 break;
executed 7 times by 1 test: break;
Executed by:
  • cat
7
617-
618 case 'E':
executed 3 times by 1 test: case 'E':
Executed by:
  • cat
3
619 show_ends = true;-
620 break;
executed 3 times by 1 test: break;
Executed by:
  • cat
3
621-
622 case 'T':
executed 2 times by 1 test: case 'T':
Executed by:
  • cat
2
623 show_tabs = true;-
624 break;
executed 2 times by 1 test: break;
Executed by:
  • cat
2
625-
626 case_GETOPT_HELP_CHAR;
never executed: break;
executed 20 times by 1 test: case GETOPT_HELP_CHAR:
Executed by:
  • cat
0-20
627-
628 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
executed 6 times by 1 test: exit ( 0 );
Executed by:
  • cat
never executed: break;
executed 6 times by 1 test: case GETOPT_VERSION_CHAR:
Executed by:
  • cat
0-6
629-
630 default:
executed 3 times by 1 test: default:
Executed by:
  • cat
3
631 usage (EXIT_FAILURE);-
632 }
never executed: end of block
0
633 }-
634-
635 /* Get device, i-node number, and optimal blocksize of output. */-
636-
637 if (fstat (STDOUT_FILENO, &stat_buf) < 0)
fstat ( 1 , &stat_buf) < 0Description
TRUEnever evaluated
FALSEevaluated 1908 times by 1 test
Evaluated by:
  • cat
0-1908
638 die (EXIT_FAILURE, errno, _("standard output"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"standard output\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "standard output" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "standard output" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
0
639-
640 outsize = io_blksize (stat_buf);-
641 out_dev = stat_buf.st_dev;-
642 out_ino = stat_buf.st_ino;-
643 out_isreg = S_ISREG (stat_buf.st_mode) != 0;-
644-
645 if (! (number || show_ends || squeeze_blank))
numberDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 1903 times by 1 test
Evaluated by:
  • cat
show_endsDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 1897 times by 1 test
Evaluated by:
  • cat
squeeze_blankDescription
TRUEnever evaluated
FALSEevaluated 1897 times by 1 test
Evaluated by:
  • cat
0-1903
646 {-
647 file_open_mode |= O_BINARY;-
648 xset_binary_mode (STDOUT_FILENO, O_BINARY);-
649 }
executed 1897 times by 1 test: end of block
Executed by:
  • cat
1897
650-
651 /* Check if any of the input files are the same as the output file. */-
652-
653 /* Main loop. */-
654-
655 infile = "-";-
656 argind = optind;-
657-
658 do-
659 {-
660 if (argind < argc)
argind < argcDescription
TRUEevaluated 2231 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 210 times by 1 test
Evaluated by:
  • cat
210-2231
661 infile = argv[argind];
executed 2231 times by 1 test: infile = argv[argind];
Executed by:
  • cat
2231
662-
663 if (STREQ (infile, "-"))
never executed: __result = (((const unsigned char *) (const char *) ( infile ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "-" ))[3] - __s2[3]);
never executed: end of block
executed 211 times by 1 test: end of block
Executed by:
  • cat
( __extension_...)))); }) == 0)Description
TRUEevaluated 211 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 2230 times by 1 test
Evaluated by:
  • cat
__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
TRUEevaluated 2441 times by 1 test
Evaluated by:
  • cat
FALSEnever evaluated
__result == 0Description
TRUEevaluated 211 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 2230 times by 1 test
Evaluated by:
  • cat
__s2_len > 1Description
TRUEnever evaluated
FALSEevaluated 211 times by 1 test
Evaluated by:
  • cat
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-2441
664 {-
665 have_read_stdin = true;-
666 input_desc = STDIN_FILENO;-
667 if (file_open_mode & O_BINARY)
file_open_mode & 0Description
TRUEnever evaluated
FALSEevaluated 211 times by 1 test
Evaluated by:
  • cat
0-211
668 xset_binary_mode (STDIN_FILENO, O_BINARY);
never executed: xset_binary_mode ( 0 , 0 );
0
669 }
executed 211 times by 1 test: end of block
Executed by:
  • cat
211
670 else-
671 {-
672 input_desc = open (infile, file_open_mode);-
673 if (input_desc < 0)
input_desc < 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 2228 times by 1 test
Evaluated by:
  • cat
2-2228
674 {-
675 error (0, errno, "%s", quotef (infile));-
676 ok = false;-
677 continue;
executed 2 times by 1 test: continue;
Executed by:
  • cat
2
678 }-
679 }
executed 2228 times by 1 test: end of block
Executed by:
  • cat
2228
680-
681 if (fstat (input_desc, &stat_buf) < 0)
fstat (input_d...&stat_buf) < 0Description
TRUEnever evaluated
FALSEevaluated 2439 times by 1 test
Evaluated by:
  • cat
0-2439
682 {-
683 error (0, errno, "%s", quotef (infile));-
684 ok = false;-
685 goto contin;
never executed: goto contin;
0
686 }-
687 insize = io_blksize (stat_buf);-
688-
689 fdadvise (input_desc, 0, 0, FADVISE_SEQUENTIAL);-
690-
691 /* Don't copy a nonempty regular file to itself, as that would-
692 merely exhaust the output device. It's better to catch this-
693 error earlier rather than later. */-
694-
695 if (out_isreg
out_isregDescription
TRUEevaluated 1171 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 1268 times by 1 test
Evaluated by:
  • cat
1171-1268
696 && stat_buf.st_dev == out_dev && stat_buf.st_ino == out_ino
stat_buf.st_dev == out_devDescription
TRUEevaluated 1167 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 4 times by 1 test
Evaluated by:
  • cat
stat_buf.st_ino == out_inoDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 1165 times by 1 test
Evaluated by:
  • cat
2-1167
697 && lseek (input_desc, 0, SEEK_CUR) < stat_buf.st_size)
lseek (input_d...at_buf.st_sizeDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cat
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cat
1
698 {-
699 error (0, 0, _("%s: input file is output file"), quotef (infile));-
700 ok = false;-
701 goto contin;
executed 1 time by 1 test: goto contin;
Executed by:
  • cat
1
702 }-
703-
704 /* Select which version of 'cat' to use. If any format-oriented-
705 options were given use 'cat'; otherwise use 'simple_cat'. */-
706-
707 if (! (number || show_ends || show_nonprinting
numberDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 2433 times by 1 test
Evaluated by:
  • cat
show_endsDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 2427 times by 1 test
Evaluated by:
  • cat
show_nonprintingDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cat
FALSEevaluated 2426 times by 1 test
Evaluated by:
  • cat
1-2433
708 || show_tabs || squeeze_blank))
show_tabsDescription
TRUEnever evaluated
FALSEevaluated 2426 times by 1 test
Evaluated by:
  • cat
squeeze_blankDescription
TRUEnever evaluated
FALSEevaluated 2426 times by 1 test
Evaluated by:
  • cat
0-2426
709 {-
710 insize = MAX (insize, outsize);
(( insize )>( outsize ))Description
TRUEnever evaluated
FALSEevaluated 2426 times by 1 test
Evaluated by:
  • cat
0-2426
711 inbuf = xmalloc (insize + page_size - 1);-
712-
713 ok &= simple_cat (ptr_align (inbuf, page_size), insize);-
714 }
executed 2425 times by 1 test: end of block
Executed by:
  • cat
2425
715 else-
716 {-
717 inbuf = xmalloc (insize + 1 + page_size - 1);-
718-
719 /* Why are-
720 (OUTSIZE - 1 + INSIZE * 4 + LINE_COUNTER_BUF_LEN + PAGE_SIZE - 1)-
721 bytes allocated for the output buffer?-
722-
723 A test whether output needs to be written is done when the input-
724 buffer empties or when a newline appears in the input. After-
725 output is written, at most (OUTSIZE - 1) bytes will remain in the-
726 buffer. Now INSIZE bytes of input is read. Each input character-
727 may grow by a factor of 4 (by the prepending of M-^). If all-
728 characters do, and no newlines appear in this block of input, we-
729 will have at most (OUTSIZE - 1 + INSIZE * 4) bytes in the buffer.-
730 If the last character in the preceding block of input was a-
731 newline, a line number may be written (according to the given-
732 options) as the first thing in the output buffer. (Done after the-
733 new input is read, but before processing of the input begins.)-
734 A line number requires seldom more than LINE_COUNTER_BUF_LEN-
735 positions.-
736-
737 Align the output buffer to a page size boundary, for efficiency-
738 on some paging implementations, so add PAGE_SIZE - 1 bytes to the-
739 request to make room for the alignment. */-
740-
741 outbuf = xmalloc (outsize - 1 + insize * 4 + LINE_COUNTER_BUF_LEN-
742 + page_size - 1);-
743-
744 ok &= cat (ptr_align (inbuf, page_size), insize,-
745 ptr_align (outbuf, page_size), outsize, show_nonprinting,-
746 show_tabs, number, number_nonblank, show_ends,-
747 squeeze_blank);-
748-
749 free (outbuf);-
750 }
executed 11 times by 1 test: end of block
Executed by:
  • cat
11
751-
752 free (inbuf);-
753-
754 contin:
code before this statement executed 2436 times by 1 test: contin:
Executed by:
  • cat
2436
755 if (!STREQ (infile, "-") && close (input_desc) < 0)
never executed: __result = (((const unsigned char *) (const char *) ( infile ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "-" ))[3] - __s2[3]);
never executed: end of block
executed 210 times by 1 test: end of block
Executed by:
  • cat
!( __extension...)))); }) == 0)Description
TRUEevaluated 2227 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 210 times by 1 test
Evaluated by:
  • cat
__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
TRUEevaluated 2437 times by 1 test
Evaluated by:
  • cat
FALSEnever evaluated
__result == 0Description
TRUEevaluated 210 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 2227 times by 1 test
Evaluated by:
  • cat
__s2_len > 1Description
TRUEnever evaluated
FALSEevaluated 210 times by 1 test
Evaluated by:
  • cat
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
close (input_desc) < 0Description
TRUEnever evaluated
FALSEevaluated 2227 times by 1 test
Evaluated by:
  • cat
0-2437
756 {-
757 error (0, errno, "%s", quotef (infile));-
758 ok = false;-
759 }
never executed: end of block
0
760 }
executed 2437 times by 1 test: end of block
Executed by:
  • cat
2437
761 while (++argind < argc);
++argind < argcDescription
TRUEevaluated 533 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 1906 times by 1 test
Evaluated by:
  • cat
533-1906
762-
763 if (have_read_stdin && close (STDIN_FILENO) < 0)
have_read_stdinDescription
TRUEevaluated 210 times by 1 test
Evaluated by:
  • cat
FALSEevaluated 1696 times by 1 test
Evaluated by:
  • cat
close ( 0 ) < 0Description
TRUEnever evaluated
FALSEevaluated 210 times by 1 test
Evaluated by:
  • cat
0-1696
764 die (EXIT_FAILURE, errno, _("closing standard input"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"closing standard input\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "closing standard input" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "closing standard input" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
0
765-
766 return ok ? EXIT_SUCCESS : EXIT_FAILURE;
executed 1906 times by 1 test: return ok ? 0 : 1 ;
Executed by:
  • cat
1906
767}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2