libds

a collection of simple data structures
Log | Files | Refs | LICENSE

commit 154d420b780ecfb36a410a9ad538294a3c44414c
parent a3eb9dbf8bf939f5d6f6d912e07403e3d710187c
Author: Naveen Narayanan <zerous@nocebo.space>
Date:   Tue,  6 Aug 2024 02:09:02 +0200

Add bitmap.c

This version of bitmap can only handle a map
that is 8 bytes long.

Diffstat:
MMakefile | 4++--
Abitmap.c | 42++++++++++++++++++++++++++++++++++++++++++
Mds.h | 6++++++
3 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile @@ -3,7 +3,7 @@ include config.mk -SRC = fifo.c stack.c str.c tokenize.c vector.c +SRC = fifo.c stack.c str.c tokenize.c vector.c bitmap.c OBJ = ${SRC:.c=.o} SOUT = ${NAME}.a @@ -21,7 +21,7 @@ options: ${OBJ}: config.mk -${SOUT}: ${OBJ} +${SOUT}: ${OBJ} @ar rcs ${SOUT} ${OBJ} clean: diff --git a/bitmap.c b/bitmap.c @@ -0,0 +1,42 @@ +#include <stdlib.h> + +struct bitmap { + unsigned long long map; +}; + +int +bitmapset(struct bitmap *bm, unsigned long long bit) +{ + if (bit > (sizeof(bm->map) * 8 - 1)) + return 1; + bm->map |= (1ULL << bit); + return 0; +} + +int +bitmapclr(struct bitmap *bm, unsigned long long bit) +{ + if (bit > (sizeof(bm->map) * 8 - 1)) + return 1; + bm->map &= ~(1ULL << bit); + return 0; +} + +int +bitmaptest(struct bitmap *bm, unsigned long long bit) +{ + if (bit > (sizeof(bm->map) * 8 - 1)) + return -1; + return bm->map & (1ULL << bit); +} + +struct bitmap * +bitmapinit(void) +{ + struct bitmap *bm; + + bm = malloc(sizeof(*bm)); + if (!bm) + return NULL; + return bm; +} diff --git a/ds.h b/ds.h @@ -33,4 +33,10 @@ void *vector_get(struct vector *, size_t); size_t vector_size(struct vector *); void vector_walk(struct vector *, void (*)(struct vector *, void *)); +/* bitmap.c */ +struct bitmap *bitmapinit(void); +int bitmapset(struct bitmap *, unsigned long long); +int bitmapclr(struct bitmap *, unsigned long long); +int bitmaptest(struct bitmap *, unsigned long long); + #endif