int main(void) { plan_tests(6); setvbuf(stdout, 0, _IOLBF, 0); BLOOM *bp = bloom_create(12, 16, 2); ok(bp, "created"); int rc = bloom_chk(bp, "AB"); ok(rc == 0, "Check 'AB' not in empty table: %d", rc); printf("# Add AB\n"); bloom_add(bp, "AB"); rc = bloom_chk(bp, "AB"); ok(rc != 0, "Check 'AB' after add: %d", rc); printf("# Add AC\n"); bloom_add(bp, "AC"); rc = bloom_chk(bp, "!@"); ok(rc != 0, "Check '!@' without add: %d (false positive)", rc); printf("# Before adding CA...DZ\n"); bloom_dump(bp, stdout); int antestat = bloom_stat(bp), anteover = bloom_over(bp); char hash[] = "__"; for (hash[1] = 'A'; hash[1] <= 'D'; ++hash[1]) for (hash[0] = 'C'; hash[0] <= 'Z'; ++hash[0]) bloom_add(bp, hash); printf("# After adding CA...DZ:\n"); bloom_dump(bp, stdout); for (hash[1] = 'A'; hash[1] <= 'D'; ++hash[1]) for (hash[0] = 'C'; hash[0] <= 'Z'; ++hash[0]) bloom_del(bp, hash); printf("# After deleting CA...DZ:\n"); bloom_dump(bp, stdout); int poststat = bloom_stat(bp), postover = bloom_over(bp); ok(poststat == antestat, "stat %d -> %d", antestat, poststat); ok(postover == anteover, "over %d -> %d", anteover, postover); bloom_destroy(bp); return exit_status(); }
int main(int argc, char *argv[]) { FILE *fp; /* No domain more than 1024 characs */ char line[1024]; char *p; BLOOM *bloom; if(argc<2) { fprintf(stderr, "ERROR: No word file specified\n"); return EXIT_FAILURE; } if(!(bloom=bloom_create(2500000, 2, sax_hash, sdbm_hash))) { fprintf(stderr, "ERROR: Could not create bloom filter\n"); return EXIT_FAILURE; } if(!(fp=fopen(argv[1], "r"))) { fprintf(stderr, "ERROR: Could not open file %s\n", argv[1]); return EXIT_FAILURE; } /* set block - read names from file argv[1] and add to filter */ while(fgets(line, 1024, fp)) { if((p=strchr(line, '\r'))) *p='\0'; if((p=strchr(line, '\n'))) *p='\0'; bloom_add(bloom, line); } fclose(fp); /* TODO Dump twice - filter.bin and filter_version.bin */ const char *filepath; filepath = "bloomfilter/filter.bin"; if (!bloom_dump(bloom, filepath)) { fprintf(stderr, "ERROR: Could not dump bloom filter %s\n", filepath); } char filepath2[30]; filepath = ""; sprintf(filepath2, "%s%d.bin", "bloomfilter/filter_", bloom->timestamp); if (!bloom_dump(bloom, filepath2)) { fprintf(stderr, "ERROR: Could not dump bloom filter %s\n", filepath2); } /* check block - enter name to check */ while(fgets(line, 1024, stdin)) { if((p=strchr(line, '\r'))) *p='\0'; if((p=strchr(line, '\n'))) *p='\0'; /* Domain name can have ".", "/", ":" and "-" * p=strtok(line, " \t,.;:\r\n?!-/()"); * Divide line on symbols to check each word*/ p=strtok(line, " \t,;\r\n?!()"); while(p) { if(!bloom_check(bloom, p)) { printf("No match for word \"%s\"\n", p); } p=strtok(NULL, " \t,.;:\r\n?!-/()"); } } bloom_destroy(bloom); return EXIT_SUCCESS; }