unix-v7-wc.c (1356B)
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 }