add historical versions
This commit is contained in:
		
							parent
							
								
									16168840c3
								
							
						
					
					
						commit
						b987143eb6
					
				
							
								
								
									
										257
									
								
								historical/busybox-wc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										257
									
								
								historical/busybox-wc.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,257 @@ | |||
| /* vi: set sw=4 ts=4: */ | ||||
| /*
 | ||||
|  * wc implementation for busybox | ||||
|  * | ||||
|  * Copyright (C) 2003  Manuel Novoa III  <mjn3@codepoet.org> | ||||
|  * | ||||
|  * Licensed under GPLv2 or later, see file LICENSE in this source tree. | ||||
|  */ | ||||
| /* Mar 16, 2003      Manuel Novoa III   (mjn3@codepoet.org)
 | ||||
|  * | ||||
|  * Rewritten to fix a number of problems and do some size optimizations. | ||||
|  * Problems in the previous busybox implementation (besides bloat) included: | ||||
|  *  1) broken 'wc -c' optimization (read note below) | ||||
|  *  2) broken handling of '-' args | ||||
|  *  3) no checking of ferror on EOF returns | ||||
|  *  4) isprint() wasn't considered when word counting. | ||||
|  * | ||||
|  * NOTES: | ||||
|  * | ||||
|  * The previous busybox wc attempted an optimization using stat for the | ||||
|  * case of counting chars only.  I omitted that because it was broken. | ||||
|  * It didn't take into account the possibility of input coming from a | ||||
|  * pipe, or input from a file with file pointer not at the beginning. | ||||
|  * | ||||
|  * To implement such a speed optimization correctly, not only do you | ||||
|  * need the size, but also the file position.  Note also that the | ||||
|  * file position may be past the end of file.  Consider the example | ||||
|  * (adapted from example in gnu wc.c) | ||||
|  * | ||||
|  *      echo hello > /tmp/testfile && | ||||
|  *      (dd ibs=1k skip=1 count=0 &> /dev/null; wc -c) < /tmp/testfile | ||||
|  * | ||||
|  * for which 'wc -c' should output '0'. | ||||
|  */ | ||||
| //config:config WC
 | ||||
| //config:	bool "wc (4.7 kb)"
 | ||||
| //config:	default y
 | ||||
| //config:	help
 | ||||
| //config:	wc is used to print the number of bytes, words, and lines,
 | ||||
| //config:	in specified files.
 | ||||
| //config:
 | ||||
| //config:config FEATURE_WC_LARGE
 | ||||
| //config:	bool "Support very large counts"
 | ||||
| //config:	default y
 | ||||
| //config:	depends on WC
 | ||||
| //config:	help
 | ||||
| //config:	Use "unsigned long long" for counter variables.
 | ||||
| 
 | ||||
| //applet:IF_WC(APPLET(wc, BB_DIR_USR_BIN, BB_SUID_DROP))
 | ||||
| 
 | ||||
| //kbuild:lib-$(CONFIG_WC) += wc.o
 | ||||
| 
 | ||||
| /* BB_AUDIT SUSv3 compliant. */ | ||||
| /* http://www.opengroup.org/onlinepubs/007904975/utilities/wc.html */ | ||||
| 
 | ||||
| #include "libbb.h" | ||||
| #include "unicode.h" | ||||
| 
 | ||||
| #if !ENABLE_LOCALE_SUPPORT | ||||
| # undef isprint | ||||
| # undef isspace | ||||
| # define isprint(c) ((unsigned)((c) - 0x20) <= (0x7e - 0x20)) | ||||
| # define isspace(c) ((c) == ' ') | ||||
| #endif | ||||
| 
 | ||||
| #if ENABLE_FEATURE_WC_LARGE | ||||
| # define COUNT_T unsigned long long | ||||
| # define COUNT_FMT "llu" | ||||
| #else | ||||
| # define COUNT_T unsigned | ||||
| # define COUNT_FMT "u" | ||||
| #endif | ||||
| 
 | ||||
| /* We support -m even when UNICODE_SUPPORT is off,
 | ||||
|  * we just don't advertise it in help text, | ||||
|  * since it is the same as -c in this case. | ||||
|  */ | ||||
| 
 | ||||
| //usage:#define wc_trivial_usage
 | ||||
| //usage:       "[-c"IF_UNICODE_SUPPORT("m")"lwL] [FILE]..."
 | ||||
| //usage:
 | ||||
| //usage:#define wc_full_usage "\n\n"
 | ||||
| //usage:       "Count lines, words, and bytes for FILEs (or stdin)\n"
 | ||||
| //usage:     "\n	-c	Count bytes"
 | ||||
| //usage:	IF_UNICODE_SUPPORT(
 | ||||
