diff --git a/Makefile b/Makefile index d64d712..619033b 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ default: bfilter.c bfilter.h - $(CC) -g -Wall -Wextra -std=gnu99 -Wpointer-arith -Wmissing-prototypes -lm -L. -O3 ./bfilter.c -o test --static `pkg-config --libs --cflags libfnv` -Wl,-rpath,/home/wes/bfilter; + $(CC) -g -Wall -Wextra -std=gnu99 -Wpointer-arith -Wmissing-prototypes -lmaa -lfnv -lm -L. -O0 ./bfilter.c -o test -Wl,-rpath,/home/wes/bfilter; lib: bfilter.c bfilter.h - $(CC) -g -DLIB -c -fpic -Wall -Wextra -pedantic -Wpointer-arith -Werror -std=c99 -lm -L. -O3 ./bfilter.c --static `pkg-config --libs --cflags libfnv` -Wl,-rpath,/home/wes/bfilter; + $(CC) -g -DLIB -c -fpic -Wall -Wextra -pedantic -Wpointer-arith -Werror -std=c99 -lmaa -lfnv -lm -L. -O0 ./bfilter.c -Wl,-rpath,/home/wes/bfilter; $(CC) -shared -o bfilter.so bfilter.o; diff --git a/bfilter.c b/bfilter.c index fab2f73..2e9fe44 100644 --- a/bfilter.c +++ b/bfilter.c @@ -2,6 +2,8 @@ #include #include #include +#include + #include "bfilter.h" int @@ -28,18 +30,14 @@ print_barray(bit_array_t *arr) { bit_array_t* empty_bfilter(int size) { int width = (size/32) + 1; // 32 for a 32 bit int - 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; + uint32_t *barray = xcalloc(width, (sizeof (int))); - for(int i = 0; i < width; i++) { - barray[i] = 0; - } + bit_array_t *result = xcalloc(1, sizeof (bit_array_t)); result->arr = barray; + result->num_ints = width; + result->num_elems = width*32; return result; } @@ -134,13 +132,13 @@ hash(const char *input, uint32_t k, size_t m) { fnv_hashes_t fnv = hash_fnv(input); if (k <= 2) { - hashes_t hashes = malloc((sizeof (uint32_t)) * 2); + hashes_t hashes = xcalloc(2, (sizeof (uint32_t))); hashes[0] = fnv.hash_1 % m; hashes[1] = fnv.hash_2 % m; return hashes; } - hashes_t hashes = malloc((sizeof (uint32_t)) * k); + hashes_t hashes = xcalloc(k, (sizeof (uint32_t))); hashes[0] = fnv.hash_1 % m; hashes[1] = fnv.hash_2 % m; @@ -163,6 +161,7 @@ bfilter_set(bit_array_t *filter, for(int i = 0; i < k; i++) { setbit(filter, hashes[i]); } + free(hashes); return 0; } @@ -182,9 +181,17 @@ bfilter_get(bit_array_t *filter, exists = 0; } } + free(hashes); return exists; } +int +release_bfilter(bit_array_t *filter) { + free(filter->arr); + free(filter); + return 0; +} + #ifndef LIB int main (void) { @@ -213,6 +220,7 @@ main (void) { bfilter_set(test, test_string7, k); bfilter_set(test, test_string8, k); bfilter_set(test, test_string9, k); + bfilter_set(test, test_string10, k); bfilter_set(test, test_string11, k); printf("%d\n", bfilter_get(test, test_string7, k)); @@ -223,7 +231,7 @@ main (void) { printf("%d\n", bfilter_get(test, test_string10, k)); printf("%d\n", bfilter_get(test, test_string10, k)); - print_barray(test); + release_bfilter(test); return EXIT_SUCCESS; } diff --git a/bfilter.h b/bfilter.h index a353d95..76778bb 100644 --- a/bfilter.h +++ b/bfilter.h @@ -34,3 +34,5 @@ int bfilter_set(bit_array_t *, const char*, int); int bfilter_get(bit_array_t *, const char*, int); int getbit(bit_array_t *, int); + +int release_bfilter(bit_array_t *); diff --git a/bfilter.py b/bfilter.py index 96e0445..8ca0525 100755 --- a/bfilter.py +++ b/bfilter.py @@ -59,16 +59,3 @@ class BloomFilter: def __getitem__(self, key): return lib.bfilter_get(self.bitset, key.encode("UTF-8"), self.k) == 1 - - -with open("./roadnottaken") as rnt: - words = rnt.read().split(" ") - for word in words: - test.add(word) - - for word in words: - print(test[word]) - - print(test["wes"]) - -# lib.print_barray(bfilter) diff --git a/libfnv.so.0 b/libfnv.so.0 new file mode 100755 index 0000000..e62477c Binary files /dev/null and b/libfnv.so.0 differ