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