add "ap" and "fp" notion, fix SUCC and PRED
[unix-history] / usr / src / usr.bin / wc / wc.c
CommitLineData
eeb5fff5 1static char *sccsid = "@(#)wc.c 4.3 (Berkeley) %G%";
66690d0f
BJ
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);
8d8b30ec
MH
29 if (lpp <= 0)
30 goto usage;
66690d0f
BJ
31 break;
32 case 'v':
33 verbose++;
34 wd = "lwcpt";
35 break;
36 case 'u':
37 uucp++;
38 break;
39 case 'b':
40 baud = atoi(argv[1]+2);
41 if (baud == 110)
42 cps = 10;
43 else
44 cps = baud / 10;
8d8b30ec
MH
45 if (cps <= 0)
46 goto usage;
66690d0f 47 break;
8d8b30ec
MH
48 default:
49 usage:
eeb5fff5 50 fprintf(stderr, "Usage: wc [-lwcpt] [-v] [-u] [-spagesize] [-bbaudrate]\n");
8d8b30ec 51 exit(1);
66690d0f
BJ
52 }
53 argc--;
54 argv++;
55 }
56
57 if (uucp)
58 cps = cps * 9 / 10; /* 27 cps at 300 baud */
59
60 if (verbose) {
61 for (p=wd; *p; p++)
62 switch(*p) {
63 case 'l':
64 printf("lines\t");
65 break;
66 case 'w':
67 printf("words\t");
68 break;
69 case 'c':
70 printf("chars\t");
71 break;
72 case 'p':
73 printf("pages\t");
74 break;
75 case 't':
76 printf("time@%d\t",baud);
77 break;
78 }
79 printf("\n");
80 }
81
82 i = 1;
83 fp = stdin;
84 do {
85 if(argc>1 && (fp=fopen(argv[i], "r")) == NULL) {
86 fprintf(stderr, "wc: can't open %s\n", argv[i]);
87 continue;
88 }
89 linect = 0;
90 wordct = 0;
91 charct = 0;
92 pagect = 0;
93 token = 0;
94 for(;;) {
95 c = getc(fp);
96 if (c == EOF)
97 break;
98 charct++;
99 if(' '<c&&c<0177) {
100 if(!token) {
101 wordct++;
102 token++;
103 }
104 continue;
105 }
106 if(c=='\n') {
107 linect++;
108 if (linect % lpp == 1)
109 pagect++;
110 }
111 else if(c!=' '&&c!='\t')
112 continue;
113 token = 0;
114 }
115 /* print lines, words, chars */
116 wcp(wd, charct, wordct, linect, pagect);
117 if(argc>1) {
118 printf(" %s\n", argv[i]);
119 } else
120 printf("\n");
121 fclose(fp);
122 tlinect += linect;
123 twordct += wordct;
124 tcharct += charct;
125 tpagect += pagect;
126 } while(++i<argc);
127 if(argc > 2) {
128 wcp(wd, tcharct, twordct, tlinect, tpagect);
129 printf(" total\n");
130 }
131 exit(0);
132}
133
134wcp(wd, charct, wordct, linect, pagect)
135register char *wd;
136long charct; long wordct; long linect, pagect;
137{
138 while (*wd) switch (*wd++) {
139 case 'l':
140 ipr(linect);
141 break;
142
143 case 'w':
144 ipr(wordct);
145 break;
146
147 case 'c':
148 ipr(charct);
149 break;
150
151 case 'p':
152 ipr(pagect);
153 break;
154
155 case 't':
156 prttime(charct/cps);
157 break;
158 }
159}
160
161ipr(num)
162long num;
163{
164 if (verbose)
165 printf("%ld\t", num);
166 else
167 printf("%7ld", num);
168}
169
170prttime(secs)
171long secs;
172{
173 int hrs,mins;
174 float t;
175 long osecs;
176 char *units;
177
178 osecs = secs;
179 hrs = secs / (60*60);
180 secs = secs % (60*60);
181 mins = secs / 60;
182 secs = secs % 60;
183
184 t = osecs;
185 if (hrs) {
186 t /= (60*60);
187 units = "hr";
188 } else if (mins) {
189 t /= 60;
190 units = "mi";
191 } else {
192 units = "se";
193 }
194 printf("%4.1f %2s\t", t, units);
195}