zbset.c - libzahl - big integer library | |
git clone git://git.suckless.org/libzahl | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
zbset.c (815B) | |
--- | |
1 /* See LICENSE file for copyright and license details. */ | |
2 #include "internals.h" | |
3 | |
4 | |
5 #define PROLOGUE(MAY_INCREASE)\ | |
6 zahl_char_t mask = 1;\ | |
7 size_t chars = FLOOR_BITS_TO_CHARS(bit);\ | |
8 if (MAY_INCREASE) {\ | |
9 if (zzero(a)) {\ | |
10 a->used = 0;\ | |
11 SET_SIGNUM(a, 1);\ | |
12 }\ | |
13 if (unlikely(chars >= a->used)) {\ | |
14 ENSURE_SIZE(a, chars + 1);\ | |
15 zmemset(a->chars + a->used, 0, chars + 1 - a->us… | |
16 a->used = chars + 1;\ | |
17 }\ | |
18 } else if (unlikely(chars >= a->used)) {\ | |
19 return;\ | |
20 }\ | |
21 bit = BITS_IN_LAST_CHAR(bit);\ | |
22 mask <<= bit | |
23 | |
24 | |
25 void | |
26 zbset_ll_set(z_t a, size_t bit) | |
27 { | |
28 PROLOGUE(1); | |
29 a->chars[chars] |= mask; | |
30 } | |
31 | |
32 void | |
33 zbset_ll_clear(z_t a, size_t bit) | |
34 { | |
35 PROLOGUE(0); | |
36 a->chars[chars] &= ~mask; | |
37 TRIM_AND_ZERO(a); | |
38 } | |
39 | |
40 void | |
41 zbset_ll_flip(z_t a, size_t bit) | |
42 { | |
43 PROLOGUE(1); | |
44 a->chars[chars] ^= mask; | |
45 TRIM_AND_ZERO(a); | |
46 } |