Commit | Line | Data |
---|---|---|
eeb5fff5 | 1 | static char *sccsid = "@(#)wc.c 4.3 (Berkeley) %G%"; |
66690d0f BJ |
2 | /* wc line and word count */ |
3 | ||
4 | #include <stdio.h> | |
5 | long linect, wordct, charct, pagect; | |
6 | long tlinect, twordct, tcharct, tpagect; | |
7 | int baud=300; /* baud rate */ | |
8 | int cps=30; /* # of chars per second */ | |
9 | int lpp=66; /* # of lines per page */ | |
10 | char *wd = "lwc"; | |
11 | int verbose; | |
12 | int uucp; | |
13 | ||
14 | main(argc, argv) | |
15 | char **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 | ||
134 | wcp(wd, charct, wordct, linect, pagect) | |
135 | register char *wd; | |
136 | long 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 | ||
161 | ipr(num) | |
162 | long num; | |
163 | { | |
164 | if (verbose) | |
165 | printf("%ld\t", num); | |
166 | else | |
167 | printf("%7ld", num); | |
168 | } | |
169 | ||
170 | prttime(secs) | |
171 | long 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 | } |