xref: /csrg-svn/usr.bin/wc/wc.c (revision 12856)
1*12856Smo static char *sccsid = "@(#)wc.c	4.6 (Berkeley) 06/01/83";
21161Sbill /* wc line and word count */
31161Sbill 
41161Sbill #include <stdio.h>
51161Sbill long	linect, wordct, charct, pagect;
61161Sbill long	tlinect, twordct, tcharct, tpagect;
71161Sbill char	*wd = "lwc";
81161Sbill 
91161Sbill main(argc, argv)
101161Sbill char **argv;
111161Sbill {
121161Sbill 	int i, token;
131161Sbill 	register FILE *fp;
141161Sbill 	register int c;
151161Sbill 	char *p;
161161Sbill 
171161Sbill 	while (argc > 1 && *argv[1] == '-') {
181161Sbill 		switch (argv[1][1]) {
19*12856Smo 		case 'l': case 'w': case 'c':
201161Sbill 			wd = argv[1]+1;
211161Sbill 			break;
221750Smark 		default:
231750Smark 		usage:
24*12856Smo 			fprintf(stderr, "Usage: wc [-lwc] [files]\n");
251750Smark 			exit(1);
261161Sbill 		}
271161Sbill 		argc--;
281161Sbill 		argv++;
291161Sbill 	}
301161Sbill 
311161Sbill 	i = 1;
321161Sbill 	fp = stdin;
331161Sbill 	do {
341161Sbill 		if(argc>1 && (fp=fopen(argv[i], "r")) == NULL) {
3512088Smckusick 			perror(argv[i]);
361161Sbill 			continue;
371161Sbill 		}
381161Sbill 		linect = 0;
391161Sbill 		wordct = 0;
401161Sbill 		charct = 0;
411161Sbill 		token = 0;
421161Sbill 		for(;;) {
431161Sbill 			c = getc(fp);
441161Sbill 			if (c == EOF)
451161Sbill 				break;
461161Sbill 			charct++;
471161Sbill 			if(' '<c&&c<0177) {
481161Sbill 				if(!token) {
491161Sbill 					wordct++;
501161Sbill 					token++;
511161Sbill 				}
521161Sbill 				continue;
531161Sbill 			}
541161Sbill 			if(c=='\n') {
551161Sbill 				linect++;
561161Sbill 			}
571161Sbill 			else if(c!=' '&&c!='\t')
581161Sbill 				continue;
591161Sbill 			token = 0;
601161Sbill 		}
611161Sbill 		/* print lines, words, chars */
62*12856Smo 		wcp(wd, charct, wordct, linect);
631161Sbill 		if(argc>1) {
641161Sbill 			printf(" %s\n", argv[i]);
651161Sbill 		} else
661161Sbill 			printf("\n");
671161Sbill 		fclose(fp);
681161Sbill 		tlinect += linect;
691161Sbill 		twordct += wordct;
701161Sbill 		tcharct += charct;
711161Sbill 	} while(++i<argc);
721161Sbill 	if(argc > 2) {
73*12856Smo 		wcp(wd, tcharct, twordct, tlinect);
741161Sbill 		printf(" total\n");
751161Sbill 	}
761161Sbill 	exit(0);
771161Sbill }
781161Sbill 
79*12856Smo wcp(wd, charct, wordct, linect)
801161Sbill register char *wd;
81*12856Smo long charct; long wordct; long linect;
821161Sbill {
831161Sbill 	while (*wd) switch (*wd++) {
841161Sbill 	case 'l':
851161Sbill 		ipr(linect);
861161Sbill 		break;
871161Sbill 
881161Sbill 	case 'w':
891161Sbill 		ipr(wordct);
901161Sbill 		break;
911161Sbill 
921161Sbill 	case 'c':
931161Sbill 		ipr(charct);
941161Sbill 		break;
951161Sbill 
961161Sbill 	}
971161Sbill }
981161Sbill 
991161Sbill ipr(num)
1001161Sbill long num;
1011161Sbill {
102*12856Smo 	printf(" %7ld", num);
1031161Sbill }
1041161Sbill 
105