1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /* head.c - copy first lines from input to stdout.
- *
- * Copyright 2006 Timothy Elliott <tle@holymonkey.com>
- *
- * See http://opengroup.org/onlinepubs/9699919799/utilities/head.html
- *
- * Deviations from posix: -c
- USE_HEAD(NEWTOY(head, "?n(lines)#<0=10c(bytes)#<0qv[-nc]", TOYFLAG_USR|TOYFLAG_BIN))
- config HEAD
- bool "head"
- default y
- help
- usage: head [-n NUM] [FILE...]
- Copy first lines from files to stdout. If no files listed, copy from
- stdin. Filename "-" is a synonym for stdin.
- -n Number of lines to copy
- -c Number of bytes to copy
- -q Never print headers
- -v Always print headers
- */
- #define FOR_head
- #include "toys.h"
- GLOBALS(
- long c, n;
- int file_no;
- )
- static void do_head(int fd, char *name)
- {
- long i, len, lines=TT.n, bytes=TT.c;
- if ((toys.optc > 1 && !FLAG(q)) || FLAG(v)) {
- // Print an extra newline for all but the first file
- if (TT.file_no) xprintf("\n");
- xprintf("==> %s <==\n", name);
- }
- while (FLAG(c) ? bytes : lines) {
- len = read(fd, toybuf, sizeof(toybuf));
- if (len<0) perror_msg_raw(name);
- if (len<1) break;
- if (bytes) {
- i = bytes >= len ? len : bytes;
- bytes -= i;
- } else for(i=0; i<len;) if (toybuf[i++] == '\n' && !--lines) break;
- xwrite(1, toybuf, i);
- }
- TT.file_no++;
- }
- void head_main(void)
- {
- char *arg = *toys.optargs;
- // handle old "-42" style arguments
- if (arg && *arg == '-' && arg[1]) {
- TT.n = atolx(arg+1);
- toys.optc--;
- } else arg = 0;
- loopfiles(toys.optargs+!!arg, do_head);
- }
|