Browse Source

use libmaa's xcalloc, dynamically link everything

master
wes 7 years ago
parent
commit
4682c05d8c
  1. 4
      Makefile
  2. 30
      bfilter.c
  3. 2
      bfilter.h
  4. 13
      bfilter.py
  5. BIN
      libfnv.so.0

4
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;

30
bfilter.c

@ -2,6 +2,8 @@
#include <stdio.h>
#include <stdlib.h>
#include <fnv.h>
#include <maa.h>
#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;
}

2
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 *);

13
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)

BIN
libfnv.so.0

Binary file not shown.
Loading…
Cancel
Save