date and time created 80/10/01 17:29:40 by bill
[unix-history] / usr / src / usr.bin / wc / wc.c
CommitLineData
66690d0f
BJ
1static char *sccsid = "@(#)wc.c 4.1 (Berkeley) %G%";
2/* wc line and word count */
3
4#include <stdio.h>
5long linect, wordct, charct, pagect;
6long tlinect, twordct, tcharct, tpagect;
7int baud=300; /* baud rate */
8int cps=30; /* # of chars per second */
9int lpp=66; /* # of lines per page */
10char *wd = "lwc";
11int verbose;
12int uucp;
13
14main(argc, argv)
15char **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
126wcp(wd, charct, wordct, linect, pagect)
127register char *wd;
128long 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
153ipr(num)
154long num;
155{
156 if (verbose)
157 printf("%ld\t", num);
158 else
159 printf("%7ld", num);
160}
161
162prttime(secs)
163long 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}