diff options
Diffstat (limited to 'toys/posix/wc.c')
-rw-r--r-- | toys/posix/wc.c | 126 |
1 files changed, 61 insertions, 65 deletions
diff --git a/toys/posix/wc.c b/toys/posix/wc.c index 3896b73a..19ba4b8b 100644 --- a/toys/posix/wc.c +++ b/toys/posix/wc.c @@ -1,6 +1,4 @@ -/* vi: set sw=4 ts=4: - * - * wc.c - Word count +/* wc.c - Word count * * Copyright 2011 Rob Landley <rob@landley.net> * @@ -9,90 +7,88 @@ USE_WC(NEWTOY(wc, "mcwl", TOYFLAG_USR|TOYFLAG_BIN)) config WC - bool "wc" - default y - help - usage: wc -lwcm [FILE...] + bool "wc" + default y + help + usage: wc -lwcm [FILE...] - Count lines, words, and characters in input. + Count lines, words, and characters in input. - -l show lines - -w show words - -c show bytes - -m show characters + -l show lines + -w show words + -c show bytes + -m show characters - By default outputs lines, words, bytes, and filename for each - argument (or from stdin if none). Displays only either bytes - or characters. + By default outputs lines, words, bytes, and filename for each + argument (or from stdin if none). Displays only either bytes + or characters. */ #define FOR_wc #include "toys.h" GLOBALS( - unsigned long totals[3]; + unsigned long totals[3]; ) static void show_lengths(unsigned long *lengths, char *name) { - int i, nospace = 1; - for (i=0; i<3; i++) { - if (!toys.optflags || (toys.optflags&(1<<i))) { - xprintf(" %ld"+nospace, lengths[i]); - nospace = 0; - } - TT.totals[i] += lengths[i]; - } - if (*toys.optargs) xprintf(" %s", name); - xputc('\n'); + int i, nospace = 1; + for (i=0; i<3; i++) { + if (!toys.optflags || (toys.optflags&(1<<i))) { + xprintf(" %ld"+nospace, lengths[i]); + nospace = 0; + } + TT.totals[i] += lengths[i]; + } + if (*toys.optargs) xprintf(" %s", name); + xputc('\n'); } static void do_wc(int fd, char *name) { - int i, len, clen=1, space; - wchar_t wchar; - unsigned long word=0, lengths[]={0,0,0}; + int i, len, clen=1, space; + wchar_t wchar; + 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+=clen) { - if(toys.optflags&8) { - clen = mbrtowc(&wchar, toybuf+i, len-i, 0); - if(clen==(size_t)(-1)) { - if(i!=len-1) { - clen = 1; - continue; - } - else break; - } - if(clen==(size_t)(-2)) break; - if(clen==0) clen=1; - space = iswspace(wchar); - } - else space = isspace(toybuf[i]); + 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+=clen) { + if(toys.optflags&8) { + clen = mbrtowc(&wchar, toybuf+i, len-i, 0); + if(clen==(size_t)(-1)) { + if(i!=len-1) { + clen = 1; + continue; + } else break; + } + if(clen==(size_t)(-2)) break; + if(clen==0) clen=1; + space = iswspace(wchar); + } else space = isspace(toybuf[i]); - if (toybuf[i]==10) lengths[0]++; - if (space) word=0; - else { - if (!word) lengths[1]++; - word=1; - } - lengths[2]++; - } - } + if (toybuf[i]==10) lengths[0]++; + if (space) word=0; + else { + if (!word) lengths[1]++; + word=1; + } + lengths[2]++; + } + } - show_lengths(lengths, name); + show_lengths(lengths, name); } void wc_main(void) { - setlocale(LC_ALL, ""); - toys.optflags |= (toys.optflags&8)>>1; - loopfiles(toys.optargs, do_wc); - if (toys.optc>1) show_lengths(TT.totals, "total"); + setlocale(LC_ALL, ""); + toys.optflags |= (toys.optflags&8)>>1; + loopfiles(toys.optargs, do_wc); + if (toys.optc>1) show_lengths(TT.totals, "total"); } |