BSD 4 release
[unix-history] / usr / src / cmd / wc.c
index 3a20b27..ffa3f5b 100644 (file)
@@ -1,24 +1,84 @@
+static char *sccsid = "@(#)wc.c        4.3 (Berkeley) 11/7/80";
 /* wc line and word count */
 
 #include <stdio.h>
 /* wc line and word count */
 
 #include <stdio.h>
+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;
 
 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;
        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++;
        }
 
                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 {
        i = 1;
        fp = stdin;
        do {
@@ -29,6 +89,7 @@ char **argv;
                linect = 0;
                wordct = 0;
                charct = 0;
                linect = 0;
                wordct = 0;
                charct = 0;
+               pagect = 0;
                token = 0;
                for(;;) {
                        c = getc(fp);
                token = 0;
                for(;;) {
                        c = getc(fp);
@@ -42,14 +103,17 @@ char **argv;
                                }
                                continue;
                        }
                                }
                                continue;
                        }
-                       if(c=='\n')
+                       if(c=='\n') {
                                linect++;
                                linect++;
+                               if (linect % lpp == 1)
+                                       pagect++;
+                       }
                        else if(c!=' '&&c!='\t')
                                continue;
                        token = 0;
                }
                /* print lines, words, chars */
                        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
                if(argc>1) {
                        printf(" %s\n", argv[i]);
                } else
@@ -58,29 +122,74 @@ char **argv;
                tlinect += linect;
                twordct += wordct;
                tcharct += charct;
                tlinect += linect;
                twordct += wordct;
                tcharct += charct;
+               tpagect += pagect;
        } while(++i<argc);
        if(argc > 2) {
        } while(++i<argc);
        if(argc > 2) {
-               wcp(wd, tcharct, twordct, tlinect);
+               wcp(wd, tcharct, twordct, tlinect, tpagect);
                printf(" total\n");
        }
        exit(0);
 }
 
                printf(" total\n");
        }
        exit(0);
 }
 
-wcp(wd, charct, wordct, linect)
+wcp(wd, charct, wordct, linect, pagect)
 register char *wd;
 register char *wd;
-long charct; long wordct; long linect;
+long charct; long wordct; long linect, pagect;
 {
        while (*wd) switch (*wd++) {
        case 'l':
 {
        while (*wd) switch (*wd++) {
        case 'l':
-               printf("%7ld", linect);
+               ipr(linect);
                break;
 
        case 'w':
                break;
 
        case 'w':
-               printf("%7ld ", wordct);
+               ipr(wordct);
                break;
 
        case 'c':
                break;
 
        case 'c':
-               printf("%7ld", charct);
+               ipr(charct);
+               break;
+
+       case 'p':
+               ipr(pagect);
+               break;
+
+       case 't':
+               prttime(charct/cps);
                break;
        }
 }
                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);
+}