xref: /original-bsd/usr.bin/wc/wc.c (revision 1e7fda44)
1 static char *sccsid = "@(#)wc.c	4.3 (Berkeley) 11/07/80";
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 			if (lpp <= 0)
30 				goto usage;
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;
45 			if (cps <= 0)
46 				goto usage;
47 			break;
48 		default:
49 		usage:
50 			fprintf(stderr, "Usage: wc [-lwcpt] [-v] [-u] [-spagesize] [-bbaudrate]\n");
51 			exit(1);
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 }
196