Blame


1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
3 bc7cb1a1 2003-11-23 devnull #include <bio.h>
4 bc7cb1a1 2003-11-23 devnull
5 23efb34d 2013-01-04 0intro uvlong count[Runemax+1];
6 bc7cb1a1 2003-11-23 devnull Biobuf bout;
7 bc7cb1a1 2003-11-23 devnull
8 bc7cb1a1 2003-11-23 devnull void freq(int, char*);
9 bc7cb1a1 2003-11-23 devnull long flag;
10 bc7cb1a1 2003-11-23 devnull enum
11 bc7cb1a1 2003-11-23 devnull {
12 bc7cb1a1 2003-11-23 devnull Fdec = 1<<0,
13 bc7cb1a1 2003-11-23 devnull Fhex = 1<<1,
14 bc7cb1a1 2003-11-23 devnull Foct = 1<<2,
15 bc7cb1a1 2003-11-23 devnull Fchar = 1<<3,
16 cbeb0b26 2006-04-01 devnull Frune = 1<<4
17 bc7cb1a1 2003-11-23 devnull };
18 bc7cb1a1 2003-11-23 devnull
19 bc7cb1a1 2003-11-23 devnull void
20 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
21 bc7cb1a1 2003-11-23 devnull {
22 bc7cb1a1 2003-11-23 devnull int f, i;
23 bc7cb1a1 2003-11-23 devnull
24 bc7cb1a1 2003-11-23 devnull flag = 0;
25 bc7cb1a1 2003-11-23 devnull Binit(&bout, 1, OWRITE);
26 bc7cb1a1 2003-11-23 devnull ARGBEGIN{
27 bc7cb1a1 2003-11-23 devnull default:
28 bc7cb1a1 2003-11-23 devnull fprint(2, "freq: unknown option %c\n", ARGC());
29 bc7cb1a1 2003-11-23 devnull exits("usage");
30 bc7cb1a1 2003-11-23 devnull case 'd':
31 bc7cb1a1 2003-11-23 devnull flag |= Fdec;
32 bc7cb1a1 2003-11-23 devnull break;
33 bc7cb1a1 2003-11-23 devnull case 'x':
34 bc7cb1a1 2003-11-23 devnull flag |= Fhex;
35 bc7cb1a1 2003-11-23 devnull break;
36 bc7cb1a1 2003-11-23 devnull case 'o':
37 bc7cb1a1 2003-11-23 devnull flag |= Foct;
38 bc7cb1a1 2003-11-23 devnull break;
39 bc7cb1a1 2003-11-23 devnull case 'c':
40 bc7cb1a1 2003-11-23 devnull flag |= Fchar;
41 bc7cb1a1 2003-11-23 devnull break;
42 bc7cb1a1 2003-11-23 devnull case 'r':
43 bc7cb1a1 2003-11-23 devnull flag |= Frune;
44 bc7cb1a1 2003-11-23 devnull break;
45 bc7cb1a1 2003-11-23 devnull }ARGEND
46 bc7cb1a1 2003-11-23 devnull if((flag&(Fdec|Fhex|Foct|Fchar)) == 0)
47 bc7cb1a1 2003-11-23 devnull flag |= Fdec | Fhex | Foct | Fchar;
48 bc7cb1a1 2003-11-23 devnull if(argc < 1) {
49 bc7cb1a1 2003-11-23 devnull freq(0, "-");
50 bc7cb1a1 2003-11-23 devnull exits(0);
51 bc7cb1a1 2003-11-23 devnull }
52 bc7cb1a1 2003-11-23 devnull for(i=0; i<argc; i++) {
53 bc7cb1a1 2003-11-23 devnull f = open(argv[i], 0);
54 bc7cb1a1 2003-11-23 devnull if(f < 0) {
55 bc7cb1a1 2003-11-23 devnull fprint(2, "cannot open %s\n", argv[i]);
56 bc7cb1a1 2003-11-23 devnull continue;
57 bc7cb1a1 2003-11-23 devnull }
58 bc7cb1a1 2003-11-23 devnull freq(f, argv[i]);
59 bc7cb1a1 2003-11-23 devnull close(f);
60 bc7cb1a1 2003-11-23 devnull }
61 bc7cb1a1 2003-11-23 devnull exits(0);
62 bc7cb1a1 2003-11-23 devnull }
63 bc7cb1a1 2003-11-23 devnull
64 bc7cb1a1 2003-11-23 devnull void
65 bc7cb1a1 2003-11-23 devnull freq(int f, char *s)
66 bc7cb1a1 2003-11-23 devnull {
67 bc7cb1a1 2003-11-23 devnull Biobuf bin;
68 bc7cb1a1 2003-11-23 devnull long c, i;
69 bc7cb1a1 2003-11-23 devnull
70 bc7cb1a1 2003-11-23 devnull memset(count, 0, sizeof(count));
71 bc7cb1a1 2003-11-23 devnull Binit(&bin, f, OREAD);
72 bc7cb1a1 2003-11-23 devnull if(flag & Frune) {
73 bc7cb1a1 2003-11-23 devnull for(;;) {
74 bc7cb1a1 2003-11-23 devnull c = Bgetrune(&bin);
75 bc7cb1a1 2003-11-23 devnull if(c < 0)
76 bc7cb1a1 2003-11-23 devnull break;
77 bc7cb1a1 2003-11-23 devnull count[c]++;
78 bc7cb1a1 2003-11-23 devnull }
79 bc7cb1a1 2003-11-23 devnull } else {
80 bc7cb1a1 2003-11-23 devnull for(;;) {
81 bc7cb1a1 2003-11-23 devnull c = Bgetc(&bin);
82 bc7cb1a1 2003-11-23 devnull if(c < 0)
83 bc7cb1a1 2003-11-23 devnull break;
84 bc7cb1a1 2003-11-23 devnull count[c]++;
85 bc7cb1a1 2003-11-23 devnull }
86 bc7cb1a1 2003-11-23 devnull }
87 bc7cb1a1 2003-11-23 devnull Bterm(&bin);
88 bc7cb1a1 2003-11-23 devnull if(c != Beof)
89 bc7cb1a1 2003-11-23 devnull fprint(2, "freq: read error on %s\n", s);
90 bc7cb1a1 2003-11-23 devnull
91 bc7cb1a1 2003-11-23 devnull for(i=0; i<nelem(count); i++) {
92 bc7cb1a1 2003-11-23 devnull if(count[i] == 0)
93 bc7cb1a1 2003-11-23 devnull continue;
94 bc7cb1a1 2003-11-23 devnull if(flag & Fdec)
95 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%3ld ", i);
96 bc7cb1a1 2003-11-23 devnull if(flag & Foct)
97 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%.3lo ", i);
98 bc7cb1a1 2003-11-23 devnull if(flag & Fhex)
99 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%.2lx ", i);
100 bc7cb1a1 2003-11-23 devnull if(flag & Fchar) {
101 bc7cb1a1 2003-11-23 devnull if(i <= 0x20 ||
102 bc7cb1a1 2003-11-23 devnull i >= 0x7f && i < 0xa0 ||
103 bc7cb1a1 2003-11-23 devnull i > 0xff && !(flag & Frune))
104 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "- ");
105 bc7cb1a1 2003-11-23 devnull else
106 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%C ", (int)i);
107 bc7cb1a1 2003-11-23 devnull }
108 23efb34d 2013-01-04 0intro Bprint(&bout, "%8llud\n", count[i]);
109 bc7cb1a1 2003-11-23 devnull }
110 bc7cb1a1 2003-11-23 devnull Bflush(&bout);
111 bc7cb1a1 2003-11-23 devnull }