From 3ae8c069900514c1785fe4a84b6cdb0157dff59e Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Wed, 2 Mar 2016 21:07:08 +0100 Subject: Add zand, zor, zxor, znot, zbtest, zsplit, and the newly introduced ztrunc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/zand.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/zand.c (limited to 'src/zand.c') diff --git a/src/zand.c b/src/zand.c new file mode 100644 index 0000000..3156857 --- /dev/null +++ b/src/zand.c @@ -0,0 +1,42 @@ +/* See LICENSE file for copyright and license details. */ +#include "internals" + +#include + + +void +zand(z_t a, z_t b, z_t c) +{ + size_t n; + + if (zzero(b) || zzero(c)) { + SET_SIGNUM(a, 0); + return; + } + + n = b->used < c->used ? b->used : c->used; + while (n--) + if (b->chars[n] & c->chars[n]) + goto found_highest; + SET_SIGNUM(a, 0); + return; + +found_highest: + a->used = ++n; + if (a == b) { + while (n--) + a->chars[n] &= c->chars[n]; + } else if (a == c) { + while (n--) + a->chars[n] &= b->chars[n]; + } else { + if (a->alloced < a->used) { + a->alloced = a->used; + a->chars = realloc(a->chars, a->used * sizeof(*(a->chars))); + } + memcpy(a->chars, c->chars, a->used * sizeof(*(a->chars))); + while (n--) + a->chars[n] &= b->chars[n]; + } + SET_SIGNUM(a, (zsignum(b) > 0 || zsignum(c) > 0) * 2 - 1); +} -- cgit v1.2.3-70-g09d2