xref: /original-bsd/usr.bin/wc/wc.c (revision d25e1985)
1 static char *sccsid = "@(#)wc.c	4.1 (Berkeley) 10/01/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 			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 }
188