X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/3b600ead559fe112c8ab5ec49de92ae74ae4a1c9..31cef89cb428866f787983e68246030321893df4:/usr/src/cmd/wc.c diff --git a/usr/src/cmd/wc.c b/usr/src/cmd/wc.c index 3a20b2712e..ffa3f5bb54 100644 --- a/usr/src/cmd/wc.c +++ b/usr/src/cmd/wc.c @@ -1,24 +1,84 @@ +static char *sccsid = "@(#)wc.c 4.3 (Berkeley) 11/7/80"; /* wc line and word count */ #include +long linect, wordct, charct, pagect; +long tlinect, twordct, tcharct, tpagect; +int baud=300; /* baud rate */ +int cps=30; /* # of chars per second */ +int lpp=66; /* # of lines per page */ +char *wd = "lwc"; +int verbose; +int uucp; main(argc, argv) char **argv; { int i, token; register FILE *fp; - long linect, wordct, charct; - long tlinect=0, twordct=0, tcharct=0; - char *wd; register int c; + char *p; - wd = "lwc"; - if(argc > 1 && *argv[1] == '-') { - wd = ++argv[1]; + while (argc > 1 && *argv[1] == '-') { + switch (argv[1][1]) { + case 'l': case 'w': case 'c': case 'p': case 't': + wd = argv[1]+1; + break; + case 's': + lpp = atoi(argv[1]+2); + if (lpp <= 0) + goto usage; + break; + case 'v': + verbose++; + wd = "lwcpt"; + break; + case 'u': + uucp++; + break; + case 'b': + baud = atoi(argv[1]+2); + if (baud == 110) + cps = 10; + else + cps = baud / 10; + if (cps <= 0) + goto usage; + break; + default: + usage: + fprintf(stderr, "Usage: wc [-lwcpt] [-v] [-u] [-spagesize] [-bbaudrate]\n"); + exit(1); + } argc--; argv++; } + if (uucp) + cps = cps * 9 / 10; /* 27 cps at 300 baud */ + + if (verbose) { + for (p=wd; *p; p++) + switch(*p) { + case 'l': + printf("lines\t"); + break; + case 'w': + printf("words\t"); + break; + case 'c': + printf("chars\t"); + break; + case 'p': + printf("pages\t"); + break; + case 't': + printf("time@%d\t",baud); + break; + } + printf("\n"); + } + i = 1; fp = stdin; do { @@ -29,6 +89,7 @@ char **argv; linect = 0; wordct = 0; charct = 0; + pagect = 0; token = 0; for(;;) { c = getc(fp); @@ -42,14 +103,17 @@ char **argv; } continue; } - if(c=='\n') + if(c=='\n') { linect++; + if (linect % lpp == 1) + pagect++; + } else if(c!=' '&&c!='\t') continue; token = 0; } /* print lines, words, chars */ - wcp(wd, charct, wordct, linect); + wcp(wd, charct, wordct, linect, pagect); if(argc>1) { printf(" %s\n", argv[i]); } else @@ -58,29 +122,74 @@ char **argv; tlinect += linect; twordct += wordct; tcharct += charct; + tpagect += pagect; } while(++i 2) { - wcp(wd, tcharct, twordct, tlinect); + wcp(wd, tcharct, twordct, tlinect, tpagect); printf(" total\n"); } exit(0); } -wcp(wd, charct, wordct, linect) +wcp(wd, charct, wordct, linect, pagect) register char *wd; -long charct; long wordct; long linect; +long charct; long wordct; long linect, pagect; { while (*wd) switch (*wd++) { case 'l': - printf("%7ld", linect); + ipr(linect); break; case 'w': - printf("%7ld ", wordct); + ipr(wordct); break; case 'c': - printf("%7ld", charct); + ipr(charct); + break; + + case 'p': + ipr(pagect); + break; + + case 't': + prttime(charct/cps); break; } } + +ipr(num) +long num; +{ + if (verbose) + printf("%ld\t", num); + else + printf("%7ld", num); +} + +prttime(secs) +long secs; +{ + int hrs,mins; + float t; + long osecs; + char *units; + + osecs = secs; + hrs = secs / (60*60); + secs = secs % (60*60); + mins = secs / 60; + secs = secs % 60; + + t = osecs; + if (hrs) { + t /= (60*60); + units = "hr"; + } else if (mins) { + t /= 60; + units = "mi"; + } else { + units = "se"; + } + printf("%4.1f %2s\t", t, units); +}