diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/freq.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/freq.c')
-rwxr-xr-x | sys/src/cmd/freq.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/sys/src/cmd/freq.c b/sys/src/cmd/freq.c new file mode 100755 index 000000000..b5e075dab --- /dev/null +++ b/sys/src/cmd/freq.c @@ -0,0 +1,118 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> + +uvlong count[1<<16]; +Biobuf bout; + +void usage(void); +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{ + 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; + default: + usage(); + }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, "open %s: %r\n", argv[i]); + continue; + } + freq(f, argv[i]); + close(f); + } + exits(0); +} + +void +usage(void) +{ + fprint(2, "usage: freq [-cdorx] [file ...]\n"); + exits("usage"); +} + +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, "%8llud\n", count[i]); + } + Bflush(&bout); +} |