xref: /xv6-public/wc.c (revision 8960f60b)
176f09d7dSrsc #include "types.h"
276f09d7dSrsc #include "stat.h"
376f09d7dSrsc #include "user.h"
476f09d7dSrsc 
576f09d7dSrsc char buf[512];
676f09d7dSrsc 
776f09d7dSrsc void
wc(int fd,char * name)876f09d7dSrsc wc(int fd, char *name)
976f09d7dSrsc {
1076f09d7dSrsc   int i, n;
1176f09d7dSrsc   int l, w, c, inword;
1276f09d7dSrsc 
1376f09d7dSrsc   l = w = c = 0;
1476f09d7dSrsc   inword = 0;
1576f09d7dSrsc   while((n = read(fd, buf, sizeof(buf))) > 0){
1676f09d7dSrsc     for(i=0; i<n; i++){
1776f09d7dSrsc       c++;
1876f09d7dSrsc       if(buf[i] == '\n')
1976f09d7dSrsc         l++;
2076f09d7dSrsc       if(strchr(" \r\t\n\v", buf[i]))
2176f09d7dSrsc         inword = 0;
2276f09d7dSrsc       else if(!inword){
2376f09d7dSrsc         w++;
2476f09d7dSrsc         inword = 1;
2576f09d7dSrsc       }
2676f09d7dSrsc     }
2776f09d7dSrsc   }
2876f09d7dSrsc   if(n < 0){
2976f09d7dSrsc     printf(1, "wc: read error\n");
3076f09d7dSrsc     exit();
3176f09d7dSrsc   }
3276f09d7dSrsc   printf(1, "%d %d %d %s\n", l, w, c, name);
3376f09d7dSrsc }
3476f09d7dSrsc 
3576f09d7dSrsc int
main(int argc,char * argv[])3676f09d7dSrsc main(int argc, char *argv[])
3776f09d7dSrsc {
3876f09d7dSrsc   int fd, i;
3976f09d7dSrsc 
4076f09d7dSrsc   if(argc <= 1){
4176f09d7dSrsc     wc(0, "");
4276f09d7dSrsc     exit();
4376f09d7dSrsc   }
4476f09d7dSrsc 
4576f09d7dSrsc   for(i = 1; i < argc; i++){
4676f09d7dSrsc     if((fd = open(argv[i], 0)) < 0){
47*8960f60bSRobert Morris       printf(1, "wc: cannot open %s\n", argv[i]);
4876f09d7dSrsc       exit();
4976f09d7dSrsc     }
5076f09d7dSrsc     wc(fd, argv[i]);
5176f09d7dSrsc     close(fd);
5276f09d7dSrsc   }
5376f09d7dSrsc   exit();
5476f09d7dSrsc }
55