1 /* head -- output first part of file(s)
2 Copyright (C) 1989-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 /* Options: (see usage)
18 Reads from standard input if no files are given or when a filename of
20 By default, filename headers are printed only if more than one file
22 By default, prints the first 10 lines (head -n 10).
24 David MacKenzie <djm@gnu.ai.mit.edu> */
30 #include <sys/types.h>
36 #include "full-read.h"
38 #include "safe-read.h"
39 #include "stat-size.h"
41 #include "xdectoint.h"
43 /* The official name of this program (e.g., no 'g' prefix). */
44 #define PROGRAM_NAME "head"
47 proper_name ("David MacKenzie"), \
48 proper_name ("Jim Meyering")
50 /* Number of lines/chars/blocks to head. */
51 #define DEFAULT_NUMBER 10
53 /* Useful only when eliding tail bytes or lines.
54 If true, skip the is-regular-file test used to determine whether
55 to use the lseek optimization. Instead, use the more general (and
56 more expensive) code unconditionally. Intended solely for testing. */
57 static bool presume_input_pipe
;
59 /* If true, print filename headers. */
60 static bool print_headers
;
62 /* Character to split lines by. */
65 /* When to print the filename banners. */
68 multiple_files
, always
, never
71 /* Have we ever read standard input? */
72 static bool have_read_stdin
;
78 COPY_FD_UNEXPECTED_EOF
81 /* For long options that have no equivalent short option, use a
82 non-character as a pseudo short option, starting with CHAR_MAX + 1. */
85 PRESUME_INPUT_PIPE_OPTION
= CHAR_MAX
+ 1
88 static struct option
const long_options
[] =
90 {"bytes", required_argument
, NULL
, 'c'},
91 {"lines", required_argument
, NULL
, 'n'},
92 {"-presume-input-pipe", no_argument
, NULL
,
93 PRESUME_INPUT_PIPE_OPTION
}, /* do not document */
94 {"quiet", no_argument
, NULL
, 'q'},
95 {"silent", no_argument
, NULL
, 'q'},
96 {"verbose", no_argument
, NULL
, 'v'},
97 {"zero-terminated", no_argument
, NULL
, 'z'},
98 {GETOPT_HELP_OPTION_DECL
},
99 {GETOPT_VERSION_OPTION_DECL
},
106 if (status
!= EXIT_SUCCESS
)
111 Usage: %s [OPTION]... [FILE]...\n\
115 Print the first %d lines of each FILE to standard output.\n\
116 With more than one FILE, precede each with a header giving the file name.\n\
120 emit_mandatory_arg_note ();
123 -c, --bytes=[-]NUM print the first NUM bytes of each file;\n\
124 with the leading '-', print all but the last\n\
125 NUM bytes of each file\n\
126 -n, --lines=[-]NUM print the first NUM lines instead of the first %d;\n\
127 with the leading '-', print all but the last\n\
128 NUM lines of each file\n\
131 -q, --quiet, --silent never print headers giving file names\n\
132 -v, --verbose always print headers giving file names\n\
135 -z, --zero-terminated line delimiter is NUL, not newline\n\
137 fputs (HELP_OPTION_DESCRIPTION
, stdout
);
138 fputs (VERSION_OPTION_DESCRIPTION
, stdout
);
141 NUM may have a multiplier suffix:\n\
142 b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,\n\
143 GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.\n\
145 emit_ancillary_info (PROGRAM_NAME
);
151 diagnose_copy_fd_failure (enum Copy_fd_status err
, char const *filename
)
155 case COPY_FD_READ_ERROR
:
156 error (0, errno
, _("error reading %s"), quoteaf (filename
));
158 case COPY_FD_UNEXPECTED_EOF
:
159 error (0, errno
, _("%s: file has shrunk too much"), quotef (filename
));
167 write_header (const char *filename
)
169 static bool first_file
= true;
171 printf ("%s==> %s <==\n", (first_file
? "" : "\n"), filename
);
175 /* Write N_BYTES from BUFFER to stdout.
176 Exit immediately on error with a single diagnostic. */
179 xwrite_stdout (char const *buffer
, size_t n_bytes
)
181 if (n_bytes
> 0 && fwrite (buffer
, 1, n_bytes
, stdout
) < n_bytes
)
183 clearerr (stdout
); /* To avoid redundant close_stdout diagnostic. */
184 die (EXIT_FAILURE
, errno
, _("error writing %s"),
185 quoteaf ("standard output"));
189 /* Copy no more than N_BYTES from file descriptor SRC_FD to stdout.
190 Return an appropriate indication of success or read failure. */
192 static enum Copy_fd_status
193 copy_fd (int src_fd
, uintmax_t n_bytes
)
196 const size_t buf_size
= sizeof (buf
);
198 /* Copy the file contents. */
201 size_t n_to_read
= MIN (buf_size
, n_bytes
);
202 size_t n_read
= safe_read (src_fd
, buf
, n_to_read
);
203 if (n_read
== SAFE_READ_ERROR
)
204 return COPY_FD_READ_ERROR
;
208 if (n_read
== 0 && n_bytes
!= 0)
209 return COPY_FD_UNEXPECTED_EOF
;
211 xwrite_stdout (buf
, n_read
);
217 /* Call lseek (FD, OFFSET, WHENCE), where file descriptor FD
218 corresponds to the file FILENAME. WHENCE must be SEEK_SET or
219 SEEK_CUR. Return the resulting offset. Give a diagnostic and
220 return -1 if lseek fails. */
223 elseek (int fd
, off_t offset
, int whence
, char const *filename
)
225 off_t new_offset
= lseek (fd
, offset
, whence
);
226 char buf
[INT_BUFSIZE_BOUND (offset
)];
231 ? N_("%s: cannot seek to offset %s")
232 : N_("%s: cannot seek to relative offset %s")),
234 offtostr (offset
, buf
));
239 /* For an input file with name FILENAME and descriptor FD,
240 output all but the last N_ELIDE_0 bytes.
241 If CURRENT_POS is nonnegative, assume that the input file is
242 positioned at CURRENT_POS and that it should be repositioned to
243 just before the elided bytes before returning.
244 Return true upon success.
245 Give a diagnostic and return false upon error. */
247 elide_tail_bytes_pipe (const char *filename
, int fd
, uintmax_t n_elide_0
,
250 size_t n_elide
= n_elide_0
;
251 uintmax_t desired_pos
= current_pos
;
254 #ifndef HEAD_TAIL_PIPE_READ_BUFSIZE
255 # define HEAD_TAIL_PIPE_READ_BUFSIZE BUFSIZ
257 #define READ_BUFSIZE HEAD_TAIL_PIPE_READ_BUFSIZE
259 /* If we're eliding no more than this many bytes, then it's ok to allocate
260 more memory in order to use a more time-efficient algorithm.
261 FIXME: use a fraction of available memory instead, as in sort.
262 FIXME: is this even worthwhile? */
263 #ifndef HEAD_TAIL_PIPE_BYTECOUNT_THRESHOLD
264 # define HEAD_TAIL_PIPE_BYTECOUNT_THRESHOLD 1024 * 1024
267 #if HEAD_TAIL_PIPE_BYTECOUNT_THRESHOLD < 2 * READ_BUFSIZE
268 "HEAD_TAIL_PIPE_BYTECOUNT_THRESHOLD must be at least 2 * READ_BUFSIZE"
271 if (SIZE_MAX
< n_elide_0
+ READ_BUFSIZE
)
273 char umax_buf
[INT_BUFSIZE_BOUND (n_elide_0
)];
274 die (EXIT_FAILURE
, 0, _("%s: number of bytes is too large"),
275 umaxtostr (n_elide_0
, umax_buf
));
278 /* Two cases to consider...
279 1) n_elide is small enough that we can afford to double-buffer:
280 allocate 2 * (READ_BUFSIZE + n_elide) bytes
281 2) n_elide is too big for that, so we allocate only
282 (READ_BUFSIZE + n_elide) bytes
284 FIXME: profile, to see if double-buffering is worthwhile
286 CAUTION: do not fail (out of memory) when asked to elide
287 a ridiculous amount, but when given only a small input. */
289 if (n_elide
<= HEAD_TAIL_PIPE_BYTECOUNT_THRESHOLD
)
293 size_t n_to_read
= READ_BUFSIZE
+ n_elide
;
296 b
[0] = xnmalloc (2, n_to_read
);
297 b
[1] = b
[0] + n_to_read
;
299 for (i
= false; ! eof
; i
= !i
)
301 size_t n_read
= full_read (fd
, b
[i
], n_to_read
);
303 if (n_read
< n_to_read
)
307 error (0, errno
, _("error reading %s"), quoteaf (filename
));
313 if (n_read
<= n_elide
)
317 /* The input is no larger than the number of bytes
318 to elide. So there's nothing to output, and
323 delta
= n_elide
- n_read
;
329 /* Output any (but maybe just part of the) elided data from
330 the previous round. */
333 desired_pos
+= n_elide
- delta
;
334 xwrite_stdout (b
[!i
] + READ_BUFSIZE
, n_elide
- delta
);
338 if (n_elide
< n_read
)
340 desired_pos
+= n_read
- n_elide
;
341 xwrite_stdout (b
[i
], n_read
- n_elide
);
349 /* Read blocks of size READ_BUFSIZE, until we've read at least n_elide
350 bytes. Then, for each new buffer we read, also write an old one. */
354 bool buffered_enough
;
357 /* Round n_elide up to a multiple of READ_BUFSIZE. */
358 size_t rem
= READ_BUFSIZE
- (n_elide
% READ_BUFSIZE
);
359 size_t n_elide_round
= n_elide
+ rem
;
360 size_t n_bufs
= n_elide_round
/ READ_BUFSIZE
+ 1;
362 size_t n_array_alloc
= 0;
364 buffered_enough
= false;
365 for (i
= 0, i_next
= 1; !eof
; i
= i_next
, i_next
= (i_next
+ 1) % n_bufs
)
367 if (n_array_alloc
== i
)
369 /* reallocate between 16 and n_bufs entries. */
370 if (n_array_alloc
== 0)
371 n_array_alloc
= MIN (n_bufs
, 16);
372 else if (n_array_alloc
<= n_bufs
/ 2)
375 n_array_alloc
= n_bufs
;
376 b
= xnrealloc (b
, n_array_alloc
, sizeof *b
);
379 if (! buffered_enough
)
381 b
[i
] = xmalloc (READ_BUFSIZE
);
384 n_read
= full_read (fd
, b
[i
], READ_BUFSIZE
);
385 if (n_read
< READ_BUFSIZE
)
389 error (0, errno
, _("error reading %s"), quoteaf (filename
));
397 buffered_enough
= true;
401 desired_pos
+= n_read
;
402 xwrite_stdout (b
[i_next
], n_read
);
406 /* Output any remainder: rem bytes from b[i] + n_read. */
411 size_t n_bytes_left_in_b_i
= READ_BUFSIZE
- n_read
;
413 if (rem
< n_bytes_left_in_b_i
)
415 xwrite_stdout (b
[i
] + n_read
, rem
);
419 xwrite_stdout (b
[i
] + n_read
, n_bytes_left_in_b_i
);
420 xwrite_stdout (b
[i_next
], rem
- n_bytes_left_in_b_i
);
423 else if (i
+ 1 == n_bufs
)
425 /* This happens when n_elide < file_size < n_elide_round.
429 |---------!---------!---------!---------|
430 |---- n_elide ---------|
433 |---- file size -----------|
435 |---- n_elide_round ----------|
437 size_t y
= READ_BUFSIZE
- rem
;
438 size_t x
= n_read
- y
;
440 xwrite_stdout (b
[i_next
], x
);
445 for (i
= 0; i
< n_alloc
; i
++)
450 if (0 <= current_pos
&& elseek (fd
, desired_pos
, SEEK_SET
, filename
) < 0)
455 /* For the file FILENAME with descriptor FD, output all but the last N_ELIDE
456 bytes. If SIZE is nonnegative, this is a regular file positioned
457 at CURRENT_POS with SIZE bytes. Return true on success.
458 Give a diagnostic and return false upon error. */
460 /* NOTE: if the input file shrinks by more than N_ELIDE bytes between
461 the length determination and the actual reading, then head fails. */
464 elide_tail_bytes_file (const char *filename
, int fd
, uintmax_t n_elide
,
465 struct stat
const *st
, off_t current_pos
)
467 off_t size
= st
->st_size
;
468 if (presume_input_pipe
|| size
<= ST_BLKSIZE (*st
))
469 return elide_tail_bytes_pipe (filename
, fd
, n_elide
, current_pos
);
472 /* Be careful here. The current position may actually be
473 beyond the end of the file. */
474 off_t diff
= size
- current_pos
;
475 off_t bytes_remaining
= diff
< 0 ? 0 : diff
;
477 if (bytes_remaining
<= n_elide
)
480 enum Copy_fd_status err
= copy_fd (fd
, bytes_remaining
- n_elide
);
481 if (err
== COPY_FD_OK
)
484 diagnose_copy_fd_failure (err
, filename
);
489 /* For an input file with name FILENAME and descriptor FD,
490 output all but the last N_ELIDE_0 bytes.
491 If CURRENT_POS is nonnegative, the input file is positioned there
492 and should be repositioned to just before the elided bytes.
493 Buffer the specified number of lines as a linked list of LBUFFERs,
494 adding them as needed. Return true if successful. */
497 elide_tail_lines_pipe (const char *filename
, int fd
, uintmax_t n_elide
,
505 struct linebuffer
*next
;
507 uintmax_t desired_pos
= current_pos
;
508 typedef struct linebuffer LBUFFER
;
509 LBUFFER
*first
, *last
, *tmp
;
510 size_t total_lines
= 0; /* Total number of newlines in all buffers. */
512 size_t n_read
; /* Size in bytes of most recent read */
514 first
= last
= xmalloc (sizeof (LBUFFER
));
515 first
->nbytes
= first
->nlines
= 0;
517 tmp
= xmalloc (sizeof (LBUFFER
));
519 /* Always read into a fresh buffer.
520 Read, (producing no output) until we've accumulated at least
521 n_elide newlines, or until EOF, whichever comes first. */
524 n_read
= safe_read (fd
, tmp
->buffer
, BUFSIZ
);
525 if (n_read
== 0 || n_read
== SAFE_READ_ERROR
)
530 desired_pos
+= n_read
;
531 xwrite_stdout (tmp
->buffer
, n_read
);
535 tmp
->nbytes
= n_read
;
539 /* Count the number of newlines just read. */
541 char const *buffer_end
= tmp
->buffer
+ n_read
;
542 char const *p
= tmp
->buffer
;
543 while ((p
= memchr (p
, line_end
, buffer_end
- p
)))
549 total_lines
+= tmp
->nlines
;
551 /* If there is enough room in the last buffer read, just append the new
552 one to it. This is because when reading from a pipe, 'n_read' can
553 often be very small. */
554 if (tmp
->nbytes
+ last
->nbytes
< BUFSIZ
)
556 memcpy (&last
->buffer
[last
->nbytes
], tmp
->buffer
, tmp
->nbytes
);
557 last
->nbytes
+= tmp
->nbytes
;
558 last
->nlines
+= tmp
->nlines
;
562 /* If there's not enough room, link the new buffer onto the end of
563 the list, then either free up the oldest buffer for the next
564 read if that would leave enough lines, or else malloc a new one.
565 Some compaction mechanism is possible but probably not
567 last
= last
->next
= tmp
;
568 if (n_elide
< total_lines
- first
->nlines
)
570 desired_pos
+= first
->nbytes
;
571 xwrite_stdout (first
->buffer
, first
->nbytes
);
573 total_lines
-= first
->nlines
;
577 tmp
= xmalloc (sizeof (LBUFFER
));
583 if (n_read
== SAFE_READ_ERROR
)
585 error (0, errno
, _("error reading %s"), quoteaf (filename
));
590 /* If we read any bytes at all, count the incomplete line
591 on files that don't end with a newline. */
592 if (last
->nbytes
&& last
->buffer
[last
->nbytes
- 1] != line_end
)
598 for (tmp
= first
; n_elide
< total_lines
- tmp
->nlines
; tmp
= tmp
->next
)
600 desired_pos
+= tmp
->nbytes
;
601 xwrite_stdout (tmp
->buffer
, tmp
->nbytes
);
602 total_lines
-= tmp
->nlines
;
605 /* Print the first 'total_lines - n_elide' lines of tmp->buffer. */
606 if (n_elide
< total_lines
)
608 size_t n
= total_lines
- n_elide
;
609 char const *buffer_end
= tmp
->buffer
+ tmp
->nbytes
;
610 char const *p
= tmp
->buffer
;
611 while (n
&& (p
= memchr (p
, line_end
, buffer_end
- p
)))
617 desired_pos
+= p
- tmp
->buffer
;
618 xwrite_stdout (tmp
->buffer
, p
- tmp
->buffer
);
629 if (0 <= current_pos
&& elseek (fd
, desired_pos
, SEEK_SET
, filename
) < 0)
634 /* Output all but the last N_LINES lines of the input stream defined by
635 FD, START_POS, and SIZE.
636 START_POS is the starting position of the read pointer for the file
637 associated with FD (may be nonzero).
638 SIZE is the file size in bytes.
639 Return true upon success.
640 Give a diagnostic and return false upon error.
642 NOTE: this code is very similar to that of tail.c's file_lines function.
643 Unfortunately, factoring out some common core looks like it'd result
644 in a less efficient implementation or a messy interface. */
646 elide_tail_lines_seekable (const char *pretty_filename
, int fd
,
648 off_t start_pos
, off_t size
)
654 /* Set 'bytes_read' to the size of the last, probably partial, buffer;
655 0 < 'bytes_read' <= 'BUFSIZ'. */
656 bytes_read
= (pos
- start_pos
) % BUFSIZ
;
659 /* Make 'pos' a multiple of 'BUFSIZ' (0 if the file is short), so that all
660 reads will be on block boundaries, which might increase efficiency. */
662 if (elseek (fd
, pos
, SEEK_SET
, pretty_filename
) < 0)
664 bytes_read
= safe_read (fd
, buffer
, bytes_read
);
665 if (bytes_read
== SAFE_READ_ERROR
)
667 error (0, errno
, _("error reading %s"), quoteaf (pretty_filename
));
671 /* n_lines == 0 case needs special treatment. */
672 const bool all_lines
= !n_lines
;
674 /* Count the incomplete line on files that don't end with a newline. */
675 if (n_lines
&& bytes_read
&& buffer
[bytes_read
- 1] != line_end
)
680 /* Scan backward, counting the newlines in this bufferfull. */
682 size_t n
= bytes_read
;
690 nl
= memrchr (buffer
, line_end
, n
);
698 /* If necessary, restore the file pointer and copy
699 input to output up to position, POS. */
702 enum Copy_fd_status err
;
703 if (elseek (fd
, start_pos
, SEEK_SET
, pretty_filename
) < 0)
706 err
= copy_fd (fd
, pos
- start_pos
);
707 if (err
!= COPY_FD_OK
)
709 diagnose_copy_fd_failure (err
, pretty_filename
);
714 /* Output the initial portion of the buffer
715 in which we found the desired newline byte. */
716 xwrite_stdout (buffer
, n
+ 1);
718 /* Set file pointer to the byte after what we've output. */
719 return 0 <= elseek (fd
, pos
+ n
+ 1, SEEK_SET
, pretty_filename
);
723 /* Not enough newlines in that bufferfull. */
724 if (pos
== start_pos
)
726 /* Not enough lines in the file. */
730 if (elseek (fd
, pos
, SEEK_SET
, pretty_filename
) < 0)
733 bytes_read
= safe_read (fd
, buffer
, BUFSIZ
);
734 if (bytes_read
== SAFE_READ_ERROR
)
736 error (0, errno
, _("error reading %s"), quoteaf (pretty_filename
));
740 /* FIXME: is this dead code?
741 Consider the test, pos == start_pos, above. */
747 /* For the file FILENAME with descriptor FD, output all but the last N_ELIDE
748 lines. If SIZE is nonnegative, this is a regular file positioned
749 at START_POS with SIZE bytes. Return true on success.
750 Give a diagnostic and return nonzero upon error. */
753 elide_tail_lines_file (const char *filename
, int fd
, uintmax_t n_elide
,
754 struct stat
const *st
, off_t current_pos
)
756 off_t size
= st
->st_size
;
757 if (presume_input_pipe
|| size
<= ST_BLKSIZE (*st
))
758 return elide_tail_lines_pipe (filename
, fd
, n_elide
, current_pos
);
761 /* Find the offset, OFF, of the Nth newline from the end,
762 but not counting the last byte of the file.
763 If found, write from current position to OFF, inclusive.
764 Otherwise, just return true. */
766 return (size
<= current_pos
767 || elide_tail_lines_seekable (filename
, fd
, n_elide
,
773 head_bytes (const char *filename
, int fd
, uintmax_t bytes_to_write
)
776 size_t bytes_to_read
= BUFSIZ
;
778 while (bytes_to_write
)
781 if (bytes_to_write
< bytes_to_read
)
782 bytes_to_read
= bytes_to_write
;
783 bytes_read
= safe_read (fd
, buffer
, bytes_to_read
);
784 if (bytes_read
== SAFE_READ_ERROR
)
786 error (0, errno
, _("error reading %s"), quoteaf (filename
));
791 xwrite_stdout (buffer
, bytes_read
);
792 bytes_to_write
-= bytes_read
;
798 head_lines (const char *filename
, int fd
, uintmax_t lines_to_write
)
802 while (lines_to_write
)
804 size_t bytes_read
= safe_read (fd
, buffer
, BUFSIZ
);
805 size_t bytes_to_write
= 0;
807 if (bytes_read
== SAFE_READ_ERROR
)
809 error (0, errno
, _("error reading %s"), quoteaf (filename
));
814 while (bytes_to_write
< bytes_read
)
815 if (buffer
[bytes_to_write
++] == line_end
&& --lines_to_write
== 0)
817 off_t n_bytes_past_EOL
= bytes_read
- bytes_to_write
;
818 /* If we have read more data than that on the specified number
819 of lines, try to seek back to the position we would have
820 gotten to had we been reading one byte at a time. */
821 if (lseek (fd
, -n_bytes_past_EOL
, SEEK_CUR
) < 0)
824 if (fstat (fd
, &st
) != 0 || S_ISREG (st
.st_mode
))
825 elseek (fd
, -n_bytes_past_EOL
, SEEK_CUR
, filename
);
829 xwrite_stdout (buffer
, bytes_to_write
);
835 head (const char *filename
, int fd
, uintmax_t n_units
, bool count_lines
,
839 write_header (filename
);
843 off_t current_pos
= -1;
845 if (fstat (fd
, &st
) != 0)
847 error (0, errno
, _("cannot fstat %s"),
851 if (! presume_input_pipe
&& usable_st_size (&st
))
853 current_pos
= elseek (fd
, 0, SEEK_CUR
, filename
);
858 return elide_tail_lines_file (filename
, fd
, n_units
, &st
, current_pos
);
860 return elide_tail_bytes_file (filename
, fd
, n_units
, &st
, current_pos
);
863 return head_lines (filename
, fd
, n_units
);
865 return head_bytes (filename
, fd
, n_units
);
869 head_file (const char *filename
, uintmax_t n_units
, bool count_lines
,
874 bool is_stdin
= STREQ (filename
, "-");
878 have_read_stdin
= true;
880 filename
= _("standard input");
881 if (O_BINARY
&& ! isatty (STDIN_FILENO
))
882 xfreopen (NULL
, "rb", stdin
);
886 fd
= open (filename
, O_RDONLY
| O_BINARY
);
889 error (0, errno
, _("cannot open %s for reading"), quoteaf (filename
));
894 ok
= head (filename
, fd
, n_units
, count_lines
, elide_from_end
);
895 if (!is_stdin
&& close (fd
) != 0)
897 error (0, errno
, _("failed to close %s"), quoteaf (filename
));
903 /* Convert a string of decimal digits, N_STRING, with an optional suffix
904 to an integral value. Upon successful conversion,
905 return that value. If it cannot be converted, give a diagnostic and exit.
906 COUNT_LINES indicates whether N_STRING is a number of bytes or a number
907 of lines. It is used solely to give a more specific diagnostic. */
910 string_to_integer (bool count_lines
, const char *n_string
)
912 return xdectoumax (n_string
, 0, UINTMAX_MAX
, "bkKmMGTPEZY0",
913 count_lines
? _("invalid number of lines")
914 : _("invalid number of bytes"), 0);
918 main (int argc
, char **argv
)
920 enum header_mode header_mode
= multiple_files
;
925 /* Number of items to print. */
926 uintmax_t n_units
= DEFAULT_NUMBER
;
928 /* If true, interpret the numeric argument as the number of lines.
929 Otherwise, interpret it as the number of bytes. */
930 bool count_lines
= true;
932 /* Elide the specified number of lines or bytes, counting from
933 the end of the file. */
934 bool elide_from_end
= false;
936 /* Initializer for file_list if no file-arguments
937 were specified on the command line. */
938 static char const *const default_file_list
[] = {"-", NULL
};
939 char const *const *file_list
;
941 initialize_main (&argc
, &argv
);
942 set_program_name (argv
[0]);
943 setlocale (LC_ALL
, "");
944 bindtextdomain (PACKAGE
, LOCALEDIR
);
945 textdomain (PACKAGE
);
947 atexit (close_stdout
);
949 have_read_stdin
= false;
951 print_headers
= false;
955 if (1 < argc
&& argv
[1][0] == '-' && ISDIGIT (argv
[1][1]))
958 char *n_string
= ++a
;
960 char multiplier_char
= 0;
962 /* Old option syntax; a dash, one or more digits, and one or
963 more option letters. Move past the number. */
965 while (ISDIGIT (*a
));
967 /* Pointer to the byte after the last digit. */
970 /* Parse any appended option letters. */
984 multiplier_char
= *a
;
996 header_mode
= always
;
1004 error (0, 0, _("invalid trailing option -- %c"), *a
);
1005 usage (EXIT_FAILURE
);
1009 /* Append the multiplier character (if any) onto the end of
1010 the digit string. Then add NUL byte if necessary. */
1011 *end_n_string
= multiplier_char
;
1012 if (multiplier_char
)
1013 *(++end_n_string
) = 0;
1015 n_units
= string_to_integer (count_lines
, n_string
);
1017 /* Make the options we just parsed invisible to getopt. */
1023 while ((c
= getopt_long (argc
, argv
, "c:n:qvz0123456789", long_options
, NULL
))
1028 case PRESUME_INPUT_PIPE_OPTION
:
1029 presume_input_pipe
= true;
1033 count_lines
= false;
1034 elide_from_end
= (*optarg
== '-');
1037 n_units
= string_to_integer (count_lines
, optarg
);
1042 elide_from_end
= (*optarg
== '-');
1045 n_units
= string_to_integer (count_lines
, optarg
);
1049 header_mode
= never
;
1053 header_mode
= always
;
1060 case_GETOPT_HELP_CHAR
;
1062 case_GETOPT_VERSION_CHAR (PROGRAM_NAME
, AUTHORS
);
1066 error (0, 0, _("invalid trailing option -- %c"), c
);
1067 usage (EXIT_FAILURE
);
1071 if (header_mode
== always
1072 || (header_mode
== multiple_files
&& optind
< argc
- 1))
1073 print_headers
= true;
1075 if ( ! count_lines
&& elide_from_end
&& OFF_T_MAX
< n_units
)
1077 char umax_buf
[INT_BUFSIZE_BOUND (n_units
)];
1078 die (EXIT_FAILURE
, EOVERFLOW
, "%s: %s", _("invalid number of bytes"),
1079 quote (umaxtostr (n_units
, umax_buf
)));
1082 file_list
= (optind
< argc
1083 ? (char const *const *) &argv
[optind
]
1084 : default_file_list
);
1086 if (O_BINARY
&& ! isatty (STDOUT_FILENO
))
1087 xfreopen (NULL
, "wb", stdout
);
1089 for (i
= 0; file_list
[i
]; ++i
)
1090 ok
&= head_file (file_list
[i
], n_units
, count_lines
, elide_from_end
);
1092 if (have_read_stdin
&& close (STDIN_FILENO
) < 0)
1093 die (EXIT_FAILURE
, errno
, "-");
1095 return ok
? EXIT_SUCCESS
: EXIT_FAILURE
;