1 /* cat -- concatenate files and print on the standard output.
2 Copyright (C) 1988-2016 Free Software Foundation, Inc.
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.
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.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
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.
22 By tege@sics.se, Torbjorn Granlund, advised by rms, Richard Stallman. */
28 #include <sys/types.h>
33 #include <sys/ioctl.h>
36 #include "ioblksize.h"
40 #include "full-write.h"
41 #include "safe-read.h"
44 /* The official name of this program (e.g., no 'g' prefix). */
45 #define PROGRAM_NAME "cat"
48 proper_name ("Torbjorn Granlund"), \
49 proper_name ("Richard M. Stallman")
51 /* Name of input file. May be "-". */
52 static char const *infile
;
54 /* Descriptor on which input file is open. */
55 static int input_desc
;
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
61 static char line_buf
[LINE_COUNTER_BUF_LEN
] =
63 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
64 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0',
68 /* Position in 'line_buf' where printing starts. This will not change
69 unless the number of lines is larger than 999999. */
70 static char *line_num_print
= line_buf
+ LINE_COUNTER_BUF_LEN
- 8;
72 /* Position of the first digit in 'line_buf'. */
73 static char *line_num_start
= line_buf
+ LINE_COUNTER_BUF_LEN
- 3;
75 /* Position of the last digit in 'line_buf'. */
76 static char *line_num_end
= line_buf
+ LINE_COUNTER_BUF_LEN
- 3;
78 /* Preserves the 'cat' function's local 'newlines' between invocations. */
79 static int newlines2
= 0;
84 if (status
!= EXIT_SUCCESS
)
89 Usage: %s [OPTION]... [FILE]...\n\
93 Concatenate FILE(s) to standard output.\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\
108 -t equivalent to -vT\n\
109 -T, --show-tabs display TAB characters as ^I\n\
111 -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB\n\
113 fputs (HELP_OPTION_DESCRIPTION
, stdout
);
114 fputs (VERSION_OPTION_DESCRIPTION
, stdout
);
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\
121 program_name
, program_name
);
122 emit_ancillary_info (PROGRAM_NAME
);
127 /* Compute the next line number. */
132 char *endp
= line_num_end
;
139 while (endp
>= line_num_start
);
140 if (line_num_start
> line_buf
)
141 *--line_num_start
= '1';
144 if (line_num_start
< line_num_print
)
148 /* Plain cat. Copies the file behind 'input_desc' to STDOUT_FILENO.
149 Return true if successful. */
153 /* Pointer to the buffer, used by reads and writes. */
156 /* Number of characters preferably read or written by each read and write
160 /* Actual number of characters read, and therefore written. */
163 /* Loop until the end of the file. */
167 /* Read a block of input. */
169 n_read
= safe_read (input_desc
, buf
, bufsize
);
170 if (n_read
== SAFE_READ_ERROR
)
172 error (0, errno
, "%s", quotef (infile
));
176 /* End of this file? */
181 /* Write this block out. */
184 /* The following is ok, since we know that 0 < n_read. */
186 if (full_write (STDOUT_FILENO
, buf
, n
) != n
)
187 die (EXIT_FAILURE
, errno
, _("write error"));
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. */
197 write_pending (char *outbuf
, char **bpout
)
199 size_t n_write
= *bpout
- outbuf
;
202 if (full_write (STDOUT_FILENO
, outbuf
, n_write
) != n_write
)
203 die (EXIT_FAILURE
, errno
, _("write error"));
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.
212 A newline character is always put at the end of the buffer, to make
213 an explicit test for buffer end unnecessary. */
217 /* Pointer to the beginning of the input buffer. */
220 /* Number of characters read in each read call. */
223 /* Pointer to the beginning of the output buffer. */
226 /* Number of characters written by each write call. */
229 /* Variables that have values according to the specified options. */
230 bool show_nonprinting
,
233 bool number_nonblank
,
237 /* Last character read from the input buffer. */
240 /* Pointer to the next character in the input buffer. */
243 /* Pointer to the first non-valid byte in the input buffer, i.e., the
244 current end of the buffer. */
247 /* Pointer to the position where the next character shall be written. */
250 /* Number of characters read by the last read call. */
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
258 int newlines
= newlines2
;
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;
266 /* The inbuf pointers are initialized so that BPIN > EOB, and thereby input
267 is read immediately. */
278 /* Write if there are at least OUTSIZE bytes in OUTBUF. */
280 if (outbuf
+ outsize
<= bpout
)
283 size_t remaining_bytes
;
286 if (full_write (STDOUT_FILENO
, wp
, outsize
) != outsize
)
287 die (EXIT_FAILURE
, errno
, _("write error"));
289 remaining_bytes
= bpout
- wp
;
291 while (outsize
<= remaining_bytes
);
293 /* Move the remaining bytes to the beginning of the
296 memmove (outbuf
, wp
, remaining_bytes
);
297 bpout
= outbuf
+ remaining_bytes
;
300 /* Is INBUF empty? */
304 bool input_pending
= false;
308 /* Is there any input to read immediately?
309 If not, we are about to wait,
310 so write all buffered output before waiting. */
313 && ioctl (input_desc
, FIONREAD
, &n_to_read
) < 0)
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
320 Irix-5 returns ENOSYS on pipes. */
321 if (errno
== EOPNOTSUPP
|| errno
== ENOTTY
322 || errno
== EINVAL
|| errno
== ENODEV
324 use_fionread
= false;
327 error (0, errno
, _("cannot do ioctl on %s"),
329 newlines2
= newlines
;
334 input_pending
= true;
338 write_pending (outbuf
, &bpout
);
340 /* Read more input into INBUF. */
342 n_read
= safe_read (input_desc
, inbuf
, insize
);
343 if (n_read
== SAFE_READ_ERROR
)
345 error (0, errno
, "%s", quotef (infile
));
346 write_pending (outbuf
, &bpout
);
347 newlines2
= newlines
;
352 write_pending (outbuf
, &bpout
);
353 newlines2
= newlines
;
357 /* Update the pointers and insert a sentinel at the buffer
366 /* It was a real (not a sentinel) newline. */
368 /* Was the last line empty?
369 (i.e., have two or more consecutive newlines been read?) */
375 /* Limit this to 2 here. Otherwise, with lots of
376 consecutive newlines, the counter could wrap
377 around at INT_MAX. */
380 /* Are multiple adjacent empty lines to be substituted
381 by single ditto (-s), and this was the second empty
390 /* Are line numbers to be written at empty lines (-n)? */
392 if (number
&& !number_nonblank
)
395 bpout
= stpcpy (bpout
, line_num_print
);
399 /* Output a currency symbol if requested (-e). */
404 /* Output the newline. */
412 /* Are we at the beginning of a line, and line numbers are requested? */
414 if (newlines
>= 0 && number
)
417 bpout
= stpcpy (bpout
, line_num_print
);
420 /* Here CH cannot contain a newline character. */
422 /* The loops below continue until a newline character is found,
423 which means that the buffer is empty or that a proper newline
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
)
458 *bpout
++ = ch
- 128 + 64;
462 else if (ch
== '\t' && !show_tabs
)
480 /* Not quoting, neither of -v, -e, or -t specified. */
483 if (ch
== '\t' && show_tabs
)
503 main (int argc
, char **argv
)
505 /* Optimal size of i/o operations of output. */
508 /* Optimal size of i/o operations of input. */
511 size_t page_size
= getpagesize ();
513 /* Pointer to the input buffer. */
516 /* Pointer to the output buffer. */
522 /* Index in argv to processed argument. */
525 /* Device number of the output (file or whatever). */
528 /* I-node number of the output. */
531 /* True if the output is a regular file. */
534 /* Nonzero if we have ever read standard input. */
535 bool have_read_stdin
= false;
537 struct stat stat_buf
;
539 /* Variables that are set according to the specified options. */
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
;
548 static struct option
const long_options
[] =
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
},
562 initialize_main (&argc
, &argv
);
563 set_program_name (argv
[0]);
564 setlocale (LC_ALL
, "");
565 bindtextdomain (PACKAGE
, LOCALEDIR
);
566 textdomain (PACKAGE
);
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
);
574 /* Parse command line options. */
576 while ((c
= getopt_long (argc
, argv
, "benstuvAET", long_options
, NULL
))
583 number_nonblank
= true;
588 show_nonprinting
= true;
596 squeeze_blank
= true;
601 show_nonprinting
= true;
605 /* We provide the -u feature unconditionally. */
609 show_nonprinting
= true;
613 show_nonprinting
= true;
626 case_GETOPT_HELP_CHAR
;
628 case_GETOPT_VERSION_CHAR (PROGRAM_NAME
, AUTHORS
);
631 usage (EXIT_FAILURE
);
635 /* Get device, i-node number, and optimal blocksize of output. */
637 if (fstat (STDOUT_FILENO
, &stat_buf
) < 0)
638 die (EXIT_FAILURE
, errno
, _("standard output"));
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;
645 if (! (number
|| show_ends
|| squeeze_blank
))
647 file_open_mode
|= O_BINARY
;
648 if (O_BINARY
&& ! isatty (STDOUT_FILENO
))
649 xfreopen (NULL
, "wb", stdout
);
652 /* Check if any of the input files are the same as the output file. */
662 infile
= argv
[argind
];
664 if (STREQ (infile
, "-"))
666 have_read_stdin
= true;
667 input_desc
= STDIN_FILENO
;
668 if ((file_open_mode
& O_BINARY
) && ! isatty (STDIN_FILENO
))
669 xfreopen (NULL
, "rb", stdin
);
673 input_desc
= open (infile
, file_open_mode
);
676 error (0, errno
, "%s", quotef (infile
));
682 if (fstat (input_desc
, &stat_buf
) < 0)
684 error (0, errno
, "%s", quotef (infile
));
688 insize
= io_blksize (stat_buf
);
690 fdadvise (input_desc
, 0, 0, FADVISE_SEQUENTIAL
);
692 /* Don't copy a nonempty regular file to itself, as that would
693 merely exhaust the output device. It's better to catch this
694 error earlier rather than later. */
697 && stat_buf
.st_dev
== out_dev
&& stat_buf
.st_ino
== out_ino
698 && lseek (input_desc
, 0, SEEK_CUR
) < stat_buf
.st_size
)
700 error (0, 0, _("%s: input file is output file"), quotef (infile
));
705 /* Select which version of 'cat' to use. If any format-oriented
706 options were given use 'cat'; otherwise use 'simple_cat'. */
708 if (! (number
|| show_ends
|| show_nonprinting
709 || show_tabs
|| squeeze_blank
))
711 insize
= MAX (insize
, outsize
);
712 inbuf
= xmalloc (insize
+ page_size
- 1);
714 ok
&= simple_cat (ptr_align (inbuf
, page_size
), insize
);
718 inbuf
= xmalloc (insize
+ 1 + page_size
- 1);
721 (OUTSIZE - 1 + INSIZE * 4 + LINE_COUNTER_BUF_LEN + PAGE_SIZE - 1)
722 bytes allocated for the output buffer?
724 A test whether output needs to be written is done when the input
725 buffer empties or when a newline appears in the input. After
726 output is written, at most (OUTSIZE - 1) bytes will remain in the
727 buffer. Now INSIZE bytes of input is read. Each input character
728 may grow by a factor of 4 (by the prepending of M-^). If all
729 characters do, and no newlines appear in this block of input, we
730 will have at most (OUTSIZE - 1 + INSIZE * 4) bytes in the buffer.
731 If the last character in the preceding block of input was a
732 newline, a line number may be written (according to the given
733 options) as the first thing in the output buffer. (Done after the
734 new input is read, but before processing of the input begins.)
735 A line number requires seldom more than LINE_COUNTER_BUF_LEN
738 Align the output buffer to a page size boundary, for efficiency
739 on some paging implementations, so add PAGE_SIZE - 1 bytes to the
740 request to make room for the alignment. */
742 outbuf
= xmalloc (outsize
- 1 + insize
* 4 + LINE_COUNTER_BUF_LEN
745 ok
&= cat (ptr_align (inbuf
, page_size
), insize
,
746 ptr_align (outbuf
, page_size
), outsize
, show_nonprinting
,
747 show_tabs
, number
, number_nonblank
, show_ends
,
756 if (!STREQ (infile
, "-") && close (input_desc
) < 0)
758 error (0, errno
, "%s", quotef (infile
));
762 while (++argind
< argc
);
764 if (have_read_stdin
&& close (STDIN_FILENO
) < 0)
765 die (EXIT_FAILURE
, errno
, _("closing standard input"));
767 return ok
? EXIT_SUCCESS
: EXIT_FAILURE
;