From 77997b8e774318631b373a443dc073d3b38b5d84 Mon Sep 17 00:00:00 2001 From: Ilya Kuzmich Date: Sun, 28 May 2017 18:29:19 +0300 Subject: teach head -c Not POSIX, but implemented in coreutils, busybox and freebsd. --- toys/posix/head.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'toys/posix/head.c') diff --git a/toys/posix/head.c b/toys/posix/head.c index 63eb85b0..6153b42f 100644 --- a/toys/posix/head.c +++ b/toys/posix/head.c @@ -3,8 +3,9 @@ * Copyright 2006 Timothy Elliott * * See http://opengroup.org/onlinepubs/9699919799/utilities/head.html + * See http://man7.org/linux/man-pages/man1/head.1.html -USE_HEAD(NEWTOY(head, "?n#<0=10qv", TOYFLAG_USR|TOYFLAG_BIN)) +USE_HEAD(NEWTOY(head, "?n#<0=10c#<0qv[-nc]", TOYFLAG_USR|TOYFLAG_BIN)) config HEAD bool "head" @@ -16,6 +17,7 @@ config HEAD 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 */ @@ -24,13 +26,14 @@ config HEAD #include "toys.h" GLOBALS( + long bytes; long lines; int file_no; ) static void do_head(int fd, char *name) { - int i, len, lines=TT.lines, size=sizeof(toybuf); + int i, len, lines=TT.lines, bytes=TT.bytes; if ((toys.optc > 1 && !(toys.optflags & FLAG_q)) || toys.optflags & FLAG_v) { // Print an extra newline for all but the first file @@ -39,12 +42,16 @@ static void do_head(int fd, char *name) xflush(); } - while (lines) { - len = read(fd, toybuf, size); + while (toys.optflags & FLAG_c ? bytes : lines) { + len = read(fd, toybuf, sizeof(toybuf)); if (len<0) perror_msg_raw(name); if (len<1) break; - for(i=0; i= len ? len : bytes; + bytes -= i; + } else + for(i=0; i