1 /* head -- output first part of file(s)
2 Copyright (C) 1989-2023 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
);
227 char buf
[INT_BUFSIZE_BOUND (offset
)];
232 ? N_("%s: cannot seek to offset %s")
233 : N_("%s: cannot seek to relative offset %s")),
235 offtostr (offset
, buf
));
240 /* For an input file with name FILENAME and descriptor FD,
241 output all but the last N_ELIDE_0 bytes.
242 If CURRENT_POS is nonnegative, assume that the input file is
243 positioned at CURRENT_POS and that it should be repositioned to
244 just before the elided bytes before returning.
245 Return true upon success.
246 Give a diagnostic and return false upon error. */
248 elide_tail_bytes_pipe (char const *filename
, int fd
, uintmax_t n_elide_0
,
251 size_t n_elide
= n_elide_0
;
252 uintmax_t desired_pos
= current_pos
;
255 #ifndef HEAD_TAIL_PIPE_READ_BUFSIZE
256 # define HEAD_TAIL_PIPE_READ_BUFSIZE BUFSIZ
258 #define READ_BUFSIZE HEAD_TAIL_PIPE_READ_BUFSIZE
260 /* If we're eliding no more than this many bytes, then it's ok to allocate
261 more memory in order to use a more time-efficient algorithm.
262 FIXME: use a fraction of available memory instead, as in sort.
263 FIXME: is this even worthwhile? */
264 #ifndef HEAD_TAIL_PIPE_BYTECOUNT_THRESHOLD
265 # define HEAD_TAIL_PIPE_BYTECOUNT_THRESHOLD 1024 * 1024
268 #if HEAD_TAIL_PIPE_BYTECOUNT_THRESHOLD < 2 * READ_BUFSIZE
269 "HEAD_TAIL_PIPE_BYTECOUNT_THRESHOLD must be at least 2 * READ_BUFSIZE"
272 if (SIZE_MAX
< n_elide_0
+ READ_BUFSIZE
)
274 char umax_buf
[INT_BUFSIZE_BOUND (n_elide_0
)];
275 error (EXIT_FAILURE
, 0, _("%s: number of bytes is too large"),
276 umaxtostr (n_elide_0
, umax_buf
));
279 /* Two cases to consider...
280 1) n_elide is small enough that we can afford to double-buffer:
281 allocate 2 * (READ_BUFSIZE + n_elide) bytes
282 2) n_elide is too big for that, so we allocate only
283 (READ_BUFSIZE + n_elide) bytes
285 FIXME: profile, to see if double-buffering is worthwhile
287 CAUTION: do not fail (out of memory) when asked to elide
288 a ridiculous amount, but when given only a small input. */
290 if (n_elide
<= HEAD_TAIL_PIPE_BYTECOUNT_THRESHOLD
)
294 size_t n_to_read
= READ_BUFSIZE
+ n_elide
;
297 b
[0] = xnmalloc (2, n_to_read
);
298 b
[1] = b
[0] + n_to_read
;
300 for (i
= false; ! eof
; i
= !i
)
302 size_t n_read
= full_read (fd
, b
[i
], n_to_read
);
304 if (n_read
< n_to_read
)
308 error (0, errno
, _("error reading %s"), quoteaf (filename
));
314 if (n_read
<= n_elide
)
318 /* The input is no larger than the number of bytes
319 to elide. So there's nothing to output, and
324 delta
= n_elide
- n_read
;
330 /* Output any (but maybe just part of the) elided data from
331 the previous round. */
334 desired_pos
+= n_elide
- delta
;
335 xwrite_stdout (b
[!i
] + READ_BUFSIZE
, n_elide
- delta
);
339 if (n_elide
< n_read
)
341 desired_pos
+= n_read
- n_elide
;
342 xwrite_stdout (b
[i
], n_read
- n_elide
);
350 /* Read blocks of size READ_BUFSIZE, until we've read at least n_elide
351 bytes. Then, for each new buffer we read, also write an old one. */
355 bool buffered_enough
;
358 /* Round n_elide up to a multiple of READ_BUFSIZE. */
359 size_t rem
= READ_BUFSIZE
- (n_elide
% READ_BUFSIZE
);
360 size_t n_elide_round
= n_elide
+ rem
;
361 size_t n_bufs
= n_elide_round
/ READ_BUFSIZE
+ 1;
363 size_t n_array_alloc
= 0;
365 buffered_enough
= false;
366 for (i
= 0, i_next
= 1; !eof
; i
= i_next
, i_next
= (i_next
+ 1) % n_bufs
)
368 if (n_array_alloc
== i
)
370 /* reallocate between 16 and n_bufs entries. */
371 if (n_array_alloc
== 0)
372 n_array_alloc
= MIN (n_bufs
, 16);
373 else if (n_array_alloc
<= n_bufs
/ 2)
376 n_array_alloc
= n_bufs
;
377 b
= xnrealloc (b
, n_array_alloc
, sizeof *b
);
380 if (! buffered_enough
)
382 b
[i
] = xmalloc (READ_BUFSIZE
);
385 n_read
= full_read (fd
, b
[i
], READ_BUFSIZE
);
386 if (n_read
< READ_BUFSIZE
)
390 error (0, errno
, _("error reading %s"), quoteaf (filename
));
398 buffered_enough
= true;
402 desired_pos
+= n_read
;
403 xwrite_stdout (b
[i_next
], n_read
);
407 /* Output any remainder: rem bytes from b[i] + n_read. */
412 size_t n_bytes_left_in_b_i
= READ_BUFSIZE
- n_read
;
414 if (rem
< n_bytes_left_in_b_i
)
416 xwrite_stdout (b
[i
] + n_read
, rem
);
420 xwrite_stdout (b
[i
] + n_read
, n_bytes_left_in_b_i
);
421 xwrite_stdout (b
[i_next
], rem
- n_bytes_left_in_b_i
);
424 else if (i
+ 1 == n_bufs
)
426 /* This happens when n_elide < file_size < n_elide_round.
430 |---------!---------!---------!---------|
431 |---- n_elide ---------|
434 |---- file size -----------|
436 |---- n_elide_round ----------|
438 size_t y
= READ_BUFSIZE
- rem
;
439 size_t x
= n_read
- y
;
441 xwrite_stdout (b
[i_next
], x
);
446 for (i
= 0; i
< n_alloc
; i
++)
451 if (0 <= current_pos
&& elseek (fd
, desired_pos
, SEEK_SET
, filename
) < 0)
456 /* For the file FILENAME with descriptor FD, output all but the last N_ELIDE
457 bytes. If SIZE is nonnegative, this is a regular file positioned
458 at CURRENT_POS with SIZE bytes. Return true on success.
459 Give a diagnostic and return false upon error. */
461 /* NOTE: if the input file shrinks by more than N_ELIDE bytes between
462 the length determination and the actual reading, then head fails. */
465 elide_tail_bytes_file (char const *filename
, int fd
, uintmax_t n_elide
,
466 struct stat
const *st
, off_t current_pos
)
468 off_t size
= st
->st_size
;
469 if (presume_input_pipe
|| current_pos
< 0 || size
<= STP_BLKSIZE (st
))
470 return elide_tail_bytes_pipe (filename
, fd
, n_elide
, current_pos
);
473 /* Be careful here. The current position may actually be
474 beyond the end of the file. */
475 off_t diff
= size
- current_pos
;
476 off_t bytes_remaining
= diff
< 0 ? 0 : diff
;
478 if (bytes_remaining
<= n_elide
)
481 enum Copy_fd_status err
= copy_fd (fd
, bytes_remaining
- n_elide
);
482 if (err
== COPY_FD_OK
)
485 diagnose_copy_fd_failure (err
, filename
);
490 /* For an input file with name FILENAME and descriptor FD,
491 output all but the last N_ELIDE_0 bytes.
492 If CURRENT_POS is nonnegative, the input file is positioned there
493 and should be repositioned to just before the elided bytes.
494 Buffer the specified number of lines as a linked list of LBUFFERs,
495 adding them as needed. Return true if successful. */
498 elide_tail_lines_pipe (char const *filename
, int fd
, uintmax_t n_elide
,
503 char buffer
[BUFSIZ
+ 1];
506 struct linebuffer
*next
;
508 uintmax_t desired_pos
= current_pos
;
509 typedef struct linebuffer LBUFFER
;
510 LBUFFER
*first
, *last
, *tmp
;
511 size_t total_lines
= 0; /* Total number of newlines in all buffers. */
513 size_t n_read
; /* Size in bytes of most recent read */
515 first
= last
= xmalloc (sizeof (LBUFFER
));
516 first
->nbytes
= first
->nlines
= 0;
517 first
->next
= nullptr;
518 tmp
= xmalloc (sizeof (LBUFFER
));
520 /* Always read into a fresh buffer.
521 Read, (producing no output) until we've accumulated at least
522 n_elide newlines, or until EOF, whichever comes first. */
525 n_read
= safe_read (fd
, tmp
->buffer
, BUFSIZ
);
526 if (n_read
== 0 || n_read
== SAFE_READ_ERROR
)
531 desired_pos
+= n_read
;
532 xwrite_stdout (tmp
->buffer
, n_read
);
536 tmp
->nbytes
= n_read
;
540 /* Count the number of newlines just read. */
542 char *buffer_end
= tmp
->buffer
+ n_read
;
543 *buffer_end
= line_end
;
544 char const *p
= tmp
->buffer
;
545 while ((p
= rawmemchr (p
, line_end
)) < buffer_end
)
551 total_lines
+= tmp
->nlines
;
553 /* If there is enough room in the last buffer read, just append the new
554 one to it. This is because when reading from a pipe, 'n_read' can
555 often be very small. */
556 if (tmp
->nbytes
+ last
->nbytes
< BUFSIZ
)
558 memcpy (&last
->buffer
[last
->nbytes
], tmp
->buffer
, tmp
->nbytes
);
559 last
->nbytes
+= tmp
->nbytes
;
560 last
->nlines
+= tmp
->nlines
;
564 /* If there's not enough room, link the new buffer onto the end of
565 the list, then either free up the oldest buffer for the next
566 read if that would leave enough lines, or else malloc a new one.
567 Some compaction mechanism is possible but probably not
569 last
= last
->next
= tmp
;
570 if (n_elide
< total_lines
- first
->nlines
)
572 desired_pos
+= first
->nbytes
;
573 xwrite_stdout (first
->buffer
, first
->nbytes
);
575 total_lines
-= first
->nlines
;
579 tmp
= xmalloc (sizeof (LBUFFER
));
585 if (n_read
== SAFE_READ_ERROR
)
587 error (0, errno
, _("error reading %s"), quoteaf (filename
));
592 /* If we read any bytes at all, count the incomplete line
593 on files that don't end with a newline. */
594 if (last
->nbytes
&& last
->buffer
[last
->nbytes
- 1] != line_end
)
600 for (tmp
= first
; n_elide
< total_lines
- tmp
->nlines
; tmp
= tmp
->next
)
602 desired_pos
+= tmp
->nbytes
;
603 xwrite_stdout (tmp
->buffer
, tmp
->nbytes
);
604 total_lines
-= tmp
->nlines
;
607 /* Print the first 'total_lines - n_elide' lines of tmp->buffer. */
608 if (n_elide
< total_lines
)
610 size_t n
= total_lines
- n_elide
;
611 char const *buffer_end
= tmp
->buffer
+ tmp
->nbytes
;
612 char const *p
= tmp
->buffer
;
613 while (n
&& (p
= memchr (p
, line_end
, buffer_end
- p
)))
619 desired_pos
+= p
- tmp
->buffer
;
620 xwrite_stdout (tmp
->buffer
, p
- tmp
->buffer
);
631 if (0 <= current_pos
&& elseek (fd
, desired_pos
, SEEK_SET
, filename
) < 0)
636 /* Output all but the last N_LINES lines of the input stream defined by
637 FD, START_POS, and SIZE.
638 START_POS is the starting position of the read pointer for the file
639 associated with FD (may be nonzero).
640 SIZE is the file size in bytes.
641 Return true upon success.
642 Give a diagnostic and return false upon error.
644 NOTE: this code is very similar to that of tail.c's file_lines function.
645 Unfortunately, factoring out some common core looks like it'd result
646 in a less efficient implementation or a messy interface. */
648 elide_tail_lines_seekable (char const *pretty_filename
, int fd
,
650 off_t start_pos
, off_t size
)
656 /* Set 'bytes_read' to the size of the last, probably partial, buffer;
657 0 < 'bytes_read' <= 'BUFSIZ'. */
658 bytes_read
= (pos
- start_pos
) % BUFSIZ
;
661 /* Make 'pos' a multiple of 'BUFSIZ' (0 if the file is short), so that all
662 reads will be on block boundaries, which might increase efficiency. */
664 if (elseek (fd
, pos
, SEEK_SET
, pretty_filename
) < 0)
666 bytes_read
= safe_read (fd
, buffer
, bytes_read
);
667 if (bytes_read
== SAFE_READ_ERROR
)
669 error (0, errno
, _("error reading %s"), quoteaf (pretty_filename
));
673 /* n_lines == 0 case needs special treatment. */
674 const bool all_lines
= !n_lines
;
676 /* Count the incomplete line on files that don't end with a newline. */
677 if (n_lines
&& bytes_read
&& buffer
[bytes_read
- 1] != line_end
)
682 /* Scan backward, counting the newlines in this bufferfull. */
684 size_t n
= bytes_read
;
692 nl
= memrchr (buffer
, line_end
, n
);
700 /* If necessary, restore the file pointer and copy
701 input to output up to position, POS. */
704 enum Copy_fd_status err
;
705 if (elseek (fd
, start_pos
, SEEK_SET
, pretty_filename
) < 0)
708 err
= copy_fd (fd
, pos
- start_pos
);
709 if (err
!= COPY_FD_OK
)
711 diagnose_copy_fd_failure (err
, pretty_filename
);
716 /* Output the initial portion of the buffer
717 in which we found the desired newline byte. */
718 xwrite_stdout (buffer
, n
+ 1);
720 /* Set file pointer to the byte after what we've output. */
721 return 0 <= elseek (fd
, pos
+ n
+ 1, SEEK_SET
, pretty_filename
);
725 /* Not enough newlines in that bufferfull. */
726 if (pos
== start_pos
)
728 /* Not enough lines in the file. */
732 if (elseek (fd
, pos
, SEEK_SET
, pretty_filename
) < 0)
735 bytes_read
= safe_read (fd
, buffer
, BUFSIZ
);
736 if (bytes_read
== SAFE_READ_ERROR
)
738 error (0, errno
, _("error reading %s"), quoteaf (pretty_filename
));
742 /* FIXME: is this dead code?
743 Consider the test, pos == start_pos, above. */
749 /* For the file FILENAME with descriptor FD, output all but the last N_ELIDE
750 lines. If SIZE is nonnegative, this is a regular file positioned
751 at START_POS with SIZE bytes. Return true on success.
752 Give a diagnostic and return nonzero upon error. */
755 elide_tail_lines_file (char const *filename
, int fd
, uintmax_t n_elide
,
756 struct stat
const *st
, off_t current_pos
)
758 off_t size
= st
->st_size
;
759 if (presume_input_pipe
|| current_pos
< 0 || size
<= STP_BLKSIZE (st
))
760 return elide_tail_lines_pipe (filename
, fd
, n_elide
, current_pos
);
763 /* Find the offset, OFF, of the Nth newline from the end,
764 but not counting the last byte of the file.
765 If found, write from current position to OFF, inclusive.
766 Otherwise, just return true. */
768 return (size
<= current_pos
769 || elide_tail_lines_seekable (filename
, fd
, n_elide
,
775 head_bytes (char const *filename
, int fd
, uintmax_t bytes_to_write
)
778 size_t bytes_to_read
= BUFSIZ
;
780 while (bytes_to_write
)
783 if (bytes_to_write
< bytes_to_read
)
784 bytes_to_read
= bytes_to_write
;
785 bytes_read
= safe_read (fd
, buffer
, bytes_to_read
);
786 if (bytes_read
== SAFE_READ_ERROR
)
788 error (0, errno
, _("error reading %s"), quoteaf (filename
));
793 xwrite_stdout (buffer
, bytes_read
);
794 bytes_to_write
-= bytes_read
;
800 head_lines (char const *filename
, int fd
, uintmax_t lines_to_write
)
804 while (lines_to_write
)
806 size_t bytes_read
= safe_read (fd
, buffer
, BUFSIZ
);
807 size_t bytes_to_write
= 0;
809 if (bytes_read
== SAFE_READ_ERROR
)
811 error (0, errno
, _("error reading %s"), quoteaf (filename
));
816 while (bytes_to_write
< bytes_read
)
817 if (buffer
[bytes_to_write
++] == line_end
&& --lines_to_write
== 0)
819 off_t n_bytes_past_EOL
= bytes_read
- bytes_to_write
;
820 /* If we have read more data than that on the specified number
821 of lines, try to seek back to the position we would have
822 gotten to had we been reading one byte at a time. */
823 if (lseek (fd
, -n_bytes_past_EOL
, SEEK_CUR
) < 0)
826 if (fstat (fd
, &st
) != 0 || S_ISREG (st
.st_mode
))
827 elseek (fd
, -n_bytes_past_EOL
, SEEK_CUR
, filename
);
831 xwrite_stdout (buffer
, bytes_to_write
);
837 head (char const *filename
, int fd
, uintmax_t n_units
, bool count_lines
,
841 write_header (filename
);
845 off_t current_pos
= -1;
847 if (fstat (fd
, &st
) != 0)
849 error (0, errno
, _("cannot fstat %s"),
853 if (! presume_input_pipe
&& usable_st_size (&st
))
855 current_pos
= elseek (fd
, 0, SEEK_CUR
, filename
);
860 return elide_tail_lines_file (filename
, fd
, n_units
, &st
, current_pos
);
862 return elide_tail_bytes_file (filename
, fd
, n_units
, &st
, current_pos
);
865 return head_lines (filename
, fd
, n_units
);
867 return head_bytes (filename
, fd
, n_units
);
871 head_file (char const *filename
, uintmax_t n_units
, bool count_lines
,
876 bool is_stdin
= STREQ (filename
, "-");
880 have_read_stdin
= true;
882 filename
= _("standard input");
883 xset_binary_mode (STDIN_FILENO
, O_BINARY
);
887 fd
= open (filename
, O_RDONLY
| O_BINARY
);
890 error (0, errno
, _("cannot open %s for reading"), quoteaf (filename
));
895 ok
= head (filename
, fd
, n_units
, count_lines
, elide_from_end
);
896 if (!is_stdin
&& close (fd
) != 0)
898 error (0, errno
, _("failed to close %s"), quoteaf (filename
));
904 /* Convert a string of decimal digits, N_STRING, with an optional suffix
905 to an integral value. Upon successful conversion,
906 return that value. If it cannot be converted, give a diagnostic and exit.
907 COUNT_LINES indicates whether N_STRING is a number of bytes or a number
908 of lines. It is used solely to give a more specific diagnostic. */
911 string_to_integer (bool count_lines
, char const *n_string
)
913 return xdectoumax (n_string
, 0, UINTMAX_MAX
, "bkKmMGTPEZYRQ0",
914 count_lines
? _("invalid number of lines")
915 : _("invalid number of bytes"), 0);
919 main (int argc
, char **argv
)
921 enum header_mode header_mode
= multiple_files
;
926 /* Number of items to print. */
927 uintmax_t n_units
= DEFAULT_NUMBER
;
929 /* If true, interpret the numeric argument as the number of lines.
930 Otherwise, interpret it as the number of bytes. */
931 bool count_lines
= true;
933 /* Elide the specified number of lines or bytes, counting from
934 the end of the file. */
935 bool elide_from_end
= false;
937 /* Initializer for file_list if no file-arguments
938 were specified on the command line. */
939 static char const *const default_file_list
[] = {"-", nullptr};
940 char const *const *file_list
;
942 initialize_main (&argc
, &argv
);
943 set_program_name (argv
[0]);
944 setlocale (LC_ALL
, "");
945 bindtextdomain (PACKAGE
, LOCALEDIR
);
946 textdomain (PACKAGE
);
948 atexit (close_stdout
);
950 have_read_stdin
= false;
952 print_headers
= false;
956 if (1 < argc
&& argv
[1][0] == '-' && ISDIGIT (argv
[1][1]))
959 char *n_string
= ++a
;
961 char multiplier_char
= 0;
963 /* Old option syntax; a dash, one or more digits, and one or
964 more option letters. Move past the number. */
966 while (ISDIGIT (*a
));
968 /* Pointer to the byte after the last digit. */
971 /* Parse any appended option letters. */
985 multiplier_char
= *a
;
997 header_mode
= always
;
1005 error (0, 0, _("invalid trailing option -- %c"), *a
);
1006 usage (EXIT_FAILURE
);
1010 /* Append the multiplier character (if any) onto the end of
1011 the digit string. Then add NUL byte if necessary. */
1012 *end_n_string
= multiplier_char
;
1013 if (multiplier_char
)
1014 *(++end_n_string
) = 0;
1016 n_units
= string_to_integer (count_lines
, n_string
);
1018 /* Make the options we just parsed invisible to getopt. */
1024 while ((c
= getopt_long (argc
, argv
, "c:n:qvz0123456789",
1025 long_options
, nullptr))
1030 case PRESUME_INPUT_PIPE_OPTION
:
1031 presume_input_pipe
= true;
1035 count_lines
= false;
1036 elide_from_end
= (*optarg
== '-');
1039 n_units
= string_to_integer (count_lines
, optarg
);
1044 elide_from_end
= (*optarg
== '-');
1047 n_units
= string_to_integer (count_lines
, optarg
);
1051 header_mode
= never
;
1055 header_mode
= always
;
1062 case_GETOPT_HELP_CHAR
;
1064 case_GETOPT_VERSION_CHAR (PROGRAM_NAME
, AUTHORS
);
1068 error (0, 0, _("invalid trailing option -- %c"), c
);
1069 usage (EXIT_FAILURE
);
1073 if (header_mode
== always
1074 || (header_mode
== multiple_files
&& optind
< argc
- 1))
1075 print_headers
= true;
1077 if ( ! count_lines
&& elide_from_end
&& OFF_T_MAX
< n_units
)
1079 char umax_buf
[INT_BUFSIZE_BOUND (n_units
)];
1080 error (EXIT_FAILURE
, EOVERFLOW
, "%s: %s", _("invalid number of bytes"),
1081 quote (umaxtostr (n_units
, umax_buf
)));
1084 file_list
= (optind
< argc
1085 ? (char const *const *) &argv
[optind
]
1086 : default_file_list
);
1088 xset_binary_mode (STDOUT_FILENO
, O_BINARY
);
1090 for (i
= 0; file_list
[i
]; ++i
)
1091 ok
&= head_file (file_list
[i
], n_units
, count_lines
, elide_from_end
);
1093 if (have_read_stdin
&& close (STDIN_FILENO
) < 0)
1094 error (EXIT_FAILURE
, errno
, "-");
1096 return ok
? EXIT_SUCCESS
: EXIT_FAILURE
;