diff options
| author | J08nY | 2017-09-17 00:14:16 +0200 |
|---|---|---|
| committer | J08nY | 2017-09-17 00:14:16 +0200 |
| commit | af443cbd827a1809f29b14065618307cb26435ff (patch) | |
| tree | 0901f1f589123b551b3405745a98ef52c582e38c /src | |
| parent | 3d8bf2c8536b5d779fee9d57af8931e5d9b24dd6 (diff) | |
| download | ecgen-af443cbd827a1809f29b14065618307cb26435ff.tar.gz ecgen-af443cbd827a1809f29b14065618307cb26435ff.tar.zst ecgen-af443cbd827a1809f29b14065618307cb26435ff.zip | |
Add concat functions to bits_t.
Diffstat (limited to 'src')
| -rw-r--r-- | src/util/bits.c | 42 | ||||
| -rw-r--r-- | src/util/bits.h | 15 |
2 files changed, 56 insertions, 1 deletions
diff --git a/src/util/bits.c b/src/util/bits.c index e2d5d79..05b71aa 100644 --- a/src/util/bits.c +++ b/src/util/bits.c @@ -4,7 +4,6 @@ */ #include "bits.h" -#include <gen/types.h> #include <sha1/sha1.h> #include "util/memory.h" @@ -180,6 +179,47 @@ static bits_t *bits_bitwise(const bits_t *one, const bits_t *other, return result; } +void bits_concatzv(bits_t *one, va_list valist) { + const bits_t *next; + while ((next = va_arg(valist, const bits_t *)) != NULL) { + if (next->bitlen == 0) continue; + size_t new_bitlen = one->bitlen + next->bitlen; + size_t new_alloc = BYTE_LEN(new_bitlen); + if (new_alloc > one->allocated) { + one->bits = try_realloc(one->bits, new_alloc); + for (size_t i = one->allocated; i < new_alloc; ++i) { + one->bits[i] = 0; + } + one->allocated = new_alloc; + } + for (size_t j = 0; j < next->bitlen; ++j) { + SET_BIT(one->bits, one->bitlen + j, GET_BIT(next->bits, j)); + } + one->bitlen = new_bitlen; + } +} + +void bits_concatz(bits_t *one, ...) { + va_list valist; + va_start(valist, one); + + bits_concatzv(one, valist); + + va_end(valist); +} + +bits_t *bits_concat(const bits_t *one, ...) { + va_list valist; + va_start(valist, one); + + bits_t *result = bits_copy(one); + + bits_concatzv(result, valist); + + va_end(valist); + return result; +} + bits_t *bits_or(const bits_t *one, const bits_t *other) { return bits_bitwise(one, other, or_func); } diff --git a/src/util/bits.h b/src/util/bits.h index 376c736..8eb533d 100644 --- a/src/util/bits.h +++ b/src/util/bits.h @@ -10,10 +10,21 @@ #define BYTE_LEN(bit_len) \ (((bit_len) % 8 == 0) ? (bit_len) / 8 : ((bit_len) / 8) + 1) + #define GET_BIT(bit_array, bit_pos) \ (((bit_array)[(bit_pos) / 8] & (1 << (7 - ((bit_pos) % 8)))) >> \ (7 - ((bit_pos) % 8))) +#define SET_BIT(bit_array, bit_pos, bit_value) \ + do { \ + unsigned char val = 1 << (7 - ((bit_pos) % 8)); \ + if ((bit_value) == 1) { \ + (bit_array)[(bit_pos) / 8] |= val; \ + } else { \ + (bit_array)[(bit_pos) / 8] &= ~val; \ + } \ + } while (0); + bits_t *bits_new(size_t bit_len); bits_t *bits_copy(const bits_t *bits); @@ -42,6 +53,10 @@ size_t bits_to_rawlen(const bits_t *bits); GEN bits_to_bitvec(const bits_t *bits); +void bits_concatz(bits_t *one, ...); + +bits_t *bits_concat(const bits_t *one, ...); + bits_t *bits_or(const bits_t *one, const bits_t *other); bits_t *bits_and(const bits_t *one, const bits_t *other); |
