xref: /csrg-svn/usr.bin/wc/wc.c (revision 1750)
1*1750Smark static char *sccsid = "@(#)wc.c	4.2 (Berkeley) 11/07/80";
21161Sbill /* wc line and word count */
31161Sbill 
41161Sbill #include <stdio.h>
51161Sbill long	linect, wordct, charct, pagect;
61161Sbill long	tlinect, twordct, tcharct, tpagect;
71161Sbill int	baud=300;	/* baud rate */
81161Sbill int	cps=30;		/* # of chars per second */
91161Sbill int	lpp=66;		/* # of lines per page */
101161Sbill char	*wd = "lwc";
111161Sbill int	verbose;
121161Sbill int	uucp;
131161Sbill 
141161Sbill main(argc, argv)
151161Sbill char **argv;
161161Sbill {
171161Sbill 	int i, token;
181161Sbill 	register FILE *fp;
191161Sbill 	register int c;
201161Sbill 	char *p;
211161Sbill 
221161Sbill 	while (argc > 1 && *argv[1] == '-') {
231161Sbill 		switch (argv[1][1]) {
241161Sbill 		case 'l': case 'w': case 'c': case 'p': case 't':
251161Sbill 			wd = argv[1]+1;
261161Sbill 			break;
271161Sbill 		case 's':
28*1750Smark 			if (argc == 2)
29*1750Smark 				goto usage;
301161Sbill 			lpp = atoi(argv[1]+2);
31*1750Smark 			if (lpp <= 0)
32*1750Smark 				goto usage;
331161Sbill 			break;
341161Sbill 		case 'v':
351161Sbill 			verbose++;
361161Sbill 			wd = "lwcpt";
371161Sbill 			break;
381161Sbill 		case 'u':
391161Sbill 			uucp++;
401161Sbill 			break;
411161Sbill 		case 'b':
42*1750Smark 			if (argc == 2)
43*1750Smark 				goto usage;
441161Sbill 			baud = atoi(argv[1]+2);
451161Sbill 			if (baud == 110)
461161Sbill 				cps = 10;
471161Sbill 			else
481161Sbill 				cps = baud / 10;
49*1750Smark 			if (cps <= 0)
50*1750Smark 				goto usage;
511161Sbill 			break;
52*1750Smark 		default:
53*1750Smark 		usage:
54*1750Smark 			fprintf(stderr, "Usage: wc [-lwcpt] [-v] [-u] [-s pagesize] [-b baudrate]\n");
55*1750Smark 			exit(1);
561161Sbill 		}
571161Sbill 		argc--;
581161Sbill 		argv++;
591161Sbill 	}
601161Sbill 
611161Sbill 	if (uucp)
621161Sbill 		cps = cps * 9 / 10;	/* 27 cps at 300 baud */
631161Sbill 
641161Sbill 	if (verbose) {
651161Sbill 		for (p=wd; *p; p++)
661161Sbill 			switch(*p) {
671161Sbill 			case 'l':
681161Sbill 				printf("lines\t");
691161Sbill 				break;
701161Sbill 			case 'w':
711161Sbill 				printf("words\t");
721161Sbill 				break;
731161Sbill 			case 'c':
741161Sbill 				printf("chars\t");
751161Sbill 				break;
761161Sbill 			case 'p':
771161Sbill 				printf("pages\t");
781161Sbill 				break;
791161Sbill 			case 't':
801161Sbill 				printf("time@%d\t",baud);
811161Sbill 				break;
821161Sbill 			}
831161Sbill 		printf("\n");
841161Sbill 	}
851161Sbill 
861161Sbill 	i = 1;
871161Sbill 	fp = stdin;
881161Sbill 	do {
891161Sbill 		if(argc>1 && (fp=fopen(argv[i], "r")) == NULL) {
901161Sbill 			fprintf(stderr, "wc: can't open %s\n", argv[i]);
911161Sbill 			continue;
921161Sbill 		}
931161Sbill 		linect = 0;
941161Sbill 		wordct = 0;
951161Sbill 		charct = 0;
961161Sbill 		pagect = 0;
971161Sbill 		token = 0;
981161Sbill 		for(;;) {
991161Sbill 			c = getc(fp);
1001161Sbill 			if (c == EOF)
1011161Sbill 				break;
1021161Sbill 			charct++;
1031161Sbill 			if(' '<c&&c<0177) {
1041161Sbill 				if(!token) {
1051161Sbill 					wordct++;
1061161Sbill 					token++;
1071161Sbill 				}
1081161Sbill 				continue;
1091161Sbill 			}
1101161Sbill 			if(c=='\n') {
1111161Sbill 				linect++;
1121161Sbill 				if (linect % lpp == 1)
1131161Sbill 					pagect++;
1141161Sbill 			}
1151161Sbill 			else if(c!=' '&&c!='\t')
1161161Sbill 				continue;
1171161Sbill 			token = 0;
1181161Sbill 		}
1191161Sbill 		/* print lines, words, chars */
1201161Sbill 		wcp(wd, charct, wordct, linect, pagect);
1211161Sbill 		if(argc>1) {
1221161Sbill 			printf(" %s\n", argv[i]);
1231161Sbill 		} else
1241161Sbill 			printf("\n");
1251161Sbill 		fclose(fp);
1261161Sbill 		tlinect += linect;
1271161Sbill 		twordct += wordct;
1281161Sbill 		tcharct += charct;
1291161Sbill 		tpagect += pagect;
1301161Sbill 	} while(++i<argc);
1311161Sbill 	if(argc > 2) {
1321161Sbill 		wcp(wd, tcharct, twordct, tlinect, tpagect);
1331161Sbill 		printf(" total\n");
1341161Sbill 	}
1351161Sbill 	exit(0);
1361161Sbill }
1371161Sbill 
1381161Sbill wcp(wd, charct, wordct, linect, pagect)
1391161Sbill register char *wd;
1401161Sbill long charct; long wordct; long linect, pagect;
1411161Sbill {
1421161Sbill 	while (*wd) switch (*wd++) {
1431161Sbill 	case 'l':
1441161Sbill 		ipr(linect);
1451161Sbill 		break;
1461161Sbill 
1471161Sbill 	case 'w':
1481161Sbill 		ipr(wordct);
1491161Sbill 		break;
1501161Sbill 
1511161Sbill 	case 'c':
1521161Sbill 		ipr(charct);
1531161Sbill 		break;
1541161Sbill 
1551161Sbill 	case 'p':
1561161Sbill 		ipr(pagect);
1571161Sbill 		break;
1581161Sbill 
1591161Sbill 	case 't':
1601161Sbill 		prttime(charct/cps);
1611161Sbill 		break;
1621161Sbill 	}
1631161Sbill }
1641161Sbill 
1651161Sbill ipr(num)
1661161Sbill long num;
1671161Sbill {
1681161Sbill 	if (verbose)
1691161Sbill 		printf("%ld\t", num);
1701161Sbill 	else
1711161Sbill 		printf("%7ld", num);
1721161Sbill }
1731161Sbill 
1741161Sbill prttime(secs)
1751161Sbill long secs;
1761161Sbill {
1771161Sbill 	int hrs,mins;
1781161Sbill 	float t;
1791161Sbill 	long osecs;
1801161Sbill 	char *units;
1811161Sbill 
1821161Sbill 	osecs = secs;
1831161Sbill 	hrs = secs / (60*60);
1841161Sbill 	secs = secs % (60*60);
1851161Sbill 	mins = secs / 60;
1861161Sbill 	secs = secs % 60;
1871161Sbill 
1881161Sbill 	t = osecs;
1891161Sbill 	if (hrs) {
1901161Sbill 		t /= (60*60);
1911161Sbill 		units = "hr";
1921161Sbill 	} else if (mins) {
1931161Sbill 		t /= 60;
1941161Sbill 		units = "mi";
1951161Sbill 	} else {
1961161Sbill 		units = "se";
1971161Sbill 	}
1981161Sbill 	printf("%4.1f %2s\t", t, units);
1991161Sbill }
200