From ec4e44200a2b3c742df197989639d2b9fd3f0348 Mon Sep 17 00:00:00 2001 From: Kevin Pouget Date: Mon, 25 Nov 2019 09:52:25 +0100 Subject: [PATCH] utils: add set_bitmap/test_bitmap functions This patch introduces `set_bitmap` and `test_bitmap` + relevant macros, adapted from `/include/qemu/bitops.h`. These functions differ from `set_bit`/`test_bit` as they can set/test bits in bit arrays longer than scalar data-types. Signed-off-by: Kevin Pouget Acked-by: Frediano Ziglio --- common/utils.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/common/utils.h b/common/utils.h index e853209..13c9d80 100644 --- a/common/utils.h +++ b/common/utils.h @@ -21,6 +21,7 @@ #include #include +#include G_BEGIN_DECLS @@ -28,6 +29,29 @@ const char *spice_genum_get_nick(GType enum_type, gint value); int spice_genum_get_value(GType enum_type, const char *nick, gint default_value); +#define BIT_BYTE(nr) ((nr) / 8) +#define BIT_MASK(nr) (1 << ((nr) % 8)) + +/** + * set_bitmap - Set a bit in memory + * @nr: the bit to set + * @addr: the address to start counting from + */ +static inline void set_bitmap(uint32_t nr, uint8_t *addr) +{ + addr[BIT_BYTE(nr)] |= BIT_MASK(nr); +} + +/** + * test_bitmap - Determine whether a bit is set + * @nr: bit number to test + * @addr: Address to start counting from + */ +static inline int test_bitmap(uint32_t nr, const uint8_t *addr) +{ + return 1 & (addr[BIT_BYTE(nr)] >> (nr % 8)); +} + G_END_DECLS #endif //H_SPICE_COMMON_UTILS