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