| 1 | /* wc line and word count */ |
| 2 | |
| 3 | #include <stdio.h> |
| 4 | |
| 5 | main(argc, argv) |
| 6 | char **argv; |
| 7 | { |
| 8 | int i, token; |
| 9 | register FILE *fp; |
| 10 | long linect, wordct, charct; |
| 11 | long tlinect=0, twordct=0, tcharct=0; |
| 12 | char *wd; |
| 13 | register int c; |
| 14 | |
| 15 | wd = "lwc"; |
| 16 | if(argc > 1 && *argv[1] == '-') { |
| 17 | wd = ++argv[1]; |
| 18 | argc--; |
| 19 | argv++; |
| 20 | } |
| 21 | |
| 22 | i = 1; |
| 23 | fp = stdin; |
| 24 | do { |
| 25 | if(argc>1 && (fp=fopen(argv[i], "r")) == NULL) { |
| 26 | fprintf(stderr, "wc: can't open %s\n", argv[i]); |
| 27 | continue; |
| 28 | } |
| 29 | linect = 0; |
| 30 | wordct = 0; |
| 31 | charct = 0; |
| 32 | token = 0; |
| 33 | for(;;) { |
| 34 | c = getc(fp); |
| 35 | if (c == EOF) |
| 36 | break; |
| 37 | charct++; |
| 38 | if(' '<c&&c<0177) { |
| 39 | if(!token) { |
| 40 | wordct++; |
| 41 | token++; |
| 42 | } |
| 43 | continue; |
| 44 | } |
| 45 | if(c=='\n') |
| 46 | linect++; |
| 47 | else if(c!=' '&&c!='\t') |
| 48 | continue; |
| 49 | token = 0; |
| 50 | } |
| 51 | /* print lines, words, chars */ |
| 52 | wcp(wd, charct, wordct, linect); |
| 53 | if(argc>1) { |
| 54 | printf(" %s\n", argv[i]); |
| 55 | } else |
| 56 | printf("\n"); |
| 57 | fclose(fp); |
| 58 | tlinect += linect; |
| 59 | twordct += wordct; |
| 60 | tcharct += charct; |
| 61 | } while(++i<argc); |
| 62 | if(argc > 2) { |
| 63 | wcp(wd, tcharct, twordct, tlinect); |
| 64 | printf(" total\n"); |
| 65 | } |
| 66 | exit(0); |
| 67 | } |
| 68 | |
| 69 | wcp(wd, charct, wordct, linect) |
| 70 | register char *wd; |
| 71 | long charct; long wordct; long linect; |
| 72 | { |
| 73 | while (*wd) switch (*wd++) { |
| 74 | case 'l': |
| 75 | printf("%7ld", linect); |
| 76 | break; |
| 77 | |
| 78 | case 'w': |
| 79 | printf("%7ld ", wordct); |
| 80 | break; |
| 81 | |
| 82 | case 'c': |
| 83 | printf("%7ld", charct); |
| 84 | break; |
| 85 | } |
| 86 | } |