pinky: fix string size calculation
[coreutils.git] / src / head.c
bloba61584f931da5d3505f29840ea22551014f3bbd6
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
19 ''-'' is encountered.
20 By default, filename headers are printed only if more than one file
21 is given.
22 By default, prints the first 10 lines (head -n 10).
24 David MacKenzie <djm@gnu.ai.mit.edu> */
26 #include <config.h>
28 #include <stdio.h>
29 #include <getopt.h>
30 #include <sys/types.h>
32 #include "system.h"
34 #include "assure.h"
35 #include "full-read.h"
36 #include "quote.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"
45 #define AUTHORS \
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. */
62 static char line_end;
64 /* When to print the filename banners. */
65 enum header_mode
67 multiple_files, always, never
70 /* Have we ever read standard input? */
71 static bool have_read_stdin;
73 enum Copy_fd_status
75 COPY_FD_OK = 0,
76 COPY_FD_READ_ERROR,
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. */
82 enum
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}
102 void
103 usage (int status)
105 if (status != EXIT_SUCCESS)
106 emit_try_help ();
107 else
109 printf (_("\
110 Usage: %s [OPTION]... [FILE]...\n\
112 program_name);
113 printf (_("\
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\
116 "), DEFAULT_NUMBER);
118 emit_stdin_note ();
119 emit_mandatory_arg_note ();
121 printf (_("\
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\
128 "), DEFAULT_NUMBER);
129 fputs (_("\
130 -q, --quiet, --silent never print headers giving file names\n\
131 -v, --verbose always print headers giving file names\n\
132 "), stdout);
133 fputs (_("\
134 -z, --zero-terminated line delimiter is NUL, not newline\n\
135 "), stdout);
136 fputs (HELP_OPTION_DESCRIPTION, stdout);
137 fputs (VERSION_OPTION_DESCRIPTION, stdout);
138 fputs (_("\
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\
144 "), stdout);
145 emit_ancillary_info (PROGRAM_NAME);
147 exit (status);
150 static void
151 diagnose_copy_fd_failure (enum Copy_fd_status err, char const *filename)
153 switch (err)
155 case COPY_FD_READ_ERROR:
156 error (0, errno, _("error reading %s"), quoteaf (filename));
157 break;
158 case COPY_FD_UNEXPECTED_EOF:
159 error (0, errno, _("%s: file has shrunk too much"), quotef (filename));
160 break;
161 default:
162 affirm (false);
166 static void
167 write_header (char const *filename)
169 static bool first_file = true;
171 printf ("%s==> %s <==\n", (first_file ? "" : "\n"), filename);
172 first_file = false;
175 /* Write N_BYTES from BUFFER to stdout.
176 Exit immediately on error with a single diagnostic. */
178 static void
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 fpurge (stdout);
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)
196 char buf[BUFSIZ];
197 const size_t buf_size = sizeof (buf);
199 /* Copy the file contents. */
200 while (0 < n_bytes)
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;
207 n_bytes -= n_read;
209 if (n_read == 0 && n_bytes != 0)
210 return COPY_FD_UNEXPECTED_EOF;
212 xwrite_stdout (buf, n_read);
215 return COPY_FD_OK;
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. */
223 static off_t
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)];
229 if (new_offset < 0)
230 error (0, errno,
231 _(whence == SEEK_SET
232 ? N_("%s: cannot seek to offset %s")
233 : N_("%s: cannot seek to relative offset %s")),
234 quotef (filename),
235 offtostr (offset, buf));
237 return new_offset;
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. */
247 static bool
248 elide_tail_bytes_pipe (char const *filename, int fd, uintmax_t n_elide_0,
249 off_t current_pos)
251 size_t n_elide = n_elide_0;
252 uintmax_t desired_pos = current_pos;
253 bool ok = true;
255 #ifndef HEAD_TAIL_PIPE_READ_BUFSIZE
256 # define HEAD_TAIL_PIPE_READ_BUFSIZE BUFSIZ
257 #endif
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
266 #endif
268 #if HEAD_TAIL_PIPE_BYTECOUNT_THRESHOLD < 2 * READ_BUFSIZE
269 "HEAD_TAIL_PIPE_BYTECOUNT_THRESHOLD must be at least 2 * READ_BUFSIZE"
270 #endif
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)
292 bool first = true;
293 bool eof = false;
294 size_t n_to_read = READ_BUFSIZE + n_elide;
295 bool i;
296 char *b[2];
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);
303 size_t delta = 0;
304 if (n_read < n_to_read)
306 if (errno != 0)
308 error (0, errno, _("error reading %s"), quoteaf (filename));
309 ok = false;
310 break;
313 /* reached EOF */
314 if (n_read <= n_elide)
316 if (first)
318 /* The input is no larger than the number of bytes
319 to elide. So there's nothing to output, and
320 we're done. */
322 else
324 delta = n_elide - n_read;
327 eof = true;
330 /* Output any (but maybe just part of the) elided data from
331 the previous round. */
332 if (! first)
334 desired_pos += n_elide - delta;
335 xwrite_stdout (b[!i] + READ_BUFSIZE, n_elide - delta);
337 first = false;
339 if (n_elide < n_read)
341 desired_pos += n_read - n_elide;
342 xwrite_stdout (b[i], n_read - n_elide);
346 free (b[0]);
348 else
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. */
353 bool eof = false;
354 size_t n_read;
355 bool buffered_enough;
356 size_t i, i_next;
357 char **b = nullptr;
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;
362 size_t n_alloc = 0;
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)
374 n_array_alloc *= 2;
375 else
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);
383 n_alloc = i + 1;
385 n_read = full_read (fd, b[i], READ_BUFSIZE);
386 if (n_read < READ_BUFSIZE)
388 if (errno != 0)
390 error (0, errno, _("error reading %s"), quoteaf (filename));
391 ok = false;
392 goto free_mem;
394 eof = true;
397 if (i + 1 == n_bufs)
398 buffered_enough = true;
400 if (buffered_enough)
402 desired_pos += n_read;
403 xwrite_stdout (b[i_next], n_read);
407 /* Output any remainder: rem bytes from b[i] + n_read. */
408 if (rem)
410 if (buffered_enough)
412 size_t n_bytes_left_in_b_i = READ_BUFSIZE - n_read;
413 desired_pos += rem;
414 if (rem < n_bytes_left_in_b_i)
416 xwrite_stdout (b[i] + n_read, rem);
418 else
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.
428 |READ_BUF.|
429 | | rem |
430 |---------!---------!---------!---------|
431 |---- n_elide ---------|
432 | | x |
433 | |y |
434 |---- file size -----------|
435 | |n_read|
436 |---- n_elide_round ----------|
438 size_t y = READ_BUFSIZE - rem;
439 size_t x = n_read - y;
440 desired_pos += x;
441 xwrite_stdout (b[i_next], x);
445 free_mem:
446 for (i = 0; i < n_alloc; i++)
447 free (b[i]);
448 free (b);
451 if (0 <= current_pos && elseek (fd, desired_pos, SEEK_SET, filename) < 0)
452 ok = false;
453 return ok;
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. */
464 static bool
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);
471 else
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)
479 return true;
481 enum Copy_fd_status err = copy_fd (fd, bytes_remaining - n_elide);
482 if (err == COPY_FD_OK)
483 return true;
485 diagnose_copy_fd_failure (err, filename);
486 return false;
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. */
497 static bool
498 elide_tail_lines_pipe (char const *filename, int fd, uintmax_t n_elide,
499 off_t current_pos)
501 struct linebuffer
503 char buffer[BUFSIZ + 1];
504 size_t nbytes;
505 size_t nlines;
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. */
512 bool ok = true;
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. */
523 while (true)
525 n_read = safe_read (fd, tmp->buffer, BUFSIZ);
526 if (n_read == 0 || n_read == SAFE_READ_ERROR)
527 break;
529 if (! n_elide)
531 desired_pos += n_read;
532 xwrite_stdout (tmp->buffer, n_read);
533 continue;
536 tmp->nbytes = n_read;
537 tmp->nlines = 0;
538 tmp->next = nullptr;
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)
547 ++p;
548 ++tmp->nlines;
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;
562 else
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
568 worthwhile. */
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);
574 tmp = first;
575 total_lines -= first->nlines;
576 first = first->next;
578 else
579 tmp = xmalloc (sizeof (LBUFFER));
583 free (tmp);
585 if (n_read == SAFE_READ_ERROR)
587 error (0, errno, _("error reading %s"), quoteaf (filename));
588 ok = false;
589 goto free_lbuffers;
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)
596 ++last->nlines;
597 ++total_lines;
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)))
615 ++p;
616 ++tmp->nlines;
617 --n;
619 desired_pos += p - tmp->buffer;
620 xwrite_stdout (tmp->buffer, p - tmp->buffer);
623 free_lbuffers:
624 while (first)
626 tmp = first->next;
627 free (first);
628 first = tmp;
631 if (0 <= current_pos && elseek (fd, desired_pos, SEEK_SET, filename) < 0)
632 ok = false;
633 return ok;
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. */
647 static bool
648 elide_tail_lines_seekable (char const *pretty_filename, int fd,
649 uintmax_t n_lines,
650 off_t start_pos, off_t size)
652 char buffer[BUFSIZ];
653 size_t bytes_read;
654 off_t pos = 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;
659 if (bytes_read == 0)
660 bytes_read = 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. */
663 pos -= bytes_read;
664 if (elseek (fd, pos, SEEK_SET, pretty_filename) < 0)
665 return false;
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));
670 return false;
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)
678 --n_lines;
680 while (true)
682 /* Scan backward, counting the newlines in this bufferfull. */
684 size_t n = bytes_read;
685 while (n)
687 if (all_lines)
688 n -= 1;
689 else
691 char const *nl;
692 nl = memrchr (buffer, line_end, n);
693 if (nl == nullptr)
694 break;
695 n = nl - buffer;
697 if (n_lines-- == 0)
699 /* Found it. */
700 /* If necessary, restore the file pointer and copy
701 input to output up to position, POS. */
702 if (start_pos < pos)
704 enum Copy_fd_status err;
705 if (elseek (fd, start_pos, SEEK_SET, pretty_filename) < 0)
706 return false;
708 err = copy_fd (fd, pos - start_pos);
709 if (err != COPY_FD_OK)
711 diagnose_copy_fd_failure (err, pretty_filename);
712 return false;
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. */
729 return true;
731 pos -= BUFSIZ;
732 if (elseek (fd, pos, SEEK_SET, pretty_filename) < 0)
733 return false;
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));
739 return false;
742 /* FIXME: is this dead code?
743 Consider the test, pos == start_pos, above. */
744 if (bytes_read == 0)
745 return true;
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. */
754 static bool
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);
761 else
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,
770 current_pos, size));
774 static bool
775 head_bytes (char const *filename, int fd, uintmax_t bytes_to_write)
777 char buffer[BUFSIZ];
778 size_t bytes_to_read = BUFSIZ;
780 while (bytes_to_write)
782 size_t bytes_read;
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));
789 return false;
791 if (bytes_read == 0)
792 break;
793 xwrite_stdout (buffer, bytes_read);
794 bytes_to_write -= bytes_read;
796 return true;
799 static bool
800 head_lines (char const *filename, int fd, uintmax_t lines_to_write)
802 char buffer[BUFSIZ];
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));
812 return false;
814 if (bytes_read == 0)
815 break;
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)
825 struct stat st;
826 if (fstat (fd, &st) != 0 || S_ISREG (st.st_mode))
827 elseek (fd, -n_bytes_past_EOL, SEEK_CUR, filename);
829 break;
831 xwrite_stdout (buffer, bytes_to_write);
833 return true;
836 static bool
837 head (char const *filename, int fd, uintmax_t n_units, bool count_lines,
838 bool elide_from_end)
840 if (print_headers)
841 write_header (filename);
843 if (elide_from_end)
845 off_t current_pos = -1;
846 struct stat st;
847 if (fstat (fd, &st) != 0)
849 error (0, errno, _("cannot fstat %s"),
850 quoteaf (filename));
851 return false;
853 if (! presume_input_pipe && usable_st_size (&st))
855 current_pos = elseek (fd, 0, SEEK_CUR, filename);
856 if (current_pos < 0)
857 return false;
859 if (count_lines)
860 return elide_tail_lines_file (filename, fd, n_units, &st, current_pos);
861 else
862 return elide_tail_bytes_file (filename, fd, n_units, &st, current_pos);
864 if (count_lines)
865 return head_lines (filename, fd, n_units);
866 else
867 return head_bytes (filename, fd, n_units);
870 static bool
871 head_file (char const *filename, uintmax_t n_units, bool count_lines,
872 bool elide_from_end)
874 int fd;
875 bool ok;
876 bool is_stdin = STREQ (filename, "-");
878 if (is_stdin)
880 have_read_stdin = true;
881 fd = STDIN_FILENO;
882 filename = _("standard input");
883 xset_binary_mode (STDIN_FILENO, O_BINARY);
885 else
887 fd = open (filename, O_RDONLY | O_BINARY);
888 if (fd < 0)
890 error (0, errno, _("cannot open %s for reading"), quoteaf (filename));
891 return false;
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));
899 return false;
901 return ok;
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. */
910 static uintmax_t
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;
922 bool ok = true;
923 int c;
924 size_t i;
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;
954 line_end = '\n';
956 if (1 < argc && argv[1][0] == '-' && ISDIGIT (argv[1][1]))
958 char *a = argv[1];
959 char *n_string = ++a;
960 char *end_n_string;
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. */
965 do ++a;
966 while (ISDIGIT (*a));
968 /* Pointer to the byte after the last digit. */
969 end_n_string = a;
971 /* Parse any appended option letters. */
972 for (; *a; a++)
974 switch (*a)
976 case 'c':
977 count_lines = false;
978 multiplier_char = 0;
979 break;
981 case 'b':
982 case 'k':
983 case 'm':
984 count_lines = false;
985 multiplier_char = *a;
986 break;
988 case 'l':
989 count_lines = true;
990 break;
992 case 'q':
993 header_mode = never;
994 break;
996 case 'v':
997 header_mode = always;
998 break;
1000 case 'z':
1001 line_end = '\0';
1002 break;
1004 default:
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. */
1019 argv[1] = argv[0];
1020 argv++;
1021 argc--;
1024 while ((c = getopt_long (argc, argv, "c:n:qvz0123456789",
1025 long_options, nullptr))
1026 != -1)
1028 switch (c)
1030 case PRESUME_INPUT_PIPE_OPTION:
1031 presume_input_pipe = true;
1032 break;
1034 case 'c':
1035 count_lines = false;
1036 elide_from_end = (*optarg == '-');
1037 if (elide_from_end)
1038 ++optarg;
1039 n_units = string_to_integer (count_lines, optarg);
1040 break;
1042 case 'n':
1043 count_lines = true;
1044 elide_from_end = (*optarg == '-');
1045 if (elide_from_end)
1046 ++optarg;
1047 n_units = string_to_integer (count_lines, optarg);
1048 break;
1050 case 'q':
1051 header_mode = never;
1052 break;
1054 case 'v':
1055 header_mode = always;
1056 break;
1058 case 'z':
1059 line_end = '\0';
1060 break;
1062 case_GETOPT_HELP_CHAR;
1064 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1066 default:
1067 if (ISDIGIT (c))
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;