X-Git-Url: http://git.tuebingen.mpg.de/?p=adu.git;a=blobdiff_plain;f=bloom.c;h=b072ad163e23e409bb4dd2cf8139e93c95059113;hp=9b66b903be5d189704d0fedbac0cb07c70bd5113;hb=ca20c17a6742464bcf861fe856a4caddf2bfeab2;hpb=fa21c55adb75551452241369424a146c7acb71a4 diff --git a/bloom.c b/bloom.c index 9b66b90..b072ad1 100644 --- a/bloom.c +++ b/bloom.c @@ -12,6 +12,9 @@ void *adu_calloc(size_t size) { void *ret = malloc(size); + + if (!ret) + exit(EXIT_FAILURE); memset(ret, 0, size); return ret; } @@ -93,7 +96,7 @@ static int test_and_set_bit(uint64_t bitnum, struct bloom *b) return ret; } -int bloom_test_and_insert(const uint8_t *data, size_t len, struct bloom *b) +int bloom_insert(const uint8_t *data, size_t len, struct bloom *b) { int i, ret = 0; uint32_t h = 0xb11924e1; /* some arbitrary value */ @@ -128,13 +131,15 @@ void bloom_free(struct bloom *b) } /** - * Initialize a bloom filter. + * Allocate and initialize a new bloom filter. * * \param order Use a filter containing 2^order bits. * \param num_hash_functions Set that many bits in the filter per entry. + * + * \return This function either returns a freshly allocated and initialized + * bloom filter or does not return at all (if the underlying malloc() failed). */ -int bloom_init(unsigned order, unsigned num_hash_functions, - struct bloom **result) +struct bloom *bloom_new(unsigned order, unsigned num_hash_functions) { struct bloom *b = adu_calloc(sizeof(*b)); @@ -143,17 +148,16 @@ int bloom_init(unsigned order, unsigned num_hash_functions, b->order = order; b->num_hash_functions = num_hash_functions; b->filter = adu_calloc(filter_bits(b) / 8); - *result = b; - return 1; + return b; } #ifdef TEST_BLOOM -int bloom_test_and_insert_string(const char *str, struct bloom *b) +int bloom_insert_string(const char *str, struct bloom *b) { uint32_t len = strlen(str); - return bloom_test_and_insert((const uint8_t *)str, len, b); + return bloom_insert((const uint8_t *)str, len, b); } void add_stdin(struct bloom *b) @@ -167,7 +171,7 @@ void add_stdin(struct bloom *b) continue; if (buf[len - 1] == '\n') buf[len - 1] = '\0'; - if (bloom_test_and_insert_string(buf, b)) + if (bloom_insert_string(buf, b)) false_positives++; } INFO_LOG("filter contains %llu entries\n", b->num_entries); @@ -184,7 +188,7 @@ int main(int argc, char **argv) printf("k: # of hash functions to use\n"); exit(1); } - bloom_init(atoi(argv[1]), atoi(argv[2]), &b); + b = bloom_new(atoi(argv[1]), atoi(argv[2])); add_stdin(b); INFO_LOG("%u%% of bits are set\n", (unsigned) (b->num_set_bits * 100ULL / filter_bits(b)));