From 3728c12ecbe308092b213f1b664303a48858a2b8 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Thu, 3 Mar 2016 12:47:39 +0100 Subject: Add zbset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/zbset.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/zbset.c (limited to 'src/zbset.c') diff --git a/src/zbset.c b/src/zbset.c new file mode 100644 index 0000000..6833e5f --- /dev/null +++ b/src/zbset.c @@ -0,0 +1,48 @@ +/* See LICENSE file for copyright and license details. */ +#include "internals" + +#include +#include + + +void +zbset(z_t a, z_t b, size_t bit, int action) +{ + zahl_char_t x = 1; + size_t chars; + + chars = FLOOR_BITS_TO_CHARS(bit); + bit = BITS_IN_LAST_CHAR(bit); + x <<= bit; + + if (a != b) + zset(a, b); + + if (action) { + if (zzero(a)) { + a->used = 0; + SET_SIGNUM(a, 1); + } + if (a->used <= chars) { + if (a->alloced <= chars) { + a->alloced = chars + 1; + a->chars = realloc(a->chars, a->alloced * sizeof(*(a->chars))); + } + memset(a->chars + a->used, 0, (chars - a->used + 1) * sizeof(*(a->chars))); + } + } + + if (action > 0) { + a->chars[chars] |= x; + return; + } else if (action < 0) { + a->chars[chars] ^= x; + } else if (a->used > chars) { + a->chars[chars] &= ~x; + } + + while (a->used && !a->chars[a->used - 1]) + a->used--; + if (!a->used) + SET_SIGNUM(a, 0); +} -- cgit v1.2.3-70-g09d2