[Toybox] [PATCH v2 1/1] teach head -c
Ilya Kuzmich
ilya.kuzmich at gmail.com
Wed May 31 23:36:38 PDT 2017
ping?
On 29/05, Ilya Kuzmich wrote:
> Now i forgot c#<0 constraint. Whops.
> This is, hopefully, the last version.
> On 29/05, Ilya Kuzmich wrote:
> > v1 misses help text, v2 does not.
> > Sorry for the inconvenience.
> > On 28/05, Rob Landley wrote:
> > > On 05/28/2017 11:07 AM, Ilya Kuzmich wrote:
> > > > Not POSIX, but implemented in coreutils, busybox and freebsd.
> > >
> > > Again v1/v2...?
> > >
> > > Confused,
> > >
> > > Rob
> > > _______________________________________________
> > > Toybox mailing list
> > > Toybox at lists.landley.net
> > > http://lists.landley.net/listinfo.cgi/toybox-landley.net
> From 2dc24d2ad4507328c363a52291257af6b5d0b6f8 Mon Sep 17 00:00:00 2001
> From: Ilya Kuzmich <ilya.kuzmich at gmail.com>
> Date: Sun, 28 May 2017 18:29:19 +0300
> Subject: [PATCH] teach head -c
>
> Not POSIX, but implemented in coreutils, busybox and freebsd.
> ---
> tests/head.test | 4 ++++
> toys/posix/head.c | 17 ++++++++++++-----
> 2 files changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/tests/head.test b/tests/head.test
> index 6ed027c..4e4c01b 100755
> --- a/tests/head.test
> +++ b/tests/head.test
> @@ -27,3 +27,7 @@ testing "-q, multiple files" "head -q -n 2 input file1" "one\ntwo\nfoo\nbar\n" \
> "one\ntwo\nthree\n" ""
> rm file1
>
> +testing "-c 3" "head -c 3" "one" "" "one\ntwo"
> +testing "-c bigger than input" "head -c 3" "a" "" "a"
> +testing "-c 3 -n 1" "head -c 3 -n 1" "one\n" "" "one\ntwo"
> +testing "-n 1 -c 3" "head -n 1 -c 3" "one" "" "one\ntwo"
> diff --git a/toys/posix/head.c b/toys/posix/head.c
> index f5fd281..be6e109 100644
> --- a/toys/posix/head.c
> +++ b/toys/posix/head.c
> @@ -3,8 +3,9 @@
> * Copyright 2006 Timothy Elliott <tle at holymonkey.com>
> *
> * 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;) if (toybuf[i++] == '\n' && !--lines) 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);
> }
> --
> 2.7.4
>
More information about the Toybox
mailing list