From 2ffb03e198eaa7d9b310d231862eadf73000b4dc Mon Sep 17 00:00:00 2001 From: wes Date: Thu, 6 Jul 2017 14:52:30 -0400 Subject: [PATCH] add python interface --- Makefile | 7 +++--- bfilter.c | 7 +++--- bfilter.o | Bin 0 -> 14056 bytes bfilter.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ bfilter.so | Bin 0 -> 21944 bytes 5 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 bfilter.o create mode 100755 bfilter.py create mode 100755 bfilter.so diff --git a/Makefile b/Makefile index 8106a8c..d64d712 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ default: bfilter.c bfilter.h - $(CC) -g -DTOK_LIB -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 -lm -L. -O3 ./bfilter.c -o test --static `pkg-config --libs --cflags libfnv` -Wl,-rpath,/home/wes/bfilter; -unsafe: bfilter.c bfilter.h - $(CC) -DNDEBUG -DTOK_LIB -Wall -std=gnu99 -Wextra -Wpointer-arith -Wmissing-prototypes -lm -L. -O3 ./bfilter.c -o bfilter -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) -shared -o bfilter.so bfilter.o; diff --git a/bfilter.c b/bfilter.c index 01fc264..cf5887c 100644 --- a/bfilter.c +++ b/bfilter.c @@ -7,7 +7,6 @@ int printbits(uint32_t n, size_t c) { uint32_t i = c-1; - while (n >= 2) { printf("%d", n & 1); i--; @@ -150,7 +149,7 @@ bfilter_set(bit_array_t *filter, int k) { hashes_t hashes = hash(key, k, filter->num_elems); - for(int i = 0; i < 5; i++) { + for(int i = 0; i < k; i++) { setbit(filter, hashes[i]); } return 0; @@ -164,7 +163,7 @@ bfilter_get(bit_array_t *filter, int exists = 1; - for(int i = 0; i < 5; i++) { + for(int i = 0; i < k; i++) { if (!getbit(filter, hashes[i])) { exists = 0; } @@ -172,6 +171,7 @@ bfilter_get(bit_array_t *filter, return exists; } +#ifndef LIB int main (void) { bit_array_t *test = empty_bfilter(4000); @@ -213,3 +213,4 @@ main (void) { return EXIT_SUCCESS; } +#endif diff --git a/bfilter.o b/bfilter.o new file mode 100644 index 0000000000000000000000000000000000000000..132ba8c77b6aa6a6be2904d1aadea39364516284 GIT binary patch literal 14056 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 BTkQY< literal 0 HcmV?d00001