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