aboutsummaryrefslogtreecommitdiff
path: root/src/util/bits.c
diff options
context:
space:
mode:
authorJ08nY2017-12-13 02:08:48 +0100
committerJ08nY2017-12-13 02:08:48 +0100
commitd2de28db4ceb7cd3350e81b98475d6baf2bfe481 (patch)
tree166550ca056003d1d6b988c75932886e0829e82d /src/util/bits.c
parentcfec33981db5a6f80e51c064bc142623ce13399f (diff)
downloadecgen-d2de28db4ceb7cd3350e81b98475d6baf2bfe481.tar.gz
ecgen-d2de28db4ceb7cd3350e81b98475d6baf2bfe481.tar.zst
ecgen-d2de28db4ceb7cd3350e81b98475d6baf2bfe481.zip
Diffstat (limited to 'src/util/bits.c')
-rw-r--r--src/util/bits.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/util/bits.c b/src/util/bits.c
index 6311ba8..5e6a95e 100644
--- a/src/util/bits.c
+++ b/src/util/bits.c
@@ -4,6 +4,7 @@
*/
#include "bits.h"
+#include <misc/types.h>
#include <sha1/sha1.h>
#include "util/memory.h"
@@ -16,6 +17,36 @@ bits_t *bits_new(size_t bit_len) {
return result;
}
+bits_t *bits_new_rand(size_t bit_len) {
+ bits_t *result = bits_new(bit_len);
+ for (size_t i = 0; i < result->allocated; ++i) {
+ if (i == result->allocated - 1) {
+ size_t last_bits = bit_len % 8;
+ result->bits[i] = (unsigned char)random_bits(last_bits)
+ << (8 - last_bits);
+ } else {
+ result->bits[i] = (unsigned char)random_bits(8);
+ }
+ }
+ return result;
+}
+
+void bits_cpy(bits_t *dest, const bits_t *src) {
+ if (src->bitlen == 0) {
+ return;
+ }
+
+ if (src->allocated < dest->allocated) {
+ memset(dest->bits + src->allocated, 0,
+ dest->allocated - src->allocated);
+ } else if (src->allocated > dest->allocated) {
+ dest->bits = try_realloc(dest->bits, src->allocated);
+ }
+ memcpy(dest->bits, src->bits, src->allocated);
+ dest->allocated = src->allocated;
+ dest->bitlen = src->bitlen;
+}
+
bits_t *bits_copy(const bits_t *bits) {
bits_t *result = try_calloc(sizeof(bits_t));
result->bitlen = bits->bitlen;