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