#ifndef DICT_H #define DICT_H #include #include struct level { uint64_t bit_mask; uint64_t *token_masks; }; #ifndef MAPPED_CHARS #define MAPPED_CHARS 32 #endif struct dict { // parameters for compilation struct string_token { char *s; int t; } *strings; size_t nstrings; uint8_t *char_to_bit; // result of compilation struct level start_level; struct level *bit_to_ptr[MAPPED_CHARS]; size_t num_levels; // allocator void *(*calloc)(size_t, size_t); void (*free)(void *); }; #define DICT_INIT(strings_, nstrings_, char_to_bit_) (struct dict){.strings = strings_, .nstrings = nstrings_, .char_to_bit = char_to_bit_, .calloc = NULL, .free = NULL} #define DICT_SET_ALLOCATOR(dict, calloc_, free_) do { \ (dict)->calloc = (calloc_); \ (dict)->free = (free_); \ } while(0) int dict_compile(struct dict *d); void dict_free(struct dict *d); void dict_print(struct dict *d); int dict_check(struct dict *d, char *string); #endif