1*1750Smark static char *sccsid = "@(#)wc.c 4.2 (Berkeley) 11/07/80"; 21161Sbill /* wc line and word count */ 31161Sbill 41161Sbill #include <stdio.h> 51161Sbill long linect, wordct, charct, pagect; 61161Sbill long tlinect, twordct, tcharct, tpagect; 71161Sbill int baud=300; /* baud rate */ 81161Sbill int cps=30; /* # of chars per second */ 91161Sbill int lpp=66; /* # of lines per page */ 101161Sbill char *wd = "lwc"; 111161Sbill int verbose; 121161Sbill int uucp; 131161Sbill 141161Sbill main(argc, argv) 151161Sbill char **argv; 161161Sbill { 171161Sbill int i, token; 181161Sbill register FILE *fp; 191161Sbill register int c; 201161Sbill char *p; 211161Sbill 221161Sbill while (argc > 1 && *argv[1] == '-') { 231161Sbill switch (argv[1][1]) { 241161Sbill case 'l': case 'w': case 'c': case 'p': case 't': 251161Sbill wd = argv[1]+1; 261161Sbill break; 271161Sbill case 's': 28*1750Smark if (argc == 2) 29*1750Smark goto usage; 301161Sbill lpp = atoi(argv[1]+2); 31*1750Smark if (lpp <= 0) 32*1750Smark goto usage; 331161Sbill break; 341161Sbill case 'v': 351161Sbill verbose++; 361161Sbill wd = "lwcpt"; 371161Sbill break; 381161Sbill case 'u': 391161Sbill uucp++; 401161Sbill break; 411161Sbill case 'b': 42*1750Smark if (argc == 2) 43*1750Smark goto usage; 441161Sbill baud = atoi(argv[1]+2); 451161Sbill if (baud == 110) 461161Sbill cps = 10; 471161Sbill else 481161Sbill cps = baud / 10; 49*1750Smark if (cps <= 0) 50*1750Smark goto usage; 511161Sbill break; 52*1750Smark default: 53*1750Smark usage: 54*1750Smark fprintf(stderr, "Usage: wc [-lwcpt] [-v] [-u] [-s pagesize] [-b baudrate]\n"); 55*1750Smark exit(1); 561161Sbill } 571161Sbill argc--; 581161Sbill argv++; 591161Sbill } 601161Sbill 611161Sbill if (uucp) 621161Sbill cps = cps * 9 / 10; /* 27 cps at 300 baud */ 631161Sbill 641161Sbill if (verbose) { 651161Sbill for (p=wd; *p; p++) 661161Sbill switch(*p) { 671161Sbill case 'l': 681161Sbill printf("lines\t"); 691161Sbill break; 701161Sbill case 'w': 711161Sbill printf("words\t"); 721161Sbill break; 731161Sbill case 'c': 741161Sbill printf("chars\t"); 751161Sbill break; 761161Sbill case 'p': 771161Sbill printf("pages\t"); 781161Sbill break; 791161Sbill case 't': 801161Sbill printf("time@%d\t",baud); 811161Sbill break; 821161Sbill } 831161Sbill printf("\n"); 841161Sbill } 851161Sbill 861161Sbill i = 1; 871161Sbill fp = stdin; 881161Sbill do { 891161Sbill if(argc>1 && (fp=fopen(argv[i], "r")) == NULL) { 901161Sbill fprintf(stderr, "wc: can't open %s\n", argv[i]); 911161Sbill continue; 921161Sbill } 931161Sbill linect = 0; 941161Sbill wordct = 0; 951161Sbill charct = 0; 961161Sbill pagect = 0; 971161Sbill token = 0; 981161Sbill for(;;) { 991161Sbill c = getc(fp); 1001161Sbill if (c == EOF) 1011161Sbill break; 1021161Sbill charct++; 1031161Sbill if(' '<c&&c<0177) { 1041161Sbill if(!token) { 1051161Sbill wordct++; 1061161Sbill token++; 1071161Sbill } 1081161Sbill continue; 1091161Sbill } 1101161Sbill if(c=='\n') { 1111161Sbill linect++; 1121161Sbill if (linect % lpp == 1) 1131161Sbill pagect++; 1141161Sbill } 1151161Sbill else if(c!=' '&&c!='\t') 1161161Sbill continue; 1171161Sbill token = 0; 1181161Sbill } 1191161Sbill /* print lines, words, chars */ 1201161Sbill wcp(wd, charct, wordct, linect, pagect); 1211161Sbill if(argc>1) { 1221161Sbill printf(" %s\n", argv[i]); 1231161Sbill } else 1241161Sbill printf("\n"); 1251161Sbill fclose(fp); 1261161Sbill tlinect += linect; 1271161Sbill twordct += wordct; 1281161Sbill tcharct += charct; 1291161Sbill tpagect += pagect; 1301161Sbill } while(++i<argc); 1311161Sbill if(argc > 2) { 1321161Sbill wcp(wd, tcharct, twordct, tlinect, tpagect); 1331161Sbill printf(" total\n"); 1341161Sbill } 1351161Sbill exit(0); 1361161Sbill } 1371161Sbill 1381161Sbill wcp(wd, charct, wordct, linect, pagect) 1391161Sbill register char *wd; 1401161Sbill long charct; long wordct; long linect, pagect; 1411161Sbill { 1421161Sbill while (*wd) switch (*wd++) { 1431161Sbill case 'l': 1441161Sbill ipr(linect); 1451161Sbill break; 1461161Sbill 1471161Sbill case 'w': 1481161Sbill ipr(wordct); 1491161Sbill break; 1501161Sbill 1511161Sbill case 'c': 1521161Sbill ipr(charct); 1531161Sbill break; 1541161Sbill 1551161Sbill case 'p': 1561161Sbill ipr(pagect); 1571161Sbill break; 1581161Sbill 1591161Sbill case 't': 1601161Sbill prttime(charct/cps); 1611161Sbill break; 1621161Sbill } 1631161Sbill } 1641161Sbill 1651161Sbill ipr(num) 1661161Sbill long num; 1671161Sbill { 1681161Sbill if (verbose) 1691161Sbill printf("%ld\t", num); 1701161Sbill else 1711161Sbill printf("%7ld", num); 1721161Sbill } 1731161Sbill 1741161Sbill prttime(secs) 1751161Sbill long secs; 1761161Sbill { 1771161Sbill int hrs,mins; 1781161Sbill float t; 1791161Sbill long osecs; 1801161Sbill char *units; 1811161Sbill 1821161Sbill osecs = secs; 1831161Sbill hrs = secs / (60*60); 1841161Sbill secs = secs % (60*60); 1851161Sbill mins = secs / 60; 1861161Sbill secs = secs % 60; 1871161Sbill 1881161Sbill t = osecs; 1891161Sbill if (hrs) { 1901161Sbill t /= (60*60); 1911161Sbill units = "hr"; 1921161Sbill } else if (mins) { 1931161Sbill t /= 60; 1941161Sbill units = "mi"; 1951161Sbill } else { 1961161Sbill units = "se"; 1971161Sbill } 1981161Sbill printf("%4.1f %2s\t", t, units); 1991161Sbill } 200