/*-GNU-GPL-BEGIN-* nepim - network pipemeter Copyright (C) 2005 Everton da Silva Marques nepim is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. nepim is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with nepim; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *-GNU-GPL-END-*/ /* $Id: bit.c,v 1.1 2005/08/18 21:59:11 evertonm Exp $ */ #include #include #include "bit.h" #define NEPIM_WORD_BITLEN (8 * sizeof(uint32_t)) void nepim_bit_init(nepim_bit_t *set, uint32_t bit_size) { int i; int word_size; assert(sizeof(uint32_t) == sizeof(*set->words)); word_size = bit_size / NEPIM_WORD_BITLEN; if (bit_size % NEPIM_WORD_BITLEN) ++word_size; assert(word_size > 0); set->words = malloc(word_size * sizeof(uint32_t)); assert(set->words); for (i = 0; i < word_size; ++i) set->words[i] = 0; set->word_size = word_size; } void nepim_bit_del(nepim_bit_t *set) { free(set->words); set->words = 0; } int nepim_bit_isset(nepim_bit_t *set, uint32_t bit) { int word_offset; int bit_offset; uint32_t bit_mask; assert(set->word_size > 0); word_offset = bit / NEPIM_WORD_BITLEN; assert(word_offset < set->word_size); bit_offset = bit % NEPIM_WORD_BITLEN; bit_mask = 1 << bit_offset; return set->words[word_offset] & bit_mask; } void nepim_bit_set(nepim_bit_t *set, uint32_t bit) { int word_offset; int bit_offset; uint32_t bit_mask; assert(set->word_size > 0); word_offset = bit / NEPIM_WORD_BITLEN; assert(word_offset < set->word_size); bit_offset = bit % NEPIM_WORD_BITLEN; bit_mask = 1 << bit_offset; set->words[word_offset] |= bit_mask; assert(nepim_bit_isset(set, bit)); } void nepim_bit_clear(nepim_bit_t *set, uint32_t bit) { int word_offset; int bit_offset; uint32_t bit_mask; assert(set->word_size > 0); word_offset = bit / NEPIM_WORD_BITLEN; assert(word_offset < set->word_size); bit_offset = bit % NEPIM_WORD_BITLEN; bit_mask = 1 << bit_offset; set->words[word_offset] &= ~bit_mask; assert(!nepim_bit_isset(set, bit)); }