.
[coreutils.git] / src / cat.c
blobe5cd91174a73177b767b4e998d47fe153da868d9
1 /* cat -- concatenate files and print on the standard output.
2 Copyright (C) 88, 90, 91, 95, 96, 1997 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 2, or (at your option)
7 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, write to the Free Software Foundation,
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
18 /* Differences from the Unix cat:
19 * Always unbuffered, -u is ignored.
20 * Usually much faster than other versions of cat, the difference
21 is especially apparent when using the -v option.
23 By tege@sics.se, Torbjorn Granlund, advised by rms, Richard Stallman. */
25 #include <config.h>
27 #include <stdio.h>
28 #include <getopt.h>
29 #include <sys/types.h>
30 #ifndef _POSIX_SOURCE
31 # include <sys/ioctl.h>
32 #endif
33 #include "system.h"
34 #include "error.h"
36 /* Undefine, to avoid warning about redefinition on some systems. */
37 #undef max
38 #define max(h,i) ((h) > (i) ? (h) : (i))
40 int full_write ();
41 int safe_read ();
43 /* Name under which this program was invoked. */
44 char *program_name;
46 /* Name of input file. May be "-". */
47 static char *infile;
49 /* Descriptor on which input file is open. */
50 static int input_desc;
52 /* Descriptor on which output file is open. Always is 1. */
53 static int output_desc;
55 /* Buffer for line numbers. */
56 static char line_buf[13] =
57 {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', '\t', '\0'};
59 /* Position in `line_buf' where printing starts. This will not change
60 unless the number of lines is larger than 999999. */
61 static char *line_num_print = line_buf + 5;
63 /* Position of the first digit in `line_buf'. */
64 static char *line_num_start = line_buf + 10;
66 /* Position of the last digit in `line_buf'. */
67 static char *line_num_end = line_buf + 10;
69 /* Preserves the `cat' function's local `newlines' between invocations. */
70 static int newlines2 = 0;
72 /* Count of non-fatal error conditions. */
73 static int exit_status = 0;
75 static void
76 usage (int status)
78 if (status != 0)
79 fprintf (stderr, _("Try `%s --help' for more information.\n"),
80 program_name);
81 else
83 printf (_("\
84 Usage: %s [OPTION] [FILE]...\n\
85 "),
86 program_name);
87 printf (_("\
88 Concatenate FILE(s), or standard input, to standard output.\n\
89 \n\
90 -A, --show-all equivalent to -vET\n\
91 -b, --number-nonblank number nonblank output lines\n\
92 -e equivalent to -vE\n\
93 -E, --show-ends display $ at end of each line\n\
94 -n, --number number all output lines\n\
95 -s, --squeeze-blank never more than one single blank line\n\
96 -t equivalent to -vT\n\
97 -T, --show-tabs display TAB characters as ^I\n\
98 -u (ignored)\n\
99 -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB\n\
100 --help display this help and exit\n\
101 --version output version information and exit\n\
103 With no FILE, or when FILE is -, read standard input.\n\
104 "));
105 puts (_("\nReport bugs to <textutils-bugs@gnu.org>."));
107 exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
110 /* Compute the next line number. */
112 static void
113 next_line_num (void)
115 char *endp = line_num_end;
118 if ((*endp)++ < '9')
119 return;
120 *endp-- = '0';
122 while (endp >= line_num_start);
123 *--line_num_start = '1';
124 if (line_num_start < line_num_print)
125 line_num_print--;
128 /* Plain cat. Copies the file behind `input_desc' to the file behind
129 `output_desc'. */
131 static void
132 simple_cat (
133 /* Pointer to the buffer, used by reads and writes. */
134 unsigned char *buf,
136 /* Number of characters preferably read or written by each read and write
137 call. */
138 int bufsize)
140 /* Actual number of characters read, and therefore written. */
141 int n_read;
143 /* Loop until the end of the file. */
145 for (;;)
147 /* Read a block of input. */
149 n_read = safe_read (input_desc, buf, bufsize);
150 if (n_read < 0)
152 error (0, errno, "%s", infile);
153 exit_status = 1;
154 return;
157 /* End of this file? */
159 if (n_read == 0)
160 break;
162 /* Write this block out. */
164 if (full_write (output_desc, buf, n_read) < 0)
165 error (EXIT_FAILURE, errno, _("write error"));
169 /* Cat the file behind INPUT_DESC to the file behind OUTPUT_DESC.
170 Called if any option more than -u was specified.
172 A newline character is always put at the end of the buffer, to make
173 an explicit test for buffer end unnecessary. */
175 static void
176 cat (
177 /* Pointer to the beginning of the input buffer. */
178 unsigned char *inbuf,
180 /* Number of characters read in each read call. */
181 int insize,
183 /* Pointer to the beginning of the output buffer. */
184 unsigned char *outbuf,
186 /* Number of characters written by each write call. */
187 int outsize,
189 /* Variables that have values according to the specified options. */
190 int quote,
191 int output_tabs,
192 int numbers,
193 int numbers_at_empty_lines,
194 int mark_line_ends,
195 int squeeze_empty_lines)
197 /* Last character read from the input buffer. */
198 unsigned char ch;
200 /* Pointer to the next character in the input buffer. */
201 unsigned char *bpin;
203 /* Pointer to the first non-valid byte in the input buffer, i.e. the
204 current end of the buffer. */
205 unsigned char *eob;
207 /* Pointer to the position where the next character shall be written. */
208 unsigned char *bpout;
210 /* Number of characters read by the last read call. */
211 int n_read;
213 /* Determines how many consecutive newlines there have been in the
214 input. 0 newlines makes NEWLINES -1, 1 newline makes NEWLINES 1,
215 etc. Initially 0 to indicate that we are at the beginning of a
216 new line. The "state" of the procedure is determined by
217 NEWLINES. */
218 int newlines = newlines2;
220 #ifdef FIONREAD
221 /* If nonzero, use the FIONREAD ioctl, as an optimization.
222 (On Ultrix, it is not supported on NFS filesystems.) */
223 int use_fionread = 1;
224 #endif
226 /* The inbuf pointers are initialized so that BPIN > EOB, and thereby input
227 is read immediately. */
229 eob = inbuf;
230 bpin = eob + 1;
232 bpout = outbuf;
234 for (;;)
238 /* Write if there are at least OUTSIZE bytes in OUTBUF. */
240 if (bpout - outbuf >= outsize)
242 unsigned char *wp = outbuf;
245 if (full_write (output_desc, wp, outsize) < 0)
246 error (EXIT_FAILURE, errno, _("write error"));
247 wp += outsize;
249 while (bpout - wp >= outsize);
251 /* Move the remaining bytes to the beginning of the
252 buffer. */
254 memmove (outbuf, wp, bpout - wp);
255 bpout = outbuf + (bpout - wp);
258 /* Is INBUF empty? */
260 if (bpin > eob)
262 #ifdef FIONREAD
263 int n_to_read = 0;
265 /* Is there any input to read immediately?
266 If not, we are about to wait,
267 so write all buffered output before waiting. */
269 if (use_fionread
270 && ioctl (input_desc, FIONREAD, &n_to_read) < 0)
272 /* Ultrix returns EOPNOTSUPP on NFS;
273 HP-UX returns ENOTTY on pipes.
274 SunOS returns EINVAL and
275 More/BSD returns ENODEV on special files
276 like /dev/null.
277 Irix-5 returns ENOSYS on pipes. */
278 if (errno == EOPNOTSUPP || errno == ENOTTY
279 || errno == EINVAL || errno == ENODEV
280 # ifdef ENOSYS
281 || errno == ENOSYS
282 # endif
284 use_fionread = 0;
285 else
287 error (0, errno, _("cannot do ioctl on `%s'"), infile);
288 exit_status = 1;
289 newlines2 = newlines;
290 return;
293 if (n_to_read == 0)
294 #endif
296 int n_write = bpout - outbuf;
298 if (full_write (output_desc, outbuf, n_write) < 0)
299 error (EXIT_FAILURE, errno, _("write error"));
300 bpout = outbuf;
303 /* Read more input into INBUF. */
305 n_read = safe_read (input_desc, inbuf, insize);
306 if (n_read < 0)
308 error (0, errno, "%s", infile);
309 exit_status = 1;
310 newlines2 = newlines;
311 return;
313 if (n_read == 0)
315 newlines2 = newlines;
316 return;
319 /* Update the pointers and insert a sentinel at the buffer
320 end. */
322 bpin = inbuf;
323 eob = bpin + n_read;
324 *eob = '\n';
326 else
328 /* It was a real (not a sentinel) newline. */
330 /* Was the last line empty?
331 (i.e. have two or more consecutive newlines been read?) */
333 if (++newlines > 0)
335 /* Are multiple adjacent empty lines to be substituted by
336 single ditto (-s), and this was the second empty line? */
338 if (squeeze_empty_lines && newlines >= 2)
340 ch = *bpin++;
341 continue;
344 /* Are line numbers to be written at empty lines (-n)? */
346 if (numbers && numbers_at_empty_lines)
348 next_line_num ();
349 bpout = (unsigned char *) stpcpy ((char *) bpout,
350 line_num_print);
354 /* Output a currency symbol if requested (-e). */
356 if (mark_line_ends)
357 *bpout++ = '$';
359 /* Output the newline. */
361 *bpout++ = '\n';
363 ch = *bpin++;
365 while (ch == '\n');
367 /* Are we at the beginning of a line, and line numbers are requested? */
369 if (newlines >= 0 && numbers)
371 next_line_num ();
372 bpout = (unsigned char *) stpcpy ((char *) bpout, line_num_print);
375 /* Here CH cannot contain a newline character. */
377 /* The loops below continue until a newline character is found,
378 which means that the buffer is empty or that a proper newline
379 has been found. */
381 /* If quoting, i.e. at least one of -v, -e, or -t specified,
382 scan for chars that need conversion. */
383 if (quote)
384 for (;;)
386 if (ch >= 32)
388 if (ch < 127)
389 *bpout++ = ch;
390 else if (ch == 127)
391 *bpout++ = '^',
392 *bpout++ = '?';
393 else
395 *bpout++ = 'M',
396 *bpout++ = '-';
397 if (ch >= 128 + 32)
398 if (ch < 128 + 127)
399 *bpout++ = ch - 128;
400 else
401 *bpout++ = '^',
402 *bpout++ = '?';
403 else
404 *bpout++ = '^',
405 *bpout++ = ch - 128 + 64;
408 else if (ch == '\t' && output_tabs)
409 *bpout++ = '\t';
410 else if (ch == '\n')
412 newlines = -1;
413 break;
415 else
416 *bpout++ = '^',
417 *bpout++ = ch + 64;
419 ch = *bpin++;
421 else
422 /* Not quoting, neither of -v, -e, or -t specified. */
423 for (;;)
425 if (ch == '\t' && !output_tabs)
426 *bpout++ = '^',
427 *bpout++ = ch + 64;
428 else if (ch != '\n')
429 *bpout++ = ch;
430 else
432 newlines = -1;
433 break;
436 ch = *bpin++;
442 main (int argc, char **argv)
444 /* Optimal size of i/o operations of output. */
445 int outsize;
447 /* Optimal size of i/o operations of input. */
448 int insize;
450 /* Pointer to the input buffer. */
451 unsigned char *inbuf;
453 /* Pointer to the output buffer. */
454 unsigned char *outbuf;
456 int c;
458 /* Index in argv to processed argument. */
459 int argind;
461 /* Device number of the output (file or whatever). */
462 int out_dev;
464 /* I-node number of the output. */
465 int out_ino;
467 /* Nonzero if the output file should not be the same as any input file. */
468 int check_redirection = 1;
470 /* Nonzero if we have ever read standard input. */
471 int have_read_stdin = 0;
473 struct stat stat_buf;
475 /* Variables that are set according to the specified options. */
476 int numbers = 0;
477 int numbers_at_empty_lines = 1;
478 int squeeze_empty_lines = 0;
479 int mark_line_ends = 0;
480 int quote = 0;
481 int output_tabs = 1;
483 /* If nonzero, call cat, otherwise call simple_cat to do the actual work. */
484 int options = 0;
486 /* If nonzero, display usage information and exit. */
487 static int show_help;
489 /* If nonzero, print the version on standard output then exit. */
490 static int show_version;
492 static struct option const long_options[] =
494 {"number-nonblank", no_argument, NULL, 'b'},
495 {"number", no_argument, NULL, 'n'},
496 {"squeeze-blank", no_argument, NULL, 's'},
497 {"show-nonprinting", no_argument, NULL, 'v'},
498 {"show-ends", no_argument, NULL, 'E'},
499 {"show-tabs", no_argument, NULL, 'T'},
500 {"show-all", no_argument, NULL, 'A'},
501 {"help", no_argument, &show_help, 1},
502 {"version", no_argument, &show_version, 1},
503 {NULL, 0, NULL, 0}
506 program_name = argv[0];
507 setlocale (LC_ALL, "");
508 bindtextdomain (PACKAGE, LOCALEDIR);
509 textdomain (PACKAGE);
511 /* Parse command line options. */
513 while ((c = getopt_long (argc, argv, "benstuvAET", long_options, NULL)) != -1)
515 switch (c)
517 case 0:
518 break;
520 case 'b':
521 ++options;
522 numbers = 1;
523 numbers_at_empty_lines = 0;
524 break;
526 case 'e':
527 ++options;
528 mark_line_ends = 1;
529 quote = 1;
530 break;
532 case 'n':
533 ++options;
534 numbers = 1;
535 break;
537 case 's':
538 ++options;
539 squeeze_empty_lines = 1;
540 break;
542 case 't':
543 ++options;
544 output_tabs = 0;
545 quote = 1;
546 break;
548 case 'u':
549 /* We provide the -u feature unconditionally. */
550 break;
552 case 'v':
553 ++options;
554 quote = 1;
555 break;
557 case 'A':
558 ++options;
559 quote = 1;
560 mark_line_ends = 1;
561 output_tabs = 0;
562 break;
564 case 'E':
565 ++options;
566 mark_line_ends = 1;
567 break;
569 case 'T':
570 ++options;
571 output_tabs = 0;
572 break;
574 default:
575 usage (EXIT_FAILURE);
579 if (show_version)
581 printf ("cat (%s) %s\n", GNU_PACKAGE, VERSION);
582 exit (EXIT_SUCCESS);
585 if (show_help)
586 usage (0);
588 output_desc = 1;
590 /* Get device, i-node number, and optimal blocksize of output. */
592 if (fstat (output_desc, &stat_buf) < 0)
593 error (EXIT_FAILURE, errno, _("standard output"));
595 outsize = ST_BLKSIZE (stat_buf);
596 /* Input file can be output file for non-regular files.
597 fstat on pipes returns S_IFSOCK on some systems, S_IFIFO
598 on others, so the checking should not be done for those types,
599 and to allow things like cat < /dev/tty > /dev/tty, checking
600 is not done for device files either. */
602 if (S_ISREG (stat_buf.st_mode))
604 out_dev = stat_buf.st_dev;
605 out_ino = stat_buf.st_ino;
607 else
609 check_redirection = 0;
610 #ifdef lint /* Suppress `used before initialized' warning. */
611 out_dev = 0;
612 out_ino = 0;
613 #endif
616 /* Check if any of the input files are the same as the output file. */
618 /* Main loop. */
620 infile = "-";
621 argind = optind;
625 if (argind < argc)
626 infile = argv[argind];
628 if (infile[0] == '-' && infile[1] == 0)
630 have_read_stdin = 1;
631 input_desc = 0;
633 else
635 input_desc = open (infile, O_RDONLY);
636 if (input_desc < 0)
638 error (0, errno, "%s", infile);
639 exit_status = 1;
640 continue;
644 if (fstat (input_desc, &stat_buf) < 0)
646 error (0, errno, "%s", infile);
647 exit_status = 1;
648 goto contin;
650 insize = ST_BLKSIZE (stat_buf);
652 /* Compare the device and i-node numbers of this input file with
653 the corresponding values of the (output file associated with)
654 stdout, and skip this input file if they coincide. Input
655 files cannot be redirected to themselves. */
657 if (check_redirection
658 && stat_buf.st_dev == out_dev && stat_buf.st_ino == out_ino
659 && (input_desc != STDIN_FILENO || output_desc != STDOUT_FILENO))
661 error (0, 0, _("%s: input file is output file"), infile);
662 exit_status = 1;
663 goto contin;
666 /* Select which version of `cat' to use. If any options (more than -u,
667 --version, or --help) were specified, use `cat', otherwise use
668 `simple_cat'. */
670 if (options == 0)
672 insize = max (insize, outsize);
673 inbuf = (unsigned char *) xmalloc (insize);
675 simple_cat (inbuf, insize);
677 else
679 inbuf = (unsigned char *) xmalloc (insize + 1);
681 /* Why are (OUTSIZE - 1 + INSIZE * 4 + 13) bytes allocated for
682 the output buffer?
684 A test whether output needs to be written is done when the input
685 buffer empties or when a newline appears in the input. After
686 output is written, at most (OUTSIZE - 1) bytes will remain in the
687 buffer. Now INSIZE bytes of input is read. Each input character
688 may grow by a factor of 4 (by the prepending of M-^). If all
689 characters do, and no newlines appear in this block of input, we
690 will have at most (OUTSIZE - 1 + INSIZE) bytes in the buffer. If
691 the last character in the preceding block of input was a
692 newline, a line number may be written (according to the given
693 options) as the first thing in the output buffer. (Done after the
694 new input is read, but before processing of the input begins.) A
695 line number requires seldom more than 13 positions. */
697 outbuf = (unsigned char *) xmalloc (outsize - 1 + insize * 4 + 13);
699 cat (inbuf, insize, outbuf, outsize, quote,
700 output_tabs, numbers, numbers_at_empty_lines, mark_line_ends,
701 squeeze_empty_lines);
703 free (outbuf);
706 free (inbuf);
708 contin:
709 if (strcmp (infile, "-") && close (input_desc) < 0)
711 error (0, errno, "%s", infile);
712 exit_status = 1;
715 while (++argind < argc);
717 if (have_read_stdin && close (0) < 0)
718 error (EXIT_FAILURE, errno, "-");
719 if (close (1) < 0)
720 error (EXIT_FAILURE, errno, _("write error"));
722 exit (exit_status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);