| #include <u.h> | 
 | #include <libc.h> | 
 | #include <bio.h> | 
 |  | 
 | long	count[1<<16]; | 
 | Biobuf	bout; | 
 |  | 
 | void	freq(int, char*); | 
 | long	flag; | 
 | enum | 
 | { | 
 | 	Fdec	= 1<<0, | 
 | 	Fhex	= 1<<1, | 
 | 	Foct	= 1<<2, | 
 | 	Fchar	= 1<<3, | 
 | 	Frune	= 1<<4 | 
 | }; | 
 |  | 
 | void | 
 | main(int argc, char *argv[]) | 
 | { | 
 | 	int f, i; | 
 |  | 
 | 	flag = 0; | 
 | 	Binit(&bout, 1, OWRITE); | 
 | 	ARGBEGIN{ | 
 | 	default: | 
 | 		fprint(2, "freq: unknown option %c\n", ARGC()); | 
 | 		exits("usage"); | 
 | 	case 'd': | 
 | 		flag |= Fdec; | 
 | 		break; | 
 | 	case 'x': | 
 | 		flag |= Fhex; | 
 | 		break; | 
 | 	case 'o': | 
 | 		flag |= Foct; | 
 | 		break; | 
 | 	case 'c': | 
 | 		flag |= Fchar; | 
 | 		break; | 
 | 	case 'r': | 
 | 		flag |= Frune; | 
 | 		break; | 
 | 	}ARGEND | 
 | 	if((flag&(Fdec|Fhex|Foct|Fchar)) == 0) | 
 | 		flag |= Fdec | Fhex | Foct | Fchar; | 
 | 	if(argc < 1) { | 
 | 		freq(0, "-"); | 
 | 		exits(0); | 
 | 	} | 
 | 	for(i=0; i<argc; i++) { | 
 | 		f = open(argv[i], 0); | 
 | 		if(f < 0) { | 
 | 			fprint(2, "cannot open %s\n", argv[i]); | 
 | 			continue; | 
 | 		} | 
 | 		freq(f, argv[i]); | 
 | 		close(f); | 
 | 	} | 
 | 	exits(0); | 
 | } | 
 |  | 
 | void | 
 | freq(int f, char *s) | 
 | { | 
 | 	Biobuf bin; | 
 | 	long c, i; | 
 |  | 
 | 	memset(count, 0, sizeof(count)); | 
 | 	Binit(&bin, f, OREAD); | 
 | 	if(flag & Frune) { | 
 | 		for(;;) { | 
 | 			c = Bgetrune(&bin); | 
 | 			if(c < 0) | 
 | 				break; | 
 | 			count[c]++; | 
 | 		} | 
 | 	} else { | 
 | 		for(;;) { | 
 | 			c = Bgetc(&bin); | 
 | 			if(c < 0) | 
 | 				break; | 
 | 			count[c]++; | 
 | 		} | 
 | 	} | 
 | 	Bterm(&bin); | 
 | 	if(c != Beof) | 
 | 		fprint(2, "freq: read error on %s\n", s); | 
 |  | 
 | 	for(i=0; i<nelem(count); i++) { | 
 | 		if(count[i] == 0) | 
 | 			continue; | 
 | 		if(flag & Fdec) | 
 | 			Bprint(&bout, "%3ld ", i); | 
 | 		if(flag & Foct) | 
 | 			Bprint(&bout, "%.3lo ", i); | 
 | 		if(flag & Fhex) | 
 | 			Bprint(&bout, "%.2lx ", i); | 
 | 		if(flag & Fchar) { | 
 | 			if(i <= 0x20 || | 
 | 			   i >= 0x7f && i < 0xa0 || | 
 | 			   i > 0xff && !(flag & Frune)) | 
 | 				Bprint(&bout, "- "); | 
 | 			else | 
 | 				Bprint(&bout, "%C ", (int)i); | 
 | 		} | 
 | 		Bprint(&bout, "%8ld\n", count[i]); | 
 | 	} | 
 | 	Bflush(&bout); | 
 | } |