diff --git a/; b/; new file mode 100644 index 0000000..f8c85f1 --- /dev/null +++ b/; @@ -0,0 +1,111 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "error.h" +#include "bfilter.h" + +int +printbits(uint32_t n, size_t c) { + uint32_t i = c-1; + + while (n >= 2) { + printf("%d", n & 1); + i--; + n >>= 1; + } + printf("%d", n & 1); + return 0; +} + +int +print_barray(bit_array_t *arr) { + for(uint32_t i = 0; i < arr->num_ints; i++) { + printbits(arr->arr[i], 32); + } + printf("\n"); + return 0; +} + +bit_array_t* +new_bitarray(int size) { + int width = (size/32) + 1; + uint32_t *barray = malloc((sizeof (int)) * width); + + bit_array_t *result = malloc(sizeof (bit_array_t)); + + result->num_ints = width; + result->num_elems = width*32; + + for(int i = 0; i < width; i++) { + barray[i] = 0; + } + + result->arr = barray; + + return result; +} + +int +setbit(bit_array_t* arr, int k) { + /* The position in the array of the int we're looking at */ + int i = k/32; + + /* The position of the bit in the int itself */ + int pos = k % 32; + + unsigned int flag = 1; + + /* Shift the flag to the position of the bit we want to set */ + flag = flag << pos; + + arr->arr[i] = arr->arr[i] | flag; + + return 0; +} + +int +unsetbit(bit_array_t* arr, int k) { + int i = k/32; + + int pos = k % 32; + + unsigned int flag = 1; + + flag = ~(flag << pos); + + arr->arr[i] = arr->arr[i] & flag; + + return 0; +} + +uint64_t +get_index(int size, const char* value) { + uint64_t hval; + + fnv64Init(&hval); + + fnv64UpdateBuffer(&hval, value, strlen(value)); + return hval % size; +} + +int +main (void) { + bit_array_t *test = new_bitarray(100); + setbit(test, 2); + setbit(test, 4); + setbit(test, 8); + setbit(test, 16); + setbit(test, 32); + print_barray(test); + + const char *test_string = "what is this I can't even, lololol"; + printf("%zu\n", get_index(5*32, test_string)); + + return EXIT_SUCCESS; +} diff --git a/bfilter.c b/bfilter.c index 3a14e51..0349b44 100644 --- a/bfilter.c +++ b/bfilter.c @@ -11,29 +11,36 @@ #include "bfilter.h" int -printbits(bit_array_t *barr) { - int c = barr->num_elems; - int n = barr->arr[0]; - int i = c-1; +printbits(uint32_t n, size_t c) { + uint32_t i = c-1; while (n >= 2) { printf("%d", n & 1); i--; n >>= 1; } - printf("%d\n", n & 1); + printf("%d", n & 1); + return 0; +} + +int +print_barray(bit_array_t *arr) { + for(uint32_t i = 0; i < arr->num_ints; i++) { + printbits(arr->arr[i], arr->num_elems/arr->num_ints); + } + printf("\n"); return 0; } bit_array_t* new_bitarray(int size) { int width = (size/32) + 1; - int *barray = malloc((sizeof (int)) * width); + uint32_t *barray = malloc((sizeof (int)) * width); bit_array_t *result = malloc(sizeof (bit_array_t)); result->num_ints = width; - result->num_elems = size; + result->num_elems = width*32; for(int i = 0; i < width; i++) { barray[i] = 0; @@ -90,9 +97,11 @@ get_index(int size, const char* value) { int main (void) { bit_array_t *test = new_bitarray(100); - printbits(test); - setbit(test, 6); - printbits(test); + setbit(test, 31); + setbit(test, 63); + setbit(test, 95); + setbit(test, 127); + print_barray(test); const char *test_string = "what is this I can't even, lololol"; printf("%zu\n", get_index(5*32, test_string)); diff --git a/bfilter.h b/bfilter.h index acf8565..c627c0b 100644 --- a/bfilter.h +++ b/bfilter.h @@ -2,11 +2,13 @@ typedef struct { size_t num_elems; size_t num_ints; - int *arr; + uint32_t *arr; } bit_array_t; -int printbits(bit_array_t*); +int printbits(uint32_t, size_t); + +int print_barray(bit_array_t*); bit_array_t* new_bitarray(int);