xref: /csrg-svn/usr.bin/wc/wc.c (revision 1161)
1*1161Sbill static char *sccsid = "@(#)wc.c	4.1 (Berkeley) 10/01/80";
2*1161Sbill /* wc line and word count */
3*1161Sbill 
4*1161Sbill #include <stdio.h>
5*1161Sbill long	linect, wordct, charct, pagect;
6*1161Sbill long	tlinect, twordct, tcharct, tpagect;
7*1161Sbill int	baud=300;	/* baud rate */
8*1161Sbill int	cps=30;		/* # of chars per second */
9*1161Sbill int	lpp=66;		/* # of lines per page */
10*1161Sbill char	*wd = "lwc";
11*1161Sbill int	verbose;
12*1161Sbill int	uucp;
13*1161Sbill 
14*1161Sbill main(argc, argv)
15*1161Sbill char **argv;
16*1161Sbill {
17*1161Sbill 	int i, token;
18*1161Sbill 	register FILE *fp;
19*1161Sbill 	register int c;
20*1161Sbill 	char *p;
21*1161Sbill 
22*1161Sbill 	while (argc > 1 && *argv[1] == '-') {
23*1161Sbill 		switch (argv[1][1]) {
24*1161Sbill 		case 'l': case 'w': case 'c': case 'p': case 't':
25*1161Sbill 			wd = argv[1]+1;
26*1161Sbill 			break;
27*1161Sbill 		case 's':
28*1161Sbill 			lpp = atoi(argv[1]+2);
29*1161Sbill 			break;
30*1161Sbill 		case 'v':
31*1161Sbill 			verbose++;
32*1161Sbill 			wd = "lwcpt";
33*1161Sbill 			break;
34*1161Sbill 		case 'u':
35*1161Sbill 			uucp++;
36*1161Sbill 			break;
37*1161Sbill 		case 'b':
38*1161Sbill 			baud = atoi(argv[1]+2);
39*1161Sbill 			if (baud == 110)
40*1161Sbill 				cps = 10;
41*1161Sbill 			else
42*1161Sbill 				cps = baud / 10;
43*1161Sbill 			break;
44*1161Sbill 		}
45*1161Sbill 		argc--;
46*1161Sbill 		argv++;
47*1161Sbill 	}
48*1161Sbill 
49*1161Sbill 	if (uucp)
50*1161Sbill 		cps = cps * 9 / 10;	/* 27 cps at 300 baud */
51*1161Sbill 
52*1161Sbill 	if (verbose) {
53*1161Sbill 		for (p=wd; *p; p++)
54*1161Sbill 			switch(*p) {
55*1161Sbill 			case 'l':
56*1161Sbill 				printf("lines\t");
57*1161Sbill 				break;
58*1161Sbill 			case 'w':
59*1161Sbill 				printf("words\t");
60*1161Sbill 				break;
61*1161Sbill 			case 'c':
62*1161Sbill 				printf("chars\t");
63*1161Sbill 				break;
64*1161Sbill 			case 'p':
65*1161Sbill 				printf("pages\t");
66*1161Sbill 				break;
67*1161Sbill 			case 't':
68*1161Sbill 				printf("time@%d\t",baud);
69*1161Sbill 				break;
70*1161Sbill 			}
71*1161Sbill 		printf("\n");
72*1161Sbill 	}
73*1161Sbill 
74*1161Sbill 	i = 1;
75*1161Sbill 	fp = stdin;
76*1161Sbill 	do {
77*1161Sbill 		if(argc>1 && (fp=fopen(argv[i], "r")) == NULL) {
78*1161Sbill 			fprintf(stderr, "wc: can't open %s\n", argv[i]);
79*1161Sbill 			continue;
80*1161Sbill 		}
81*1161Sbill 		linect = 0;
82*1161Sbill 		wordct = 0;
83*1161Sbill 		charct = 0;
84*1161Sbill 		pagect = 0;
85*1161Sbill 		token = 0;
86*1161Sbill 		for(;;) {
87*1161Sbill 			c = getc(fp);
88*1161Sbill 			if (c == EOF)
89*1161Sbill 				break;
90*1161Sbill 			charct++;
91*1161Sbill 			if(' '<c&&c<0177) {
92*1161Sbill 				if(!token) {
93*1161Sbill 					wordct++;
94*1161Sbill 					token++;
95*1161Sbill 				}
96*1161Sbill 				continue;
97*1161Sbill 			}
98*1161Sbill 			if(c=='\n') {
99*1161Sbill 				linect++;
100*1161Sbill 				if (linect % lpp == 1)
101*1161Sbill 					pagect++;
102*1161Sbill 			}
103*1161Sbill 			else if(c!=' '&&c!='\t')
104*1161Sbill 				continue;
105*1161Sbill 			token = 0;
106*1161Sbill 		}
107*1161Sbill 		/* print lines, words, chars */
108*1161Sbill 		wcp(wd, charct, wordct, linect, pagect);
109*1161Sbill 		if(argc>1) {
110*1161Sbill 			printf(" %s\n", argv[i]);
111*1161Sbill 		} else
112*1161Sbill 			printf("\n");
113*1161Sbill 		fclose(fp);
114*1161Sbill 		tlinect += linect;
115*1161Sbill 		twordct += wordct;
116*1161Sbill 		tcharct += charct;
117*1161Sbill 		tpagect += pagect;
118*1161Sbill 	} while(++i<argc);
119*1161Sbill 	if(argc > 2) {
120*1161Sbill 		wcp(wd, tcharct, twordct, tlinect, tpagect);
121*1161Sbill 		printf(" total\n");
122*1161Sbill 	}
123*1161Sbill 	exit(0);
124*1161Sbill }
125*1161Sbill 
126*1161Sbill wcp(wd, charct, wordct, linect, pagect)
127*1161Sbill register char *wd;
128*1161Sbill long charct; long wordct; long linect, pagect;
129*1161Sbill {
130*1161Sbill 	while (*wd) switch (*wd++) {
131*1161Sbill 	case 'l':
132*1161Sbill 		ipr(linect);
133*1161Sbill 		break;
134*1161Sbill 
135*1161Sbill 	case 'w':
136*1161Sbill 		ipr(wordct);
137*1161Sbill 		break;
138*1161Sbill 
139*1161Sbill 	case 'c':
140*1161Sbill 		ipr(charct);
141*1161Sbill 		break;
142*1161Sbill 
143*1161Sbill 	case 'p':
144*1161Sbill 		ipr(pagect);
145*1161Sbill 		break;
146*1161Sbill 
147*1161Sbill 	case 't':
148*1161Sbill 		prttime(charct/cps);
149*1161Sbill 		break;
150*1161Sbill 	}
151*1161Sbill }
152*1161Sbill 
153*1161Sbill ipr(num)
154*1161Sbill long num;
155*1161Sbill {
156*1161Sbill 	if (verbose)
157*1161Sbill 		printf("%ld\t", num);
158*1161Sbill 	else
159*1161Sbill 		printf("%7ld", num);
160*1161Sbill }
161*1161Sbill 
162*1161Sbill prttime(secs)
163*1161Sbill long secs;
164*1161Sbill {
165*1161Sbill 	int hrs,mins;
166*1161Sbill 	float t;
167*1161Sbill 	long osecs;
168*1161Sbill 	char *units;
169*1161Sbill 
170*1161Sbill 	osecs = secs;
171*1161Sbill 	hrs = secs / (60*60);
172*1161Sbill 	secs = secs % (60*60);
173*1161Sbill 	mins = secs / 60;
174*1161Sbill 	secs = secs % 60;
175*1161Sbill 
176*1161Sbill 	t = osecs;
177*1161Sbill 	if (hrs) {
178*1161Sbill 		t /= (60*60);
179*1161Sbill 		units = "hr";
180*1161Sbill 	} else if (mins) {
181*1161Sbill 		t /= 60;
182*1161Sbill 		units = "mi";
183*1161Sbill 	} else {
184*1161Sbill 		units = "se";
185*1161Sbill 	}
186*1161Sbill 	printf("%4.1f %2s\t", t, units);
187*1161Sbill }
188