diff options
Diffstat (limited to 'usr.sbin/nsd/bitset.c')
-rw-r--r-- | usr.sbin/nsd/bitset.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/usr.sbin/nsd/bitset.c b/usr.sbin/nsd/bitset.c new file mode 100644 index 00000000000..f1f850e4db6 --- /dev/null +++ b/usr.sbin/nsd/bitset.c @@ -0,0 +1,109 @@ +/* + * bitset.h -- Dynamic bitset. + * + * Copyright (c) 2001-2020, NLnet Labs. All rights reserved. + * + * See LICENSE for the license. + * + */ +#include "config.h" +#include "bitset.h" + +#include <assert.h> +#include <limits.h> +#include <string.h> + +size_t nsd_bitset_size(size_t bits) +{ + if(bits == 0) + bits++; + + return (bits / CHAR_BIT) + ((bits % CHAR_BIT) != 0) + sizeof(size_t); +} + +void nsd_bitset_zero(struct nsd_bitset *bset) +{ + size_t sz; + + assert(bset != NULL); + + sz = nsd_bitset_size(bset->size) - sizeof(bset->size); + assert(sz > 0); + memset(bset->bits, 0, sz); +} + +void nsd_bitset_init(struct nsd_bitset *bset, size_t bits) +{ + assert(bset != NULL); + if (bits == 0) + bits++; + + bset->size = bits; + nsd_bitset_zero(bset); +} + +int nsd_bitset_isset(struct nsd_bitset *bset, size_t bit) +{ + assert(bset != NULL); + if(bit >= bset->size) + return 0; + + return (bset->bits[ (bit / CHAR_BIT) ] & (1 << (bit % CHAR_BIT))) != 0; +} + +void nsd_bitset_set(struct nsd_bitset *bset, size_t bit) +{ + assert(bset != NULL); + assert(bset->size > bit); + bset->bits[ (bit / CHAR_BIT) ] |= (1 << (bit % CHAR_BIT)); +} + +void nsd_bitset_unset(struct nsd_bitset *bset, size_t bit) +{ + assert(bset != NULL); + assert(bset->size > bit); + bset->bits[ (bit / CHAR_BIT) ] &= ~(1 << (bit % CHAR_BIT)); +} + +void nsd_bitset_or( + struct nsd_bitset *destset, + struct nsd_bitset *srcset1, + struct nsd_bitset *srcset2) +{ + size_t i, n, size, bytes; + unsigned char bits; + unsigned int mask; + + assert(destset != NULL); + assert(srcset1 != NULL); + assert(srcset2 != NULL); + + size = destset->size; + bytes = (size / CHAR_BIT) + ((size % CHAR_BIT) != 0); + + for(i = 0; i < bytes; i++) { + bits = 0; + + n = (srcset1->size / CHAR_BIT); + if (n > i) { + bits |= srcset1->bits[i]; + } else { + n += ((srcset1->size % CHAR_BIT) != 0); + mask = (1 << ((srcset1->size % CHAR_BIT) + 1)) - 1; + if (n > i) { + bits |= (srcset1->bits[i] & mask); + } + } + n = (srcset2->size / CHAR_BIT); + if (n > i) { + bits |= srcset2->bits[i]; + } else { + n += ((srcset2->size % CHAR_BIT) != 0); + mask = (1 << ((srcset2->size % CHAR_BIT) + 1)) - 1; + if (n > i) { + bits |= (srcset2->bits[i] & mask); + } + } + destset->bits[i] = bits; + } +} |