5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2007 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
22 #define SILC_BIT_POS(bit) (bit / SILC_BIT_SIZE)
23 #define SILC_BIT_MASK(bit) (1UL << (bit % SILC_BIT_SIZE))
27 SilcBool silc_bit_set(volatile unsigned long *bitmap, SilcUInt32 bitmap_size,
30 SilcUInt32 pos = SILC_BIT_POS(bit);
31 unsigned long mask = SILC_BIT_MASK(bit);
33 if (!bitmap || pos >= bitmap_size)
42 SilcBool silc_bit_clear(volatile unsigned long *bitmap, SilcUInt32 bitmap_size,
45 SilcUInt32 pos = SILC_BIT_POS(bit);
46 unsigned long mask = SILC_BIT_MASK(bit);
48 if (!bitmap || pos >= bitmap_size)
57 SilcBool silc_bit_toggle(volatile unsigned long *bitmap,
58 SilcUInt32 bitmap_size, SilcUInt32 bit)
60 SilcUInt32 pos = SILC_BIT_POS(bit);
61 unsigned long mask = SILC_BIT_MASK(bit);
63 if (!bitmap || pos >= bitmap_size)
70 /* Set bit and return old value */
72 int silc_bit_test_and_set(volatile unsigned long *bitmap,
73 SilcUInt32 bitmap_size, SilcUInt32 bit)
75 SilcUInt32 pos = SILC_BIT_POS(bit);
76 unsigned long mask = SILC_BIT_MASK(bit), ret;
78 if (!bitmap || pos >= bitmap_size)
84 return (ret & mask) != 0;
87 /* Clear bit and return old value */
89 int silc_bit_test_and_clear(volatile unsigned long *bitmap,
90 SilcUInt32 bitmap_size, SilcUInt32 bit)
92 SilcUInt32 pos = SILC_BIT_POS(bit);
93 unsigned long mask = SILC_BIT_MASK(bit), ret;
95 if (!bitmap || pos >= bitmap_size)
101 return (ret & mask) != 0;
104 /* Toggle bit and return old value */
106 int silc_bit_test_and_toggle(volatile unsigned long *bitmap,
107 SilcUInt32 bitmap_size, SilcUInt32 bit)
109 SilcUInt32 pos = SILC_BIT_POS(bit);
110 unsigned long mask = SILC_BIT_MASK(bit), ret;
112 if (!bitmap || pos >= bitmap_size)
118 return (ret & mask) != 0;
121 /* Return bit value */
123 int silc_bit_get(volatile unsigned long *bitmap, SilcUInt32 bitmap_size,
126 SilcUInt32 pos = SILC_BIT_POS(bit);
127 unsigned long mask = SILC_BIT_MASK(bit);
129 if (!bitmap || pos >= bitmap_size)
132 return (bitmap[pos] & mask) != 0;
135 /* Return first set bit number */
137 int silc_bit_ffs(volatile unsigned long *bitmap, SilcUInt32 bitmap_size)
139 return silc_bit_fns(bitmap, bitmap_size, 0);
142 /* Return first zero bit number */
144 int silc_bit_ffz(volatile unsigned long *bitmap, SilcUInt32 bitmap_size)
146 return silc_bit_fnz(bitmap, bitmap_size, 0);
149 /* Return next set bit number */
151 int silc_bit_fns(volatile unsigned long *bitmap, SilcUInt32 bitmap_size,
154 register SilcUInt32 i;
156 if (!bitmap || offset >= bitmap_size * SILC_BIT_SIZE)
159 for (i = offset; i < bitmap_size * SILC_BIT_SIZE; i++)
160 if (bitmap[SILC_BIT_POS(i)] & SILC_BIT_MASK(i))
166 /* Return next zero bit number */
168 int silc_bit_fnz(volatile unsigned long *bitmap, SilcUInt32 bitmap_size,
171 register SilcUInt32 i;
173 if (!bitmap || offset >= bitmap_size * SILC_BIT_SIZE)
176 for (i = offset; i < bitmap_size * SILC_BIT_SIZE; i++)
177 if ((bitmap[SILC_BIT_POS(i)] & SILC_BIT_MASK(i)) == 0)
185 void silc_bit_clear_bitmap(volatile unsigned long *bitmap,
186 SilcUInt32 bitmap_size)
190 memset((void *)bitmap, 0, bitmap_size * 8);