diff options
author | rsc <rsc> | 2007-08-28 04:20:40 +0000 |
---|---|---|
committer | rsc <rsc> | 2007-08-28 04:20:40 +0000 |
commit | 76f09d7dd00f84bf69f7b83983c3b4843223f616 (patch) | |
tree | 030b3ea76e9010c3f614157d87c37ac156e12b1e /wc.c | |
parent | a1af36650054eb683233105749bfa2169d20042d (diff) | |
download | xv6-labs-76f09d7dd00f84bf69f7b83983c3b4843223f616.tar.gz xv6-labs-76f09d7dd00f84bf69f7b83983c3b4843223f616.tar.bz2 xv6-labs-76f09d7dd00f84bf69f7b83983c3b4843223f616.zip |
clean up Makefile; add wc
Diffstat (limited to 'wc.c')
-rw-r--r-- | wc.c | 54 |
1 files changed, 54 insertions, 0 deletions
@@ -0,0 +1,54 @@ +#include "types.h" +#include "stat.h" +#include "user.h" + +char buf[512]; + +void +wc(int fd, char *name) +{ + int i, n; + int l, w, c, inword; + + l = w = c = 0; + inword = 0; + while((n = read(fd, buf, sizeof(buf))) > 0){ + for(i=0; i<n; i++){ + c++; + if(buf[i] == '\n') + l++; + if(strchr(" \r\t\n\v", buf[i])) + inword = 0; + else if(!inword){ + w++; + inword = 1; + } + } + } + if(n < 0){ + printf(1, "wc: read error\n"); + exit(); + } + printf(1, "%d %d %d %s\n", l, w, c, name); +} + +int +main(int argc, char *argv[]) +{ + int fd, i; + + if(argc <= 1) { + wc(0, ""); + exit(); + } + + for(i = 1; i < argc; i++){ + if((fd = open(argv[i], 0)) < 0){ + printf(1, "cat: cannot open %s\n", argv[i]); + exit(); + } + wc(fd, argv[i]); + close(fd); + } + exit(); +} |