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