embox
1/**
2* @file
3*
4* @date 21.10.2013
5* @author Eldar Abusalimov
6*/
7
8#include <limits.h>9#include <stdbool.h>10
11#include <lib/libds/bit.h>12#include <lib/libds/bitmap.h>13
14unsigned int __bitmap_find_bit(const unsigned long *bitmap, unsigned int nbits,15unsigned int start, bool zero_bit) {16const unsigned long *first;17const unsigned long *last;18const unsigned long *iter;19unsigned long bits;20
21if (start >= nbits) {22return nbits;23}24
25first = bitmap + BITMAP_OFFSET(start);26last = bitmap + BITMAP_OFFSET(nbits - 1);27
28for (iter = first; iter <= last; iter++) {29bits = *iter;30if (zero_bit) {31bits = ~bits;32}33if (iter == first) {34bits &= ~0UL << BITMAP_SHIFT(start);35}36if (iter == last) {37bits &= ~0UL >> (LONG_BIT - 1 - BITMAP_SHIFT(nbits - 1));38}39if (bits) {40return LONG_BIT * (iter - bitmap) + bit_ctz(bits);41}42}43
44return nbits;45}
46