2 Unix SMB/Netbios implementation.
4 simple bitmap functions
5 Copyright (C) Andrew Tridgell 1992-1998
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 /* these functions provide a simple way to allocate integers from a
25 pool without repitition */
28 /****************************************************************************
29 allocate a bitmap of the specified size
30 ****************************************************************************/
31 struct bitmap
*bitmap_allocate(int n
)
35 bm
= (struct bitmap
*)malloc(sizeof(*bm
));
40 bm
->b
= (uint32
*)malloc(sizeof(bm
->b
[0])*(n
+31)/32);
46 memset(bm
->b
, 0, sizeof(bm
->b
[0])*(n
+31)/32);
51 /****************************************************************************
53 ****************************************************************************/
55 void bitmap_free(struct bitmap
*bm
)
64 /****************************************************************************
66 ****************************************************************************/
67 BOOL
bitmap_set(struct bitmap
*bm
, unsigned i
)
70 DEBUG(0,("Setting invalid bitmap entry %d (of %d)\n",
74 bm
->b
[i
/32] |= (1<<(i
%32));
78 /****************************************************************************
79 clear a bit in a bitmap
80 ****************************************************************************/
81 BOOL
bitmap_clear(struct bitmap
*bm
, unsigned i
)
84 DEBUG(0,("clearing invalid bitmap entry %d (of %d)\n",
88 bm
->b
[i
/32] &= ~(1<<(i
%32));
92 /****************************************************************************
93 query a bit in a bitmap
94 ****************************************************************************/
95 BOOL
bitmap_query(struct bitmap
*bm
, unsigned i
)
97 if (i
>= bm
->n
) return False
;
98 if (bm
->b
[i
/32] & (1<<(i
%32))) {
104 /****************************************************************************
105 find a zero bit in a bitmap starting at the specified offset, with
107 ****************************************************************************/
108 int bitmap_find(struct bitmap
*bm
, unsigned ofs
)
112 if (ofs
> bm
->n
) ofs
= 0;
116 if (~(bm
->b
[i
/32])) {
119 if (!bitmap_query(bm
, j
)) return j
;
121 } while (j
& 31 && j
< bm
->n
);
129 if (~(bm
->b
[i
/32])) {
132 if (!bitmap_query(bm
, j
)) return j
;
134 } while (j
& 31 && j
< bm
->n
);