|
|
1.1 ! root 1: #include <stdio.h> ! 2: ! 3: #define NBUF (64*1024) ! 4: int space[256]; ! 5: char *opt="lwc"; ! 6: long twords; ! 7: long tlines; ! 8: long tchars; ! 9: ! 10: main(argc, argv) ! 11: char *argv[]; ! 12: { ! 13: register i, fd, status=0; ! 14: if(argc>1 && argv[1][0]=='-'){ ! 15: opt=++argv[1]; ! 16: --argc, argv++; ! 17: } ! 18: for(i = 0; i < 256; i++) ! 19: space[i] = 0; ! 20: space[' '] = space['\t'] = space['\n'] = 1; ! 21: if(argc==1) ! 22: count(0, (char *)0); ! 23: else for(i=1; i<argc; i++){ ! 24: fd=open(argv[i], 0); ! 25: if(fd<0){ ! 26: fprintf(stderr, "wc: "); ! 27: perror(argv[i]); ! 28: status=1; ! 29: continue; ! 30: } ! 31: count(fd, argv[i]); ! 32: } ! 33: if(argc>2) ! 34: printout(tchars, twords, tlines, "total"); ! 35: return status; ! 36: } ! 37: unsigned char buf[NBUF+2]; /* 2 for sentinels */ ! 38: count(fd, name) ! 39: char *name; ! 40: { ! 41: register n; ! 42: register unsigned char *cp, *cpend; ! 43: register long chars=0, lines=0, words=0; ! 44: ! 45: for(;;){ ! 46: if((n=read(fd, buf, NBUF))<=0) ! 47: goto done; ! 48: chars+=n; ! 49: cp=buf; ! 50: *(cpend = buf+n) = ' '; ! 51: cpend[1] = 'a'; ! 52: dospace: ! 53: for(;;){ ! 54: if(*cp == '\n') ! 55: lines++; ! 56: if(space[*cp++] == 0){ ! 57: if(cp > cpend) ! 58: break; ! 59: goto doword; ! 60: } ! 61: } ! 62: } ! 63: for(;;){ ! 64: if((n=read(fd, buf, NBUF))<=0) ! 65: goto done; ! 66: chars+=n; ! 67: cp=buf; ! 68: *(cpend = buf+n) = ' '; ! 69: cpend[1] = 'a'; ! 70: doword: ! 71: for(;;){ ! 72: if(space[*cp++]){ ! 73: if(cp > cpend) ! 74: break; ! 75: words++; ! 76: if(cp[-1] == '\n') ! 77: lines++; ! 78: goto dospace; ! 79: } ! 80: } ! 81: } ! 82: done: ! 83: close(fd); ! 84: printout(chars, words, lines, name); ! 85: tchars+=chars; ! 86: twords+=words; ! 87: tlines+=lines; ! 88: } ! 89: printout(charct, wordct, linect, name) ! 90: long charct, wordct, linect; ! 91: char *name; ! 92: { ! 93: register char *wd=opt; ! 94: while (*wd) switch (*wd++) { ! 95: case 'l': ! 96: printf("%7ld ", linect); ! 97: break; ! 98: ! 99: case 'w': ! 100: printf("%7ld ", wordct); ! 101: break; ! 102: ! 103: case 'c': ! 104: printf("%7ld", charct); ! 105: break; ! 106: } ! 107: if(name) ! 108: printf(" %s\n", name); ! 109: else ! 110: printf("\n"); ! 111: } ! 112:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.