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