s3-talloc Change TALLOC_ZERO_ARRAY() to talloc_zero_array()
[kai/samba.git] / source3 / lib / bitmap.c
index f67ea994e5652817a55dc71a7d8786db04a34938..5216b05c58554a2013a527f1be059736169aeabf 100644 (file)
@@ -1,12 +1,11 @@
 /*
-   Unix SMB/Netbios implementation.
-   Version 1.9.
+   Unix SMB/CIFS implementation.
    simple bitmap functions
    Copyright (C) Andrew Tridgell 1992-1998
 
    This program 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 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
 
 /* these functions provide a simple way to allocate integers from a
-   pool without repitition */
-
+   pool without repetition */
 
 /****************************************************************************
-allocate a bitmap of the specified size
+talloc a bitmap
 ****************************************************************************/
-struct bitmap *bitmap_allocate(int n)
+struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n)
 {
        struct bitmap *bm;
 
-       bm = (struct bitmap *)malloc(sizeof(*bm));
-       bm->n = n;
+       bm = talloc(mem_ctx, struct bitmap);
 
        if (!bm) return NULL;
-       
-       bm->b = (uint32 *)malloc(sizeof(bm->b[0])*(n+31)/32);
+
+       bm->n = n;
+       bm->b = talloc_zero_array(bm, uint32, (n+31)/32);
        if (!bm->b) {
-               free(bm);
+               TALLOC_FREE(bm);
                return NULL;
        }
-
-       memset(bm->b, 0, sizeof(bm->b[0])*bm->n);
-
        return bm;
 }
 
 /****************************************************************************
-free a bitmap structure
+copy as much of the source bitmap as will fit in the destination bitmap.
 ****************************************************************************/
-void bitmap_free(struct bitmap *bm)
+
+int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src)
 {
-       free(bm->b);
-       bm->b = NULL;
-       free(bm);
-}
+        int count = MIN(dst->n, src->n);
 
+        SMB_ASSERT(dst->b != src->b);
+       memcpy(dst->b, src->b, sizeof(uint32)*((count+31)/32));
+
+        return count;
+}
 
 /****************************************************************************
 set a bit in a bitmap
 ****************************************************************************/
-BOOL bitmap_set(struct bitmap *bm, unsigned i)
+bool bitmap_set(struct bitmap *bm, unsigned i)
 {
-       if (i >= bm->n) return False;
+       if (i >= bm->n) {
+               DEBUG(0,("Setting invalid bitmap entry %d (of %d)\n",
+                     i, bm->n));
+               return False;
+       }
        bm->b[i/32] |= (1<<(i%32));
        return True;
 }
 
+/****************************************************************************
+clear a bit in a bitmap
+****************************************************************************/
+bool bitmap_clear(struct bitmap *bm, unsigned i)
+{
+       if (i >= bm->n) {
+               DEBUG(0,("clearing invalid bitmap entry %d (of %d)\n",
+                     i, bm->n));
+               return False;
+       }
+       bm->b[i/32] &= ~(1<<(i%32));
+       return True;
+}
+
 /****************************************************************************
 query a bit in a bitmap
 ****************************************************************************/
-BOOL bitmap_query(struct bitmap *bm, unsigned i)
+bool bitmap_query(struct bitmap *bm, unsigned i)
 {
        if (i >= bm->n) return False;
        if (bm->b[i/32] & (1<<(i%32))) {
@@ -87,7 +102,7 @@ wraparound
 ****************************************************************************/
 int bitmap_find(struct bitmap *bm, unsigned ofs)
 {
-       int i, j;
+       unsigned int i, j;
 
        if (ofs > bm->n) ofs = 0;