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 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 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 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