aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Kuzmich <ilya.kuzmich@gmail.com>2017-05-28 17:03:26 +0300
committerRob Landley <rob@landley.net>2017-05-28 17:08:19 -0500
commit1abba7db3df9cd4b7e86355504d39a29312ebedb (patch)
treebdddadf4aa573f0d446bdb1a867ea6c271d735ae
parentcf2e8d08b3e06a7bdf95c30282a976bbf072a168 (diff)
downloadtoybox-1abba7db3df9cd4b7e86355504d39a29312ebedb.tar.gz
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 <ilya.kuzmich@gmail.com>
-rwxr-xr-xtests/head.test10
-rw-r--r--toys/posix/head.c10
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)