int listx_alloc(listx_t *l) { int cell; if(l->bitmap==NULL) { cell=list_nextz(&(l->list)); l->bitmap=bitlist_new(l->list.m); assert(l->bitmap!=NULL); bitlist_set(l->bitmap,cell); return cell; } else { cell=bitlist_scan(l->bitmap,SCAN_FORWARD|SCAN_CLEAR); if((cell<0)||(cell>=l->list.q)) cell=list_nextz(&(l->list)); if(l->list.m != l->bitmap->qty ) l->bitmap=bitlist_resize(l->bitmap,l->list.m); bitlist_set(l->bitmap,cell); return cell; } return -1; }
int main (int argc, char *argv[]) { bitlist_t bl; int rv, i, bit, first; if (bitlist_init(&bl, 0, LOW, HI, 0, NULL) != 0) { fprintf(stderr, "bitlist_init failed for lo %d hi %d\n", LOW, HI); return -1; } /* access outside the limits, these should fail */ for (i = LOW - 1000; i < LOW; i++) { rv = bitlist_get(&bl, i, &bit); if (0 == rv) { fprintf(stderr, "erroneously returned bit number %d\n", i); } } for (i = HI + 1; i < HI + 1000; i++) { rv = bitlist_get(&bl, i, &bit); if (0 == rv) { fprintf(stderr, "erroneously returned bit number %d\n", i); } } /* these should all return 0 */ for (i = LOW; i <= HI; i++) { rv = bitlist_get(&bl, i, &bit); if ((rv != 0) || (bit != 0)) { fprintf(stderr, "returned wrong bit %d for bit number %d\n", bit, i); } } /* check for first set bits */ for (i = LOW; i <= HI; i++) { rv = bitlist_set(&bl, i); if (rv) { fprintf(stderr, "setting bit %d failed\n", i); } rv = bitlist_first_set_bit(&bl, &first); if (rv || (first != i)) { fprintf(stderr, "first set bit should be %d but it is %d\n", i, rv); } rv = bitlist_clear(&bl, i); if (rv) { fprintf(stderr, "clearing bit %d failed\n", i); } } for (i = LOW; i <= HI; i++) { rv = bitlist_set(&bl, i); if (rv) { fprintf(stderr, "setting bit %d failed\n", i); } } /* now clear from the end and verify first clear bit */ for (i = HI; i >= LOW; i--) { rv = bitlist_clear(&bl, i); if (rv) { fprintf(stderr, "clearing bit %d failed\n", i); } rv = bitlist_first_clear_bit(&bl, &first); if (rv || (first != i)) { fprintf(stderr, "first clear bit should be %d but it is %d\n", i, rv); } } printf("if no error messages were printed, bitlist is sane\n"); return 0; }