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:
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