From 1abba7db3df9cd4b7e86355504d39a29312ebedb Mon Sep 17 00:00:00 2001 From: Ilya Kuzmich Date: Sun, 28 May 2017 17:03:26 +0300 Subject: teach head -v and -q Not POSIX, but implemented in coreutils and busybox. Tests use sed to compensate for the stdin naming difference. Signed-off-by: Ilya Kuzmich --- tests/head.test | 10 ++++++++++ toys/posix/head.c | 10 +++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/tests/head.test b/tests/head.test index 83d93996..6ed027c4 100755 --- a/tests/head.test +++ b/tests/head.test @@ -11,9 +11,19 @@ testing "-number" "head -2 input && echo yes" "one\ntwo\nyes\n" \ "one\ntwo\nthree\nfour" "" testing "head, default lines" "head" "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" "" "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12" +# coreutils & busybox name stdin as "standard input", toybox uses "-" +testing "-v file" "head -v -n 1 input" "==> input <==\none\n" "one\ntwo\n" "" +testing "-v stdin" "head -v -n 1 | sed 's/==> standard input <==/==> - <==/'" \ + "==> - <==\none\n" "" "one\ntwo\n" + +testing "file and stdin" "head -n 1 input - | sed 's/==> standard input <==/==> - <==/'" \ + "==> input <==\none\n\n==> - <==\nfoo\n" "one\ntwo\n" "foo\nbar\n" + echo "foo bar baz" > file1 testing "head, multiple files" "head -n 2 input file1" "==> input <==\none\ntwo\n\n==> file1 <==\nfoo\nbar\n" "one\ntwo\nthree\n" "" +testing "-q, multiple files" "head -q -n 2 input file1" "one\ntwo\nfoo\nbar\n" \ + "one\ntwo\nthree\n" "" rm file1 diff --git a/toys/posix/head.c b/toys/posix/head.c index e3d78866..63eb85b0 100644 --- a/toys/posix/head.c +++ b/toys/posix/head.c @@ -4,7 +4,7 @@ * * See http://opengroup.org/onlinepubs/9699919799/utilities/head.html -USE_HEAD(NEWTOY(head, "?n#<0=10", TOYFLAG_USR|TOYFLAG_BIN)) +USE_HEAD(NEWTOY(head, "?n#<0=10qv", TOYFLAG_USR|TOYFLAG_BIN)) config HEAD bool "head" @@ -16,6 +16,8 @@ config HEAD stdin. Filename "-" is a synonym for stdin. -n Number of lines to copy + -q Never print headers + -v Always print headers */ #define FOR_head @@ -30,9 +32,9 @@ static void do_head(int fd, char *name) { int i, len, lines=TT.lines, size=sizeof(toybuf); - if (toys.optc > 1) { + if ((toys.optc > 1 && !(toys.optflags & FLAG_q)) || toys.optflags & FLAG_v) { // Print an extra newline for all but the first file - if (TT.file_no++) xprintf("\n"); + if (TT.file_no) xprintf("\n"); xprintf("==> %s <==\n", name); xflush(); } @@ -46,6 +48,8 @@ static void do_head(int fd, char *name) xwrite(1, toybuf, i); } + + TT.file_no++; } void head_main(void) -- cgit v1.2.3