aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJ08nY2017-09-17 00:14:16 +0200
committerJ08nY2017-09-17 00:14:16 +0200
commitaf443cbd827a1809f29b14065618307cb26435ff (patch)
tree0901f1f589123b551b3405745a98ef52c582e38c /src
parent3d8bf2c8536b5d779fee9d57af8931e5d9b24dd6 (diff)
downloadecgen-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.c42
-rw-r--r--src/util/bits.h15
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);