zbset.c - libzahl - big integer library
 (HTM) git clone git://git.suckless.org/libzahl
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) 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->used);\
           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 }