Commit | Line | Data |
---|---|---|
66690d0f BJ |
1 | static char *sccsid = "@(#)wc.c 4.1 (Berkeley) %G%"; |
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); | |
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 | ||
126 | wcp(wd, charct, wordct, linect, pagect) | |
127 | register char *wd; | |
128 | long 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 | ||
153 | ipr(num) | |
154 | long num; | |
155 | { | |
156 | if (verbose) | |
157 | printf("%ld\t", num); | |
158 | else | |
159 | printf("%7ld", num); | |
160 | } | |
161 | ||
162 | prttime(secs) | |
163 | long 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 | } |