diff options
author | Rob Landley <rob@landley.net> | 2011-11-17 07:26:22 -0600 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2011-11-17 07:26:22 -0600 |
commit | f8a333e3c002e05966fb3ec13029f528df7a892d (patch) | |
tree | 35d890d869be5ed7bfc9cf84118baf6b50abca01 | |
parent | 1208ca7ac8ec14cb32ad42e2ef550e4ae464dc42 (diff) | |
download | toybox-f8a333e3c002e05966fb3ec13029f528df7a892d.tar.gz |
Add wc.
-rw-r--r-- | toys/wc.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/toys/wc.c b/toys/wc.c new file mode 100644 index 00000000..81fde800 --- /dev/null +++ b/toys/wc.c @@ -0,0 +1,60 @@ +/* vi: set sw=4 ts=4: + * + * wc.c - Word countA hello world program. + * + * Copyright 2011Rob Landley <rob@landley.net> + * + * See http://opengroup.org/onlinepubs/9699919799/utilities/wc.html + +USE_WC(NEWTOY(wc, "cwl", TOYFLAG_USR|TOYFLAG_BIN)) + +config WC + bool "wc" + default y + help + usage: wc -lwc [FILE...] + + Count lines, words, and characters in input. + + -l show lines + -w show words + -c show characters + + By default outputs lines, words, characters, and filename for each + argument (or from stdin if none). +*/ + +#include "toys.h" + +static void do_wc(int fd, char *name) +{ + int i, len; + unsigned long word=0, lengths[]={0,0,0}; + + for (;;) { + len = read(fd, toybuf, sizeof(toybuf)); + if (len<0) { + perror_msg("%s",name); + toys.exitval = EXIT_FAILURE; + } + if (len<1) break; + for (i=0; i<len; i++) { + if (toybuf[i]==10) lengths[0]++; + if (isspace(toybuf[i])) word=0; + else { + if (!word) lengths[1]++; + word=1; + } + lengths[2]++; + } + } + for (i=0; i<3; i++) + if (!toys.optflags || (toys.optflags&(1<<i))) + printf("%ld ", lengths[i]); + printf("%s\n", (!toys.optflags && strcmp(name,"-")) ? name : ""); +} + +void wc_main(void) +{ + loopfiles(toys.optargs, do_wc); +} |