| //usage:     "\n	-m	Count characters"
 | ||||
| //usage:	)
 | ||||
| //usage:     "\n	-l	Count newlines"
 | ||||
| //usage:     "\n	-w	Count words"
 | ||||
| //usage:     "\n	-L	Print longest line length"
 | ||||
| //usage:
 | ||||
| //usage:#define wc_example_usage
 | ||||
| //usage:       "$ wc /etc/passwd\n"
 | ||||
| //usage:       "     31      46    1365 /etc/passwd\n"
 | ||||
| 
 | ||||
| /* Order is important if we want to be compatible with
 | ||||
|  * column order in "wc -cmlwL" output: | ||||
|  */ | ||||
| enum { | ||||
| 	WC_LINES    = 0, /* -l */ | ||||
| 	WC_WORDS    = 1, /* -w */ | ||||
| 	WC_UNICHARS = 2, /* -m */ | ||||
| 	WC_BYTES    = 3, /* -c */ | ||||
| 	WC_LENGTH   = 4, /* -L */ | ||||
| 	NUM_WCS     = 5, | ||||
| }; | ||||
| 
 | ||||
| int wc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | ||||
| int wc_main(int argc UNUSED_PARAM, char **argv) | ||||
| { | ||||
| 	const char *arg; | ||||
| 	const char *start_fmt = " %9"COUNT_FMT + 1; | ||||
| 	const char *fname_fmt = " %s\n"; | ||||
| 	COUNT_T *pcounts; | ||||
| 	COUNT_T counts[NUM_WCS]; | ||||
| 	COUNT_T totals[NUM_WCS]; | ||||
| 	int num_files; | ||||
| 	smallint status = EXIT_SUCCESS; | ||||
| 	unsigned print_type; | ||||
| 
 | ||||
| 	init_unicode(); | ||||
| 
 | ||||
| 	print_type = getopt32(argv, "lwmcL"); | ||||
| 
 | ||||
| 	if (print_type == 0) { | ||||
| 		print_type = (1 << WC_LINES) | (1 << WC_WORDS) | (1 << WC_BYTES); | ||||
| 	} | ||||
| 
 | ||||
| 	argv += optind; | ||||
| 	if (!argv[0]) { | ||||
| 		*--argv = (char *) bb_msg_standard_input; | ||||
| 		fname_fmt = "\n"; | ||||
| 	} | ||||
| 	if (!argv[1]) { /* zero or one filename? */ | ||||
| 		if (!((print_type-1) & print_type)) /* exactly one option? */ | ||||
| 			start_fmt = "%"COUNT_FMT; | ||||
| 	} | ||||
| 
 | ||||
| 	memset(totals, 0, sizeof(totals)); | ||||
| 
 | ||||
| 	pcounts = counts; | ||||
| 
 | ||||
| 	num_files = 0; | ||||
| 	while ((arg = *argv++) != NULL) { | ||||
| 		FILE *fp; | ||||
| 		const char *s; | ||||
| 		unsigned u; | ||||
| 		unsigned linepos; | ||||
| 		smallint in_word; | ||||
| 
 | ||||
| 		++num_files; | ||||
| 		fp = fopen_or_warn_stdin(arg); | ||||
| 		if (!fp) { | ||||
| 			status = EXIT_FAILURE; | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		memset(counts, 0, sizeof(counts)); | ||||
| 		linepos = 0; | ||||
| 		in_word = 0; | ||||
| 
 | ||||
| 		while (1) { | ||||
| 			int c; | ||||
| 			/* Our -w doesn't match GNU wc exactly... oh well */ | ||||
| 
 | ||||
| 			c = getc(fp); | ||||
| 			if (c == EOF) { | ||||
| 				if (ferror(fp)) { | ||||
| 					bb_simple_perror_msg(arg); | ||||
| 					status = EXIT_FAILURE; | ||||
| 				} | ||||
| 				goto DO_EOF;  /* Treat an EOF as '\r'. */ | ||||
| 			} | ||||
| 
 | ||||
| 			/* Cater for -c and -m */ | ||||
| 			++counts[WC_BYTES]; | ||||
| 			if (unicode_status != UNICODE_ON /* every byte is a new char */ | ||||
| 			 || (c & 0xc0) != 0x80 /* it isn't a 2nd+ byte of a Unicode char */ | ||||
| 			) { | ||||
| 				++counts[WC_UNICHARS]; | ||||
| 			} | ||||
| 
 | ||||
| 			if (isprint_asciionly(c)) { /* FIXME: not unicode-aware */ | ||||
| 				++linepos; | ||||
| 				if (!isspace(c)) { | ||||
| 					in_word = 1; | ||||
| 					continue; | ||||
| 				} | ||||
| 			} else if ((unsigned)(c - 9) <= 4) { | ||||
| 				/* \t  9
 | ||||
| 				 * \n 10 | ||||
| 				 * \v 11 | ||||
| 				 * \f 12 | ||||
| 				 * \r 13 | ||||
| 				 */ | ||||
| 				if (c == '\t') { | ||||
| 					linepos = (linepos | 7) + 1; | ||||
| 				} else {  /* '\n', '\r', '\f', or '\v' */ | ||||
|  DO_EOF: | ||||
| 					if (linepos > counts[WC_LENGTH]) { | ||||
| 						counts[WC_LENGTH] = linepos; | ||||
| 					} | ||||
| 					if (c == '\n') { | ||||
| 						++counts[WC_LINES]; | ||||
| 					} | ||||
| 					if (c != '\v') { | ||||
| 						linepos = 0; | ||||
| 					} | ||||
| 				} | ||||
| 			} else { | ||||
| 				continue; | ||||
| 			} | ||||
| 
 | ||||
| 			counts[WC_WORDS] += in_word; | ||||
| 			in_word = 0; | ||||
| 			if (c == EOF) { | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		fclose_if_not_stdin(fp); | ||||
| 
 | ||||
| 		if (totals[WC_LENGTH] < counts[WC_LENGTH]) { | ||||
| 			totals[WC_LENGTH] = counts[WC_LENGTH]; | ||||
| 		} | ||||
| 		totals[WC_LENGTH] -= counts[WC_LENGTH]; | ||||
| 
 | ||||
|  OUTPUT: | ||||
| 		/* coreutils wc tries hard to print pretty columns
 | ||||
| 		 * (saves results for all files, finds max col len etc...) | ||||
| 		 * we won't try that hard, it will bloat us too much */ | ||||
| 		s = start_fmt; | ||||
| 		u = 0; | ||||
| 		do { | ||||
| 			if (print_type & (1 << u)) { | ||||
| 				printf(s, pcounts[u]); | ||||
| 				s = " %9"COUNT_FMT; /* Ok... restore the leading space. */ | ||||
| 			} | ||||
| 			totals[u] += pcounts[u]; | ||||
| 		} while (++u < NUM_WCS); | ||||
| 		printf(fname_fmt, arg); | ||||
| 	} | ||||
| 
 | ||||
| 	/* If more than one file was processed, we want the totals.  To save some
 | ||||
| 	 * space, we set the pcounts ptr to the totals array.  This has the side | ||||
| 	 * effect of trashing the totals array after outputting it, but that's | ||||
| 	 * irrelavent since we no longer need it. */ | ||||
| 	if (num_files > 1) { | ||||
| 		num_files = 0;  /* Make sure we don't get here again. */ | ||||
| 		arg = "total"; | ||||
| 		pcounts = totals; | ||||
| 		--argv; | ||||
| 		goto OUTPUT; | ||||
| 	} | ||||
| 
 | ||||
| 	fflush_stdout_and_exit(status); | ||||
| } | ||||
							
								
								
									
										1034
									
								
								historical/gnu-wc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1034
									
								
								historical/gnu-wc.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										118
									
								
								historical/plan9-wc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								historical/plan9-wc.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,118 @@ | |||
| /*
 | ||||
|  * Count bytes within runes, if it fits in a uvlong, and other things. | ||||
|  */ | ||||
| #include <u.h> | ||||
| #include <libc.h> | ||||
| #include <bio.h> | ||||
| 
 | ||||
| /* flags, per-file counts, and total counts */ | ||||
| static int pline, pword, prune, pbadr, pchar; | ||||
| static uvlong nline, nword, nrune, nbadr, nchar; | ||||
| static uvlong tnline, tnword, tnrune, tnbadr, tnchar; | ||||
| 
 | ||||
| enum{Space, Word}; | ||||
| 
 | ||||
| static void | ||||
| wc(Biobuf *bin) | ||||
| { | ||||
| 	int where; | ||||
| 	long r; | ||||
| 
 | ||||
| 	nline = 0; | ||||
| 	nword = 0; | ||||
| 	nrune = 0; | ||||
| 	nbadr = 0; | ||||
| 	where = Space; | ||||
| 	while ((long)(r = Bgetrune(bin)) >= 0) { | ||||
| 		nrune++; | ||||
| 		if(r == Runeerror) { | ||||
| 			nbadr++; | ||||
| 			continue; | ||||
| 		} | ||||
| 		if(r == '\n') | ||||
| 			nline++; | ||||
| 		if(where == Word){ | ||||
| 			if(isspacerune(r)) | ||||
| 				where = Space; | ||||
| 		}else | ||||
| 			if(isspacerune(r) == 0){ | ||||
| 				where = Word; | ||||
| 				nword++; | ||||
| 			} | ||||
| 	} | ||||
| 	nchar = Boffset(bin); | ||||
| 	tnline += nline; | ||||
| 	tnword += nword; | ||||
| 	tnrune += nrune; | ||||
| 	tnbadr += nbadr; | ||||
| 	tnchar += nchar; | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| report(uvlong nline, uvlong nword, uvlong nrune, uvlong nbadr, uvlong nchar, char *fname) | ||||
| { | ||||
| 	char line[1024], *s, *e; | ||||
| 
 | ||||
| 	s = line; | ||||
| 	e = line + sizeof line; | ||||
| 	line[0] = 0; | ||||
| 	if(pline) | ||||
| 		s = seprint(s, e, " %7llud", nline); | ||||
| 	if(pword) | ||||
| 		s = seprint(s, e, " %7llud", nword); | ||||
| 	if(prune) | ||||
| 		s = seprint(s, e, " %7llud", nrune); | ||||
| 	if(pbadr) | ||||
| 		s = seprint(s, e, " %7llud", nbadr); | ||||
| 	if(pchar) | ||||
| 		s = seprint(s, e, " %7llud", nchar); | ||||
| 	if(fname != nil) | ||||
| 		seprint(s, e, " %s",   fname); | ||||
| 	print("%s\n", line+1); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| main(int argc, char *argv[]) | ||||
| { | ||||
| 	char *sts; | ||||
| 	Biobuf sin, *bin; | ||||
| 	int i; | ||||
| 
 | ||||
| 	sts = nil; | ||||
| 	ARGBEGIN { | ||||
| 	case 'l': pline++; break; | ||||
| 	case 'w': pword++; break; | ||||
| 	case 'r': prune++; break; | ||||
| 	case 'b': pbadr++; break; | ||||
| 	case 'c': pchar++; break; | ||||
| 	default: | ||||
| 		fprint(2, "Usage: %s [-lwrbc] [file ...]\n", argv0); | ||||
| 		exits("usage"); | ||||
| 	} ARGEND | ||||
| 	if(pline+pword+prune+pbadr+pchar == 0){ | ||||
| 		pline = 1; | ||||
| 		pword = 1; | ||||
| 		pchar = 1; | ||||
| 	} | ||||
| 	if(argc == 0){ | ||||
| 		Binit(&sin, 0, OREAD); | ||||
| 		wc(&sin); | ||||
| 		report(nline, nword, nrune, nbadr, nchar, nil); | ||||
| 		Bterm(&sin); | ||||
| 	}else{ | ||||
| 		for(i = 0; i < argc; i++){ | ||||
| 			bin = Bopen(argv[i], OREAD); | ||||
| 			if(bin == nil){ | ||||
| 				perror(argv[i]); | ||||
| 				sts = "can't open"; | ||||
| 				continue; | ||||
| 			} | ||||
| 			wc(bin); | ||||
| 			report(nline, nword, nrune, nbadr, nchar, argv[i]); | ||||
| 			Bterm(bin); | ||||
| 		} | ||||
| 		if(argc>1) | ||||
| 			report(tnline, tnword, tnrune, tnbadr, tnchar, "total"); | ||||
| 	} | ||||
| 	exits(sts); | ||||
| } | ||||
							
								
								
									
										352
									
								
								historical/plan9port-wc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										352
									
								
								historical/plan9port-wc.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,352 @@ | |||
| /*
 | ||||
|  * wc -- count things in utf-encoded text files | ||||
|  * Bugs: | ||||
|  *	The only white space characters recognized are ' ', '\t' and '\n', even though | ||||
|  *	ISO 10646 has many more blanks scattered through it. | ||||
|  *	Should count characters that cannot occur in any rune (hex f0-ff) separately. | ||||
|  *	Should count non-canonical runes (e.g. hex c1,80 instead of hex 40). | ||||
|  */ | ||||
| #include <u.h> | ||||
| #include <libc.h> | ||||
| #define	NBUF	(8*1024) | ||||
| uvlong nline, tnline, pline; | ||||
| uvlong nword, tnword, pword; | ||||
| uvlong nrune, tnrune, prune; | ||||
| uvlong nbadr, tnbadr, pbadr; | ||||
| uvlong nchar, tnchar, pchar; | ||||
| void count(int, char *); | ||||
| void report(uvlong, uvlong, uvlong, uvlong, uvlong, char *); | ||||
| void | ||||
| main(int argc, char *argv[]) | ||||
| { | ||||
| 	char *status=""; | ||||
| 	int i, f; | ||||
| 	ARGBEGIN { | ||||
| 	case 'l': pline++; break; | ||||
| 	case 'w': pword++; break; | ||||
| 	case 'r': prune++; break; | ||||
| 	case 'b': pbadr++; break; | ||||
| 	case 'c': pchar++; break; | ||||
| 	default: | ||||
| 		fprint(2, "Usage: %s [-lwrbc] [file ...]\n", argv0); | ||||
| 		exits("usage"); | ||||
| 	} ARGEND | ||||
| 	if(pline+pword+prune+pbadr+pchar == 0) { | ||||
| 		pline = 1; | ||||
| 		pword = 1; | ||||
| 		pchar = 1; | ||||
| 	} | ||||
| 	if(argc==0) | ||||
| 		count(0, 0); | ||||
| 	else{ | ||||
| 		for(i=0;i<argc;i++){ | ||||
| 			f=open(argv[i], OREAD); | ||||
| 			if(f<0){ | ||||
| 				perror(argv[i]); | ||||
| 				status="can't open"; | ||||
| 			} | ||||
| 			else{ | ||||
| 				count(f, argv[i]); | ||||
| 				tnline+=nline; | ||||
| 				tnword+=nword; | ||||
| 				tnrune+=nrune; | ||||
| 				tnbadr+=nbadr; | ||||
| 				tnchar+=nchar; | ||||
| 				close(f); | ||||
| 			} | ||||
| 		} | ||||
| 		if(argc>1) | ||||
| 			report(tnline, tnword, tnrune, tnbadr, tnchar, "total"); | ||||
| 	} | ||||
| 	exits(status); | ||||
| } | ||||
| void | ||||
| report(uvlong nline, uvlong nword, uvlong nrune, uvlong nbadr, uvlong nchar, char *fname) | ||||
| { | ||||
| 	char line[1024], word[128]; | ||||
| 	line[0] = '\0'; | ||||
| 	if(pline){ | ||||
| 		sprint(word, " %7llud", nline); | ||||
| 		strcat(line, word); | ||||
| 	} | ||||
| 	if(pword){ | ||||
| 		sprint(word, " %7llud", nword); | ||||
| 		strcat(line, word); | ||||
| 	} | ||||
| 	if(prune){ | ||||
| 		sprint(word, " %7llud", nrune); | ||||
| 		strcat(line, word); | ||||
| 	} | ||||
| 	if(pbadr){ | ||||
| 		sprint(word, " %7llud", nbadr); | ||||
| 		strcat(line, word); | ||||
| 	} | ||||
| 	if(pchar){ | ||||
| 		sprint(word, " %7llud", nchar); | ||||
| 		strcat(line, word); | ||||
| 	} | ||||
| 	if(fname){ | ||||
| 		sprint(word, " %s",   fname); | ||||
| 		strcat(line, word); | ||||
| 	} | ||||
| 	print("%s\n", line+1); | ||||
| } | ||||
| /*
 | ||||
|  * How it works.  Start in statesp.  Each time we read a character, | ||||
|  * increment various counts, and do state transitions according to the | ||||
|  * following table.  If we're not in statesp or statewd when done, the | ||||
|  * file ends with a partial rune. | ||||
|  *        |                character | ||||
|  *  state |09,20| 0a  |00-7f|80-bf|c0-df|e0-ef|f0-f7|f8-ff | ||||
|  * -------+-----+-----+-----+-----+-----+-----+-----+----- | ||||
|  * statesp|ASP  |ASPN |AWDW |AWDWX|AC2W |AC3W |AC4W |AWDWX | ||||
|  * statewd|ASP  |ASPN |AWD  |AWDX |AC2  |AC3  |AC4  |AWDX | ||||
|  * statec2|ASPX |ASPNX|AWDX |AWDR |AC2X |AC3X |AC4X |AWDX | ||||
|  * statec3|ASPX |ASPNX|AWDX |AC2R |AC2X |AC3X |AC4X |AWDX | ||||
|  * statec4|ASPX |ASPNX|AWDX |AC3R |AC2X |AC3X |AC4X |AWDX	f4 8f bf bf | ||||
|  */ | ||||
| enum{			/* actions */ | ||||
| 	AC2,		/* enter statec2 */ | ||||
| 	AC2R,		/* enter statec2, don't count a rune */ | ||||
| 	AC2W,		/* enter statec2, count a word */ | ||||
| 	AC2X,		/* enter statec2, count a bad rune */ | ||||
| 	AC3,		/* enter statec3 */ | ||||
| 	AC3R,		/* enter statec3, don't count a rune */ | ||||
| 	AC3W,		/* enter statec3, count a word */ | ||||
| 	AC3X,		/* enter statec3, count a bad rune */ | ||||
| 	AC4,		/* enter statec4 */ | ||||
| 	AC4W,		/* enter statec4, count a word */ | ||||
| 	AC4X,		/* enter statec4, count a bad rune */ | ||||
| 	ASP,		/* enter statesp */ | ||||
| 	ASPN,		/* enter statesp, count a newline */ | ||||
| 	ASPNX,		/* enter statesp, count a newline, count a bad rune */ | ||||
| 	ASPX,		/* enter statesp, count a bad rune */ | ||||
| 	AWD,		/* enter statewd */ | ||||
| 	AWDR,		/* enter statewd, don't count a rune */ | ||||
| 	AWDW,		/* enter statewd, count a word */ | ||||
| 	AWDWX,		/* enter statewd, count a word, count a bad rune */ | ||||
| 	AWDX,		/* enter statewd, count a bad rune */ | ||||
| }; | ||||
| uchar statesp[256]={	/* looking for the start of a word */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 00-07 */ | ||||
| AWDW, ASP,  ASPN, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 08-0f */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 10-17 */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 18-1f */ | ||||
| ASP,  AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 20-27 */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 28-2f */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 30-37 */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 38-3f */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 40-47 */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 48-4f */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 50-57 */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 58-5f */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 60-67 */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 68-6f */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 70-77 */ | ||||
| AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW, AWDW,	/* 78-7f */ | ||||
| AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* 80-87 */ | ||||
| AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* 88-8f */ | ||||
| AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* 90-97 */ | ||||
| AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* 98-9f */ | ||||
| AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* a0-a7 */ | ||||
| AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* a8-af */ | ||||
| AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* b0-b7 */ | ||||
| AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* b8-bf */ | ||||
| AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W,	/* c0-c7 */ | ||||
| AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W,	/* c8-cf */ | ||||
| AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W,	/* d0-d7 */ | ||||
| AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W, AC2W,	/* d8-df */ | ||||
| AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, AC3W,	/* e0-e7 */ | ||||
| AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, AC3W, AC3W,	/* e8-ef */ | ||||
| AC4W, AC4W, AC4W, AC4W, AC4W, AC4W, AC4W, AC4W, /* f0-f7 */ | ||||
| AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,AWDWX,/* f8-ff */ | ||||
| }; | ||||
| uchar statewd[256]={	/* looking for the next character in a word */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 00-07 */ | ||||
| AWD,  ASP,  ASPN, AWD,  AWD,  AWD,  AWD,  AWD,	/* 08-0f */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 10-17 */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 18-1f */ | ||||
| ASP,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 20-27 */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 28-2f */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 30-37 */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 38-3f */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 40-47 */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 48-4f */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 50-57 */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 58-5f */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 60-67 */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 68-6f */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 70-77 */ | ||||
| AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,  AWD,	/* 78-7f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 80-87 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 88-8f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 90-97 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 98-9f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* a0-a7 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* a8-af */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* b0-b7 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* b8-bf */ | ||||
| AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,	/* c0-c7 */ | ||||
| AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,	/* c8-cf */ | ||||
| AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,	/* d0-d7 */ | ||||
| AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,  AC2,	/* d8-df */ | ||||
| AC3,  AC3,  AC3,  AC3,  AC3,  AC3,  AC3,  AC3,	/* e0-e7 */ | ||||
| AC3,  AC3,  AC3,  AC3,  AC3,  AC3,  AC3,  AC3,	/* e8-ef */ | ||||
| AC4,  AC4,  AC4,  AC4,  AC4,  AC4,  AC4,  AC4,	/* f0-f7 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* f8-ff */ | ||||
| }; | ||||
| uchar statec2[256]={	/* looking for 10xxxxxx to complete a rune */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 00-07 */ | ||||
| AWDX, ASPX, ASPNX,AWDX, AWDX, AWDX, AWDX, AWDX,	/* 08-0f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 10-17 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 18-1f */ | ||||
| ASPX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 20-27 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 28-2f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 30-37 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 38-3f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 40-47 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 48-4f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 50-57 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 58-5f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 60-67 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 68-6f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 70-77 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 78-7f */ | ||||
| AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,	/* 80-87 */ | ||||
| AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,	/* 88-8f */ | ||||
| AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,	/* 90-97 */ | ||||
| AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,	/* 98-9f */ | ||||
| AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,	/* a0-a7 */ | ||||
| AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,	/* a8-af */ | ||||
| AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,	/* b0-b7 */ | ||||
| AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR, AWDR,	/* b8-bf */ | ||||
| AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,	/* c0-c7 */ | ||||
| AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,	/* c8-cf */ | ||||
| AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,	/* d0-d7 */ | ||||
| AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,	/* d8-df */ | ||||
| AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X,	/* e0-e7 */ | ||||
| AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X,	/* e8-ef */ | ||||
| AC4X, AC4X, AC4X, AC4X, AC4X, AC4X, AC4X, AC4X,	/* f0-f7 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* f8-ff */ | ||||
| }; | ||||
| uchar statec3[256]={	/* looking for 10xxxxxx,10xxxxxx to complete a rune */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 00-07 */ | ||||
| AWDX, ASPX, ASPNX,AWDX, AWDX, AWDX, AWDX, AWDX,	/* 08-0f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 10-17 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 18-1f */ | ||||
| ASPX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 20-27 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 28-2f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 30-37 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 38-3f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 40-47 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 48-4f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 50-57 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 58-5f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 60-67 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 68-6f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 70-77 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 78-7f */ | ||||
| AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,	/* 80-87 */ | ||||
| AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,	/* 88-8f */ | ||||
| AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,	/* 90-97 */ | ||||
| AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,	/* 98-9f */ | ||||
| AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,	/* a0-a7 */ | ||||
| AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,	/* a8-af */ | ||||
| AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,	/* b0-b7 */ | ||||
| AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R, AC2R,	/* b8-bf */ | ||||
| AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,	/* c0-c7 */ | ||||
| AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,	/* c8-cf */ | ||||
| AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,	/* d0-d7 */ | ||||
| AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,	/* d8-df */ | ||||
| AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X,	/* e0-e7 */ | ||||
| AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X,	/* e8-ef */ | ||||
| AC4X, AC4X, AC4X, AC4X, AC4X, AC4X, AC4X, AC4X,	/* f0-f7 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* f8-ff */ | ||||
| }; | ||||
| uchar statec4[256]={	/* looking for 10xxxxxx,10xxxxxx,10xxxxxx to complete a rune */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 00-07 */ | ||||
| AWDX, ASPX, ASPNX,AWDX, AWDX, AWDX, AWDX, AWDX,	/* 08-0f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 10-17 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 18-1f */ | ||||
| ASPX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 20-27 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 28-2f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 30-37 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 38-3f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 40-47 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 48-4f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 50-57 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 58-5f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 60-67 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 68-6f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 70-77 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 78-7f */ | ||||
| AC3R, AC3R, AC3R, AC3R, AC3R, AC3R, AC3R, AC3R,	/* 80-87 */ | ||||
| AC3R, AC3R, AC3R, AC3R, AC3R, AC3R, AC3R, AC3R,	/* 88-8f */ | ||||
| AC3R, AC3R, AC3R, AC3R, AC3R, AC3R, AC3R, AC3R,	/* 90-97 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* 98-9f */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* a0-a7 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* a8-af */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* b0-b7 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* b8-bf */ | ||||
| AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,	/* c0-c7 */ | ||||
| AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,	/* c8-cf */ | ||||
| AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,	/* d0-d7 */ | ||||
| AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X, AC2X,	/* d8-df */ | ||||
| AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X,	/* e0-e7 */ | ||||
| AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X, AC3X,	/* e8-ef */ | ||||
| AC4X, AC4X, AC4X, AC4X, AC4X, AC4X, AC4X, AC4X,	/* f0-f7 */ | ||||
| AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX, AWDX,	/* f8-ff */ | ||||
| }; | ||||
| void | ||||
| count(int f, char *name) | ||||
| { | ||||
| 	int n; | ||||
| 	uchar buf[NBUF]; | ||||
| 	uchar *bufp, *ebuf; | ||||
| 	uchar *state=statesp; | ||||
| 
 | ||||
| 	nline = 0; | ||||
| 	nword = 0; | ||||
| 	nrune = 0; | ||||
| 	nbadr = 0; | ||||
| 	nchar = 0; | ||||
| 
 | ||||
| 	for(;;){ | ||||
| 		n=read(f, buf, NBUF); | ||||
| 		if(n<=0) | ||||
| 			break; | ||||
| 		nchar+=n; | ||||
| 		nrune+=n;	/* might be too large, gets decreased later */ | ||||
| 		bufp=buf; | ||||
| 		ebuf=buf+n; | ||||
| 		do{ | ||||
| 			switch(state[*bufp]){ | ||||
| 			case AC2:   state=statec2;                   break; | ||||
| 			case AC2R:  state=statec2; --nrune;          break; | ||||
| 			case AC2W:  state=statec2; nword++;          break; | ||||
| 			case AC2X:  state=statec2;          nbadr++; break; | ||||
| 			case AC3:   state=statec3;                   break; | ||||
| 			case AC3R:  state=statec3; --nrune;          break; | ||||
| 			case AC3W:  state=statec3; nword++;          break; | ||||
| 			case AC3X:  state=statec3;          nbadr++; break; | ||||
| 			case AC4:   state=statec4;                   break; | ||||
| 			case AC4W:  state=statec4; nword++;          break; | ||||
| 			case AC4X:  state=statec4;          nbadr++; break; | ||||
| 			case ASP:   state=statesp;                   break; | ||||
| 			case ASPN:  state=statesp; nline++;          break; | ||||
| 			case ASPNX: state=statesp; nline++; nbadr++; break; | ||||
| 			case ASPX:  state=statesp;          nbadr++; break; | ||||
| 			case AWD:   state=statewd;                   break; | ||||
| 			case AWDR:  state=statewd; --nrune;          break; | ||||
| 			case AWDW:  state=statewd; nword++;          break; | ||||
| 			case AWDWX: state=statewd; nword++; nbadr++; break; | ||||
| 			case AWDX:  state=statewd;          nbadr++; break; | ||||
| 			} | ||||
| 		}while(++bufp!=ebuf); | ||||
| 	} | ||||
| 	if(state!=statesp && state!=statewd) | ||||
| 		nbadr++; | ||||
| 	if(n<0) | ||||
| 		fprint(2, "%s: %r\n", name); | ||||
| 	report(nline, nword, nrune, nbadr, nchar, name); | ||||
| } | ||||
							
								
								
									
										86
									
								
								historical/unix-v7-wc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								historical/unix-v7-wc.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,86 @@ | |||
| /* wc line and word count */ | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| main(argc, argv) | ||||
| char **argv; | ||||
| { | ||||
| 	int i, token; | ||||
| 	register FILE *fp; | ||||
| 	long linect, wordct, charct; | ||||
| 	long tlinect=0, twordct=0, tcharct=0; | ||||
| 	char *wd; | ||||
| 	register int c; | ||||
| 
 | ||||
| 	wd = "lwc"; | ||||
| 	if(argc > 1 && *argv[1] == '-') { | ||||
| 		wd = ++argv[1]; | ||||
| 		argc--; | ||||
| 		argv++; | ||||
| 	} | ||||
| 
 | ||||
| 	i = 1; | ||||
| 	fp = stdin; | ||||
| 	do { | ||||
| 		if(argc>1 && (fp=fopen(argv[i], "r")) == NULL) { | ||||
| 			fprintf(stderr, "wc: can't open %s\n", argv[i]); | ||||
| 			continue; | ||||
| 		} | ||||
| 		linect = 0; | ||||
| 		wordct = 0; | ||||
| 		charct = 0; | ||||
| 		token = 0; | ||||
| 		for(;;) { | ||||
| 			c = getc(fp); | ||||
| 			if (c == EOF) | ||||
| 				break; | ||||
| 			charct++; | ||||
| 			if(' '<c&&c<0177) { | ||||
| 				if(!token) { | ||||
| 					wordct++; | ||||
| 					token++; | ||||
| 				} | ||||
| 				continue; | ||||
| 			} | ||||
| 			if(c=='\n') | ||||
| 				linect++; | ||||
| 			else if(c!=' '&&c!='\t') | ||||
| 				continue; | ||||
| 			token = 0; | ||||
| 		} | ||||
| 		/* print lines, words, chars */ | ||||
| 		wcp(wd, charct, wordct, linect); | ||||
| 		if(argc>1) { | ||||
| 			printf(" %s\n", argv[i]); | ||||
| 		} else | ||||
| 			printf("\n"); | ||||
| 		fclose(fp); | ||||
| 		tlinect += linect; | ||||
| 		twordct += wordct; | ||||
| 		tcharct += charct; | ||||
| 	} while(++i<argc); | ||||
| 	if(argc > 2) { | ||||
| 		wcp(wd, tcharct, twordct, tlinect); | ||||
| 		printf(" total\n"); | ||||
| 	} | ||||
| 	exit(0); | ||||
| } | ||||
| 
 | ||||
| wcp(wd, charct, wordct, linect) | ||||
| register char *wd; | ||||
| long charct; long wordct; long linect; | ||||
| { | ||||
| 	while (*wd) switch (*wd++) { | ||||
| 	case 'l': | ||||
| 		printf("%7ld", linect); | ||||
| 		break; | ||||
| 
 | ||||
| 	case 'w': | ||||
| 		printf("%7ld ", wordct); | ||||
| 		break; | ||||
| 
 | ||||
| 	case 'c': | ||||
| 		printf("%7ld", charct); | ||||
| 		break; | ||||
| 	} | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user