1 /* $OpenBSD: bitstring_test.c,v 1.7 2024/08/26 12:15:40 bluhm Exp $ */
2 /* $NetBSD: bitstring_test.c,v 1.4 1995/04/29 05:44:35 cgd Exp $ */
3
4 /*
5 * this is a simple program to test bitstring.h
6 * inspect the output, you should notice problems
7 * choose the ATT or BSD flavor
8 */
9 // #define ATT /*-*/
10 #define BSD /*-*/
11
12 /*
13 * include the following define if you want the program to link. this
14 * corrects a misspeling in bitstring.h
15 */
16 #define _bitstr_size bitstr_size
17
18 #include <stdio.h>
19 #include <stdlib.h>
20
21 /* #ifdef NOTSOGOOD */
22 #include "bitstring.h"
23 /* #else */
24 /* #include "gbitstring.h" */
25 /* #endif */
26
27 int TEST_LENGTH;
28 #define DECL_TEST_LENGTH 37 /* a mostly random number */
29
30 static void
clearbits(bitstr_t * b,int n)31 clearbits(bitstr_t *b, int n)
32 {
33 register int i = bitstr_size(n);
34
35 while (i--)
36 *(b + i) = 0;
37 }
38
39 static void
printbits(bitstr_t * b,int n)40 printbits(bitstr_t *b, int n)
41 {
42 register int i, k;
43 int jc, js;
44
45 bit_ffc(b, n, &jc);
46 bit_ffs(b, n, &js);
47 (void) printf("%3d %3d ", jc, js);
48 for (i = 0; i < n; i++) {
49 (void) putchar((bit_test(b, i) ? '1' : '0'));
50 }
51 (void) putchar('\n');
52 }
53
54 int
main(int argc,char * argv[])55 main(int argc, char *argv[])
56 {
57 int i, j, k, *p;
58 bitstr_t *bs;
59 bitstr_t bit_decl(bss, DECL_TEST_LENGTH);
60
61 if (argc > 1)
62 TEST_LENGTH = atoi(argv[1]);
63 else
64 TEST_LENGTH = DECL_TEST_LENGTH;
65
66 if (TEST_LENGTH < 4) {
67 fprintf(stderr,
68 "TEST_LENGTH must be at least 4, but it is %d\n",
69 TEST_LENGTH);
70 exit(1);
71 }
72 (void) printf("Testing with TEST_LENGTH = %d\n\n", TEST_LENGTH);
73
74 (void) printf("test _bit_byte, _bit_mask, and bitstr_size\n");
75 (void) printf(" i _bit_byte(i) _bit_mask(i) bitstr_size(i)\n");
76 for (i = 0; i < TEST_LENGTH; i++) {
77 (void) printf("%3d%15d%15d%15d\n",
78 i, _bit_byte(i), _bit_mask(i), bitstr_size(i));
79 }
80
81 bs = bit_alloc(TEST_LENGTH);
82 clearbits(bs, TEST_LENGTH);
83 (void) printf("\ntest bit_alloc, clearbits, bit_ffc, bit_ffs\n");
84 (void) printf("be: 0 -1 ");
85 for (i = 0; i < TEST_LENGTH; i++)
86 (void) putchar('0');
87 (void) printf("\nis: ");
88 printbits(bs, TEST_LENGTH);
89
90 (void) printf("\ntest bit_set\n");
91 for (i = 0; i < TEST_LENGTH; i += 3) {
92 bit_set(bs, i);
93 }
94 (void) printf("be: 1 0 ");
95 for (i = 0; i < TEST_LENGTH; i++)
96 (void) putchar("100"[i % 3]);
97 (void) printf("\nis: ");
98 printbits(bs, TEST_LENGTH);
99
100 (void) printf("\ntest bit_clear\n");
101 for (i = 0; i < TEST_LENGTH; i += 6) {
102 bit_clear(bs, i);
103 }
104 (void) printf("be: 0 3 ");
105 for (i = 0; i < TEST_LENGTH; i++)
106 (void) putchar("000100"[i % 6]);
107 (void) printf("\nis: ");
108 printbits(bs, TEST_LENGTH);
109
110 (void) printf("\ntest bit_test using previous bitstring\n");
111 (void) printf(" i bit_test(i)\n");
112 for (i = 0; i < TEST_LENGTH; i++) {
113 (void) printf("%3d%15d\n",
114 i, bit_test(bs, i));
115 }
116
117 clearbits(bs, TEST_LENGTH);
118 (void) printf("\ntest clearbits\n");
119 (void) printf("be: 0 -1 ");
120 for (i = 0; i < TEST_LENGTH; i++)
121 (void) putchar('0');
122 (void) printf("\nis: ");
123 printbits(bs, TEST_LENGTH);
124
125 (void) printf("\ntest bit_nset and bit_nclear\n");
126 bit_nset(bs, 1, TEST_LENGTH - 2);
127 (void) printf("be: 0 1 0");
128 for (i = 0; i < TEST_LENGTH - 2; i++)
129 (void) putchar('1');
130 (void) printf("0\nis: ");
131 printbits(bs, TEST_LENGTH);
132
133 bit_nclear(bs, 2, TEST_LENGTH - 3);
134 (void) printf("be: 0 1 01");
135 for (i = 0; i < TEST_LENGTH - 4; i++)
136 (void) putchar('0');
137 (void) printf("10\nis: ");
138 printbits(bs, TEST_LENGTH);
139
140 bit_nclear(bs, 0, TEST_LENGTH - 1);
141 (void) printf("be: 0 -1 ");
142 for (i = 0; i < TEST_LENGTH; i++)
143 (void) putchar('0');
144 (void) printf("\nis: ");
145 printbits(bs, TEST_LENGTH);
146 bit_nset(bs, 0, TEST_LENGTH - 2);
147 (void) printf("be: %3d 0 ", TEST_LENGTH - 1);
148 for (i = 0; i < TEST_LENGTH - 1; i++)
149 (void) putchar('1');
150 putchar('0');
151 (void) printf("\nis: ");
152 printbits(bs, TEST_LENGTH);
153 bit_nclear(bs, 0, TEST_LENGTH - 1);
154 (void) printf("be: 0 -1 ");
155 for (i = 0; i < TEST_LENGTH; i++)
156 (void) putchar('0');
157 (void) printf("\nis: ");
158 printbits(bs, TEST_LENGTH);
159
160 (void) printf("\n");
161 (void) printf("first 1 bit should move right 1 position each line\n");
162 for (i = 0; i < TEST_LENGTH; i++) {
163 bit_nclear(bs, 0, TEST_LENGTH - 1);
164 bit_nset(bs, i, TEST_LENGTH - 1);
165 (void) printf("%3d ", i);
166 printbits(bs, TEST_LENGTH);
167 }
168
169 (void) printf("\n");
170 (void) printf("first 0 bit should move right 1 position each line\n");
171 for (i = 0; i < TEST_LENGTH; i++) {
172 bit_nset(bs, 0, TEST_LENGTH - 1);
173 bit_nclear(bs, i, TEST_LENGTH - 1);
174 (void) printf("%3d ", i);
175 printbits(bs, TEST_LENGTH);
176 }
177
178 (void) printf("\n");
179 (void) printf("first 0 bit should move left 1 position each line\n");
180 for (i = 0; i < TEST_LENGTH; i++) {
181 bit_nclear(bs, 0, TEST_LENGTH - 1);
182 bit_nset(bs, 0, TEST_LENGTH - 1 - i);
183 (void) printf("%3d ", i);
184 printbits(bs, TEST_LENGTH);
185 }
186
187 (void) printf("\n");
188 (void) printf("first 1 bit should move left 1 position each line\n");
189 for (i = 0; i < TEST_LENGTH; i++) {
190 bit_nset(bs, 0, TEST_LENGTH - 1);
191 bit_nclear(bs, 0, TEST_LENGTH - 1 - i);
192 (void) printf("%3d ", i);
193 printbits(bs, TEST_LENGTH);
194 }
195
196 (void) printf("\n");
197 (void) printf("0 bit should move right 1 position each line\n");
198 for (i = 0; i < TEST_LENGTH; i++) {
199 bit_nset(bs, 0, TEST_LENGTH - 1);
200 bit_nclear(bs, i, i);
201 (void) printf("%3d ", i);
202 printbits(bs, TEST_LENGTH);
203 }
204
205 (void) printf("\n");
206 (void) printf("1 bit should move right 1 position each line\n");
207 for (i = 0; i < TEST_LENGTH; i++) {
208 bit_nclear(bs, 0, TEST_LENGTH - 1);
209 bit_nset(bs, i, i);
210 (void) printf("%3d ", i);
211 printbits(bs, TEST_LENGTH);
212 }
213
214 (void) printf("\n");
215 (void) printf("CHI square test\n");
216 for (i = 0; i < TEST_LENGTH; i++) {
217 bit_nclear(bs, 0, TEST_LENGTH - 1);
218 bit_nset(bs, i, i);
219 bit_nset(bs, TEST_LENGTH - 1 - i, TEST_LENGTH - 1 - i);
220 (void) printf("%3d ", i);
221 printbits(bs, TEST_LENGTH);
222 }
223
224 (void) printf("\n");
225 (void) printf("macros should evaluate arguments only once\n");
226 i = j = 0;
227 _bit_byte(i++);
228 (void) printf("_bit_byte(%d) -> %d\n", j++, i);
229 _bit_mask(i++);
230 (void) printf("_bit_mask(%d) -> %d\n", j++, i);
231 bitstr_size(i++);
232 (void) printf("bitstr_size(%d) -> %d\n", j++, i);
233 free(bit_alloc(i++));
234 (void) printf("bit_alloc(%d) -> %d\n", j++, i);
235 { bitstr_t bit_decl(bd, i++); }
236 (void) printf("bit_alloc(%d) -> %d\n", j++, i);
237 bit_test(bs, i++);
238 (void) printf("bit_test(%d) -> %d\n", j++, i);
239 bit_set(bs, i++);
240 (void) printf("bit_set(%d) -> %d\n", j++, i);
241 bit_clear(bs, i++);
242 (void) printf("bit_clear(%d) -> %d\n", j++, i);
243 i %= TEST_LENGTH; j %= TEST_LENGTH;
244 bit_nclear(bs, i++, i++);
245 (void) printf("bit_nclear(%d, %d) -> %d\n", j, j + 1, i);
246 j += 2;
247 bit_nset(bs, i++, i++);
248 (void) printf("bit_nset(%d, %d) -> %d\n", j, j + 1, i);
249 j += 2;
250 p = &k;
251 bit_ffc(bs, i++, p++);
252 (void) printf("bit_ffc(%d, %ld) -> %d\n", j++, --p - &k, i);
253 bit_ffs(bs, i++, p++);
254 (void) printf("bit_ffs(%d, %ld) -> %d\n", j++, --p - &k, i);
255
256 (void) free(bs);
257 return (0);
258 }
259