1 /* head -- output first part of file(s)
2 Copyright (C) 1989-2024 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 <https://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>
35 #include "full-read.h"
37 #include "safe-read.h"
38 #include "stat-size.h"
39 #include "xbinary-io.h"
40 #include "xdectoint.h"
42 /* The official name of this program (e.g., no 'g' prefix). */
43 #define PROGRAM_NAME "head"
46 proper_name ("David MacKenzie"), \
47 proper_name ("Jim Meyering")
49 /* Number of lines/chars/blocks to head. */
50 #define DEFAULT_NUMBER 10
52 /* Useful only when eliding tail bytes or lines.
53 If true, skip the is-regular-file test used to determine whether
54 to use the lseek optimization. Instead, use the more general (and
55 more expensive) code unconditionally. Intended solely for testing. */
56 static bool presume_input_pipe
;
58 /* If true, print filename headers. */
59 static bool print_headers
;
61 /* Character to split lines by. */
64 /* When to print the filename banners. */
67 multiple_files
, always
, never
70 /* Have we ever read standard input? */
71 static bool have_read_stdin
;
77 COPY_FD_UNEXPECTED_EOF
80 /* For long options that have no equivalent short option, use a
81 non-character as a pseudo short option, starting with CHAR_MAX + 1. */
84 PRESUME_INPUT_PIPE_OPTION
= CHAR_MAX
+ 1
87 static struct option
const long_options
[] =
89 {"bytes", required_argument
, nullptr, 'c'},
90 {"lines", required_argument
, nullptr, 'n'},
91 {"-presume-input-pipe", no_argument
, nullptr,
92 PRESUME_INPUT_PIPE_OPTION
}, /* do not document */
93 {"quiet", no_argument
, nullptr, 'q'},
94 {"silent", no_argument
, nullptr, 'q'},
95 {"verbose", no_argument
, nullptr, 'v'},
96 {"zero-terminated", no_argument
, nullptr, 'z'},
97 {GETOPT_HELP_OPTION_DECL
},
98 {GETOPT_VERSION_OPTION_DECL
},
99 {nullptr, 0, nullptr, 0}
105 if (status
!= EXIT_SUCCESS
)
110 Usage: %s [OPTION]... [FILE]...\n\
114 Print the first %d lines of each FILE to standard output.\n\
115 With more than one FILE, precede each with a header giving the file name.\n\
119 emit_mandatory_arg_note ();
122 -c, --bytes=[-]NUM print the first NUM bytes of each file;\n\
123 with the leading '-', print all but the last\n\
124 NUM bytes of each file\n\
125 -n, --lines=[-]NUM print the first NUM lines instead of the first %d;\n\
126 with the leading '-', print all but the last\n\
127 NUM lines of each file\n\
130 -q, --quiet, --silent never print headers giving file names\n\
131 -v, --verbose always print headers giving file names\n\
134 -z, --zero-terminated line delimiter is NUL, not newline\n\
136 fputs (HELP_OPTION_DESCRIPTION
, stdout
);
137 fputs (VERSION_OPTION_DESCRIPTION
, stdout
);
140 NUM may have a multiplier suffix:\n\
141 b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,\n\
142 GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y, R, Q.\n\
143 Binary prefixes can be used, too: KiB=K, MiB=M, and so on.\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 (char const *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. */
185 error (EXIT_FAILURE
, errno
, _("error writing %s"),
186 quoteaf ("standard output"));
190 /* Copy no more than N_BYTES from file descriptor SRC_FD to stdout.
191 Return an appropriate indication of success or read failure. */
193 static enum Copy_fd_status
194 copy_fd (int src_fd
, uintmax_t n_bytes
)
197 const size_t buf_size
= sizeof (buf
);
199 /* Copy the file contents. */
202 size_t n_to_read
= MIN (buf_size
, n_bytes
);
203 size_t n_read
= safe_read (src_fd
, buf
, n_to_read
);
204 if (n_read
== SAFE_READ_ERROR
)
205 return COPY_FD_READ_ERROR
;
209 if (n_read
== 0 && n_bytes
!= 0)
210 return COPY_FD_UNEXPECTED_EOF
;
212 xwrite_stdout (buf
, n_read
);
218 /* Call lseek (FD, OFFSET, WHENCE), where file descriptor FD
219 corresponds to the file FILENAME. WHENCE must be SEEK_SET or
220 SEEK_CUR. Return the resulting offset. Give a diagnostic and
221 return -1 if lseek fails. */
224 elseek (int fd
, off_t offset
, int whence
, char const *filename
)
226 off_t new_offset
= lseek (fd
, offset
, whence
);
231 ? N_("%s: cannot seek to offset %jd")
232 : N_("%s: cannot seek to relative offset %jd")),
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 (char const *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 error (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 (char const *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
|| current_pos
< 0 || size
<= STP_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 (char const *filename
, int fd
, uintmax_t n_elide
,
502 char buffer
[BUFSIZ
+ 1];
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;
516 first
->next
= nullptr;
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 *buffer_end
= tmp
->buffer
+ n_read
;
542 *buffer_end
= line_end
;
543 char const *p
= tmp
->buffer
;
544 while ((p
= rawmemchr (p
, line_end
)) < buffer_end
)
550 total_lines
+= tmp
->nlines
;
552 /* If there is enough room in the last buffer read, just append the new
553 one to it. This is because when reading from a pipe, 'n_read' can
554 often be very small. */
555 if (tmp
->nbytes
+ last
->nbytes
< BUFSIZ
)
557 memcpy (&last
->buffer
[last
->nbytes
], tmp
->buffer
, tmp
->nbytes
);
558 last
->nbytes
+= tmp
->nbytes
;
559 last
->nlines
+= tmp
->nlines
;
563 /* If there's not enough room, link the new buffer onto the end of
564 the list, then either free up the oldest buffer for the next
565 read if that would leave enough lines, or else malloc a new one.
566 Some compaction mechanism is possible but probably not
568 last
= last
->next
= tmp
;
569 if (n_elide
< total_lines
- first
->nlines
)
571 desired_pos
+= first
->nbytes
;
572 xwrite_stdout (first
->buffer
, first
->nbytes
);
574 total_lines
-= first
->nlines
;
578 tmp
= xmalloc (sizeof (LBUFFER
));
584 if (n_read
== SAFE_READ_ERROR
)
586 error (0, errno
, _("error reading %s"), quoteaf (filename
));
591 /* If we read any bytes at all, count the incomplete line
592 on files that don't end with a newline. */
593 if (last
->nbytes
&& last
->buffer
[last
->nbytes
- 1] != line_end
)
599 for (tmp
= first
; n_elide
< total_lines
- tmp
->nlines
; tmp
= tmp
->next
)
601 desired_pos
+= tmp
->nbytes
;
602 xwrite_stdout (tmp
->buffer
, tmp
->nbytes
);
603 total_lines
-= tmp
->nlines
;
606 /* Print the first 'total_lines - n_elide' lines of tmp->buffer. */
607 if (n_elide
< total_lines
)
609 size_t n
= total_lines
- n_elide
;
610 char const *buffer_end
= tmp
->buffer
+ tmp
->nbytes
;
611 char const *p
= tmp
->buffer
;
612 while (n
&& (p
= memchr (p
, line_end
, buffer_end
- p
)))
618 desired_pos
+= p
- tmp
->buffer
;
619 xwrite_stdout (tmp
->buffer
, p
- tmp
->buffer
);
630 if (0 <= current_pos
&& elseek (fd
, desired_pos
, SEEK_SET
, filename
) < 0)
635 /* Output all but the last N_LINES lines of the input stream defined by
636 FD, START_POS, and SIZE.
637 START_POS is the starting position of the read pointer for the file
638 associated with FD (may be nonzero).
639 SIZE is the file size in bytes.
640 Return true upon success.
641 Give a diagnostic and return false upon error.
643 NOTE: this code is very similar to that of tail.c's file_lines function.
644 Unfortunately, factoring out some common core looks like it'd result
645 in a less efficient implementation or a messy interface. */
647 elide_tail_lines_seekable (char const *pretty_filename
, int fd
,
649 off_t start_pos
, off_t size
)
655 /* Set 'bytes_read' to the size of the last, probably partial, buffer;
656 0 < 'bytes_read' <= 'BUFSIZ'. */
657 bytes_read
= (pos
- start_pos
) % BUFSIZ
;
660 /* Make 'pos' a multiple of 'BUFSIZ' (0 if the file is short), so that all
661 reads will be on block boundaries, which might increase efficiency. */
663 if (elseek (fd
, pos
, SEEK_SET
, pretty_filename
) < 0)
665 bytes_read
= safe_read (fd
, buffer
, bytes_read
);
666 if (bytes_read
== SAFE_READ_ERROR
)
668 error (0, errno
, _("error reading %s"), quoteaf (pretty_filename
));
672 /* n_lines == 0 case needs special treatment. */
673 const bool all_lines
= !n_lines
;
675 /* Count the incomplete line on files that don't end with a newline. */
676 if (n_lines
&& bytes_read
&& buffer
[bytes_read
- 1] != line_end
)
681 /* Scan backward, counting the newlines in this bufferfull. */
683 size_t n
= bytes_read
;
691 nl
= memrchr (buffer
, line_end
, n
);
699 /* If necessary, restore the file pointer and copy
700 input to output up to position, POS. */
703 enum Copy_fd_status err
;
704 if (elseek (fd
, start_pos
, SEEK_SET
, pretty_filename
) < 0)
707 err
= copy_fd (fd
, pos
- start_pos
);
708 if (err
!= COPY_FD_OK
)
710 diagnose_copy_fd_failure (err
, pretty_filename
);
715 /* Output the initial portion of the buffer
716 in which we found the desired newline byte. */
717 xwrite_stdout (buffer
, n
+ 1);
719 /* Set file pointer to the byte after what we've output. */
720 return 0 <= elseek (fd
, pos
+ n
+ 1, SEEK_SET
, pretty_filename
);
724 /* Not enough newlines in that bufferfull. */
725 if (pos
== start_pos
)
727 /* Not enough lines in the file. */
731 if (elseek (fd
, pos
, SEEK_SET
, pretty_filename
) < 0)
734 bytes_read
= safe_read (fd
, buffer
, BUFSIZ
);
735 if (bytes_read
== SAFE_READ_ERROR
)
737 error (0, errno
, _("error reading %s"), quoteaf (pretty_filename
));
741 /* FIXME: is this dead code?
742 Consider the test, pos == start_pos, above. */
748 /* For the file FILENAME with descriptor FD, output all but the last N_ELIDE
749 lines. If SIZE is nonnegative, this is a regular file positioned
750 at START_POS with SIZE bytes. Return true on success.
751 Give a diagnostic and return nonzero upon error. */
754 elide_tail_lines_file (char const *filename
, int fd
, uintmax_t n_elide
,
755 struct stat
const *st
, off_t current_pos
)
757 off_t size
= st
->st_size
;
758 if (presume_input_pipe
|| current_pos
< 0 || size
<= STP_BLKSIZE (st
))
759 return elide_tail_lines_pipe (filename
, fd
, n_elide
, current_pos
);
762 /* Find the offset, OFF, of the Nth newline from the end,
763 but not counting the last byte of the file.
764 If found, write from current position to OFF, inclusive.
765 Otherwise, just return true. */
767 return (size
<= current_pos
768 || elide_tail_lines_seekable (filename
, fd
, n_elide
,
774 head_bytes (char const *filename
, int fd
, uintmax_t bytes_to_write
)
777 size_t bytes_to_read
= BUFSIZ
;
779 while (bytes_to_write
)
782 if (bytes_to_write
< bytes_to_read
)
783 bytes_to_read
= bytes_to_write
;
784 bytes_read
= safe_read (fd
, buffer
, bytes_to_read
);
785 if (bytes_read
== SAFE_READ_ERROR
)
787 error (0, errno
, _("error reading %s"), quoteaf (filename
));
792 xwrite_stdout (buffer
, bytes_read
);
793 bytes_to_write
-= bytes_read
;
799 head_lines (char const *filename
, int fd
, uintmax_t lines_to_write
)
803 while (lines_to_write
)
805 size_t bytes_read
= safe_read (fd
, buffer
, BUFSIZ
);
806 size_t bytes_to_write
= 0;
808 if (bytes_read
== SAFE_READ_ERROR
)
810 error (0, errno
, _("error reading %s"), quoteaf (filename
));
815 while (bytes_to_write
< bytes_read
)
816 if (buffer
[bytes_to_write
++] == line_end
&& --lines_to_write
== 0)
818 off_t n_bytes_past_EOL
= bytes_read
- bytes_to_write
;
819 /* If we have read more data than that on the specified number
820 of lines, try to seek back to the position we would have
821 gotten to had we been reading one byte at a time. */
822 if (lseek (fd
, -n_bytes_past_EOL
, SEEK_CUR
) < 0)
825 if (fstat (fd
, &st
) != 0 || S_ISREG (st
.st_mode
))
826 elseek (fd
, -n_bytes_past_EOL
, SEEK_CUR
, filename
);
830 xwrite_stdout (buffer
, bytes_to_write
);
836 head (char const *filename
, int fd
, uintmax_t n_units
, bool count_lines
,
840 write_header (filename
);
844 off_t current_pos
= -1;
846 if (fstat (fd
, &st
) != 0)
848 error (0, errno
, _("cannot fstat %s"),
852 if (! presume_input_pipe
&& usable_st_size (&st
))
854 current_pos
= elseek (fd
, 0, SEEK_CUR
, filename
);
859 return elide_tail_lines_file (filename
, fd
, n_units
, &st
, current_pos
);
861 return elide_tail_bytes_file (filename
, fd
, n_units
, &st
, current_pos
);
864 return head_lines (filename
, fd
, n_units
);
866 return head_bytes (filename
, fd
, n_units
);
870 head_file (char const *filename
, uintmax_t n_units
, bool count_lines
,
875 bool is_stdin
= STREQ (filename
, "-");
879 have_read_stdin
= true;
881 filename
= _("standard input");
882 xset_binary_mode (STDIN_FILENO
, O_BINARY
);
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
, char const *n_string
)
912 return xdectoumax (n_string
, 0, UINTMAX_MAX
, "bkKmMGTPEZYRQ0",
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
[] = {"-", nullptr};
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",
1024 long_options
, nullptr))
1029 case PRESUME_INPUT_PIPE_OPTION
:
1030 presume_input_pipe
= true;
1034 count_lines
= false;
1035 elide_from_end
= (*optarg
== '-');
1038 n_units
= string_to_integer (count_lines
, optarg
);
1043 elide_from_end
= (*optarg
== '-');
1046 n_units
= string_to_integer (count_lines
, optarg
);
1050 header_mode
= never
;
1054 header_mode
= always
;
1061 case_GETOPT_HELP_CHAR
;
1063 case_GETOPT_VERSION_CHAR (PROGRAM_NAME
, AUTHORS
);
1067 error (0, 0, _("invalid trailing option -- %c"), c
);
1068 usage (EXIT_FAILURE
);
1072 if (header_mode
== always
1073 || (header_mode
== multiple_files
&& optind
< argc
- 1))
1074 print_headers
= true;
1076 if ( ! count_lines
&& elide_from_end
&& OFF_T_MAX
< n_units
)
1078 char umax_buf
[INT_BUFSIZE_BOUND (n_units
)];
1079 error (EXIT_FAILURE
, EOVERFLOW
, "%s: %s", _("invalid number of bytes"),
1080 quote (umaxtostr (n_units
, umax_buf
)));
1083 file_list
= (optind
< argc
1084 ? (char const *const *) &argv
[optind
]
1085 : default_file_list
);
1087 xset_binary_mode (STDOUT_FILENO
, O_BINARY
);
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 error (EXIT_FAILURE
, errno
, "-");
1095 return ok
? EXIT_SUCCESS
: EXIT_FAILURE
;