1 static char *sccsid = "@(#)wc.c 4.3 (Berkeley) 11/07/80"; 2 /* wc line and word count */ 3 4 #include <stdio.h> 5 long linect, wordct, charct, pagect; 6 long tlinect, twordct, tcharct, tpagect; 7 int baud=300; /* baud rate */ 8 int cps=30; /* # of chars per second */ 9 int lpp=66; /* # of lines per page */ 10 char *wd = "lwc"; 11 int verbose; 12 int uucp; 13 14 main(argc, argv) 15 char **argv; 16 { 17 int i, token; 18 register FILE *fp; 19 register int c; 20 char *p; 21 22 while (argc > 1 && *argv[1] == '-') { 23 switch (argv[1][1]) { 24 case 'l': case 'w': case 'c': case 'p': case 't': 25 wd = argv[1]+1; 26 break; 27 case 's': 28 lpp = atoi(argv[1]+2); 29 if (lpp <= 0) 30 goto usage; 31 break; 32 case 'v': 33 verbose++; 34 wd = "lwcpt"; 35 break; 36 case 'u': 37 uucp++; 38 break; 39 case 'b': 40 baud = atoi(argv[1]+2); 41 if (baud == 110) 42 cps = 10; 43 else 44 cps = baud / 10; 45 if (cps <= 0) 46 goto usage; 47 break; 48 default: 49 usage: 50 fprintf(stderr, "Usage: wc [-lwcpt] [-v] [-u] [-spagesize] [-bbaudrate]\n"); 51 exit(1); 52 } 53 argc--; 54 argv++; 55 } 56 57 if (uucp) 58 cps = cps * 9 / 10; /* 27 cps at 300 baud */ 59 60 if (verbose) { 61 for (p=wd; *p; p++) 62 switch(*p) { 63 case 'l': 64 printf("lines\t"); 65 break; 66 case 'w': 67 printf("words\t"); 68 break; 69 case 'c': 70 printf("chars\t"); 71 break; 72 case 'p': 73 printf("pages\t"); 74 break; 75 case 't': 76 printf("time@%d\t",baud); 77 break; 78 } 79 printf("\n"); 80 } 81 82 i = 1; 83 fp = stdin; 84 do { 85 if(argc>1 && (fp=fopen(argv[i], "r")) == NULL) { 86 fprintf(stderr, "wc: can't open %s\n", argv[i]); 87 continue; 88 } 89 linect = 0; 90 wordct = 0; 91 charct = 0; 92 pagect = 0; 93 token = 0; 94 for(;;) { 95 c = getc(fp); 96 if (c == EOF) 97 break; 98 charct++; 99 if(' '<c&&c<0177) { 100 if(!token) { 101 wordct++; 102 token++; 103 } 104 continue; 105 } 106 if(c=='\n') { 107 linect++; 108 if (linect % lpp == 1) 109 pagect++; 110 } 111 else if(c!=' '&&c!='\t') 112 continue; 113 token = 0; 114 } 115 /* print lines, words, chars */ 116 wcp(wd, charct, wordct, linect, pagect); 117 if(argc>1) { 118 printf(" %s\n", argv[i]); 119 } else 120 printf("\n"); 121 fclose(fp); 122 tlinect += linect; 123 twordct += wordct; 124 tcharct += charct; 125 tpagect += pagect; 126 } while(++i<argc); 127 if(argc > 2) { 128 wcp(wd, tcharct, twordct, tlinect, tpagect); 129 printf(" total\n"); 130 } 131 exit(0); 132 } 133 134 wcp(wd, charct, wordct, linect, pagect) 135 register char *wd; 136 long charct; long wordct; long linect, pagect; 137 { 138 while (*wd) switch (*wd++) { 139 case 'l': 140 ipr(linect); 141 break; 142 143 case 'w': 144 ipr(wordct); 145 break; 146 147 case 'c': 148 ipr(charct); 149 break; 150 151 case 'p': 152 ipr(pagect); 153 break; 154 155 case 't': 156 prttime(charct/cps); 157 break; 158 } 159 } 160 161 ipr(num) 162 long num; 163 { 164 if (verbose) 165 printf("%ld\t", num); 166 else 167 printf("%7ld", num); 168 } 169 170 prttime(secs) 171 long secs; 172 { 173 int hrs,mins; 174 float t; 175 long osecs; 176 char *units; 177 178 osecs = secs; 179 hrs = secs / (60*60); 180 secs = secs % (60*60); 181 mins = secs / 60; 182 secs = secs % 60; 183 184 t = osecs; 185 if (hrs) { 186 t /= (60*60); 187 units = "hr"; 188 } else if (mins) { 189 t /= 60; 190 units = "mi"; 191 } else { 192 units = "se"; 193 } 194 printf("%4.1f %2s\t", t, units); 195 } 196