]> git.sur5r.net Git - cc65/blob - test/ref/cf.c
Merge pull request #133 from pfusik/fix-char-cast
[cc65] / test / ref / cf.c
1 /*
2   !!DESCRIPTION!! print character frequencies
3   !!ORIGIN!!      LCC 4.1 Testsuite
4   !!LICENCE!!     own, freely distributeable for non-profit. read CPYRIGHT.LCC
5 */
6
7 /*
8         cf - print character frequencies
9 */
10
11 #include <stdlib.h>
12 #include <stdio.h>
13 #include <ctype.h>
14
15 #define INFILE   "cf.in"
16
17 #ifndef NO_FLOATS
18 float f[0x100];
19 #else
20 signed f[0x100];
21 #endif
22
23 #ifdef NO_OLD_FUNC_DECL
24 int main(int argc,char **argv)
25 #else
26 main(argc, argv)
27 int argc;
28 char *argv[];
29 #endif
30 {
31         int i, c, nc;
32 #ifndef NO_FLOATS
33         float cutoff, atof();
34 #else
35         signed cutoff;
36 #endif
37
38         if (argc <= 1)
39 #ifndef NO_FLOATS
40                 cutoff = 0.0;
41 #else
42                 cutoff = 0;
43 #endif
44         else
45 #ifndef NO_FLOATS
46                 cutoff = atof(argv[1])/100;
47 #else
48                 cutoff = atoi(argv[1])/100;
49 #endif
50         for (i = 0; i < 0x100; )
51     {
52 #ifndef NO_FLOATS
53                 f[i++] = 0.0;
54 #else
55         f[i++] = 0;
56 #endif
57     }
58
59     printf("input:\n\n");
60     
61     nc = 0;
62     while ((c = GETCHAR()) != -1)
63     {
64 /*        printf("[%02x]",c); */
65         printf("%c",c);
66         f[c] += 1;
67         nc++;
68     }
69     printf("\n\ncount: %d\n\n",nc);
70
71     /*
72         now try to print a report in a way so that
73         the order is somewhat independent from the
74         target character set
75     */
76
77     printf("a-z char:freq\n\n");
78
79     /* first round ... lowercase characters */
80         for (i = 0; i < 0x100; ++i)
81     {
82                 if ((f[i]) && ((f[i]/nc) >= cutoff))
83         {
84                         if ((i >= 'a') && (i <= 'z'))
85             {
86                                 printf("%c", i);
87 #ifndef NO_FLOATS
88                 printf(":%.1f\n", 100*f[i]/nc);
89 #else
90                 printf(":%d\n", 100*f[i]/nc);
91 #endif
92                 f[i]=0;
93             }
94                 }
95     }
96
97     printf("A-Z char:freq\n\n");
98
99     /* second round ... uppercase characters */
100         for (i = 0; i < 0x100; ++i)
101     {
102                 if ((f[i]) && ((f[i]/nc) >= cutoff))
103         {
104                         if ((i >= 'A') && (i <= 'Z'))
105             {
106                                 printf("%c", i);
107 #ifndef NO_FLOATS
108                 printf(":%.1f\n", 100*f[i]/nc);
109 #else
110                 printf(":%d\n", 100*f[i]/nc);
111 #endif
112                 f[i]=0;
113             }
114                 }
115     }
116
117     printf("0-9 char:freq\n\n");
118
119     /* third round ... numbers */
120         for (i = 0; i < 0x100; ++i)
121     {
122                 if ((f[i]) && ((f[i]/nc) >= cutoff))
123         {
124                         if ((i >= '0') && (i <= '9'))
125             {
126                                 printf("%c", i);
127 #ifndef NO_FLOATS
128                 printf(":%.1f\n", 100*f[i]/nc);
129 #else
130                 printf(":%d\n", 100*f[i]/nc);
131 #endif
132                 f[i]=0;
133             }
134                 }
135     }
136
137     printf("isprint char:freq\n\n");
138
139     /* second last round ... remaining printable characters */
140         for (i = 0; i < 0x100; ++i)
141     {
142                 if ((f[i]) && ((f[i]/nc) >= cutoff))
143         {
144                         if(isprint(i))
145             {
146                                 printf("%c", i);
147 #ifndef NO_FLOATS
148                 printf(":%.1f\n", 100*f[i]/nc);
149 #else
150                 printf(":%d\n", 100*f[i]/nc);
151 #endif
152                 f[i]=0;
153             }
154                 }
155     }
156
157     printf("rest char:freq\n\n");
158
159     /* last round ... remaining non printable characters */
160         for (i = 0; i < 0x100; ++i)
161     {
162                 if ((f[i]) && ((f[i]/nc) >= cutoff))
163         {
164             if(i=='\n')
165             {
166                                 printf("newline");
167             }
168             else
169             {
170                                 printf("%03o", i);
171             }
172 #ifndef NO_FLOATS
173                 printf(":%.1f\n", 100*f[i]/nc);
174 #else
175                 printf(":%d\n", 100*f[i]/nc);
176 #endif
177                 }
178     }
179
180     return 0;
181 }