X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=dict.h;h=622165195daf12151776f2cec9316f0aa35106b8;hb=0a8d1f741a919c9c7e5ae0b8d0261759cca9bc05;hp=e58c8b4c4e3c992ca82ff67c0c04039af43fc8f1;hpb=003aa44c1c2fecd15ff55f62aea88cda1a83be85;p=wordgame diff --git a/dict.h b/dict.h index e58c8b4..6221651 100644 --- a/dict.h +++ b/dict.h @@ -19,14 +19,39 @@ #ifndef _DICT_H_ #define _DICT_H_ -#include "dict-impl.h" +/* Portably, schmortability. I want ease of programming. */ +#define _GNU_SOURCE +#include +#include +#include + +#ifndef FALSE +# define FALSE 0 +#endif + +#ifndef TRUE +# define TRUE 1 +#endif + +typedef int bool_t; + +typedef struct _trie { + uint32_t flags; + struct _trie *next[26]; +} trie_t; -/* Only looks opaque. Perfectly stack-allocatable */ typedef trie_t dict_t; +typedef trie_t *dict_cursor_t; +typedef uint32_t dict_entry_t; +/* Initialization and cleanup */ void dict_init (dict_t *dict); +void +dict_fini (dict_t *dict); + +/* Adding new words */ void dict_add_word (dict_t *dict, const char *word); @@ -34,7 +59,91 @@ void dict_add_words_from_file (dict_t *dict, const char *filename); -void -dict_fini (dict_t *dict); +/* Looking up an entry in the dictionary */ +dict_entry_t * +dict_lookup (dict_t *dict, + const char *word); + +typedef bool_t +(*dict_entry_predicate_t) (dict_entry_t entry); + +int +dict_count_if (dict_t *dict, + dict_entry_predicate_t predicate); + +int +dict_count (dict_t *dict); + +/* Querying a dictionary entry. The dict interface uses 1 bit. + * All of the remaining bits are available for application use. + */ +#define DICT_ENTRY_FLAG_IS_WORD (1<<0) + +#define DICT_ENTRY_IS_WORD(entry) ((entry) && ((*entry) & DICT_ENTRY_FLAG_IS_WORD)) + +/* Printing the dictionary */ +int +dict_print (dict_t *dict); + +int +dict_print_of_length (dict_t *dict, + int min_length, + int max_length); + +int +dict_print_if (dict_t *dict, + dict_entry_predicate_t predicate); + +int +dict_print_of_length_if (dict_t *dict, + int min_length, + int max_length, + dict_entry_predicate_t predicate); + +int +dict_print_by_length_if (dict_t *dict, + dict_entry_predicate_t predicate); + +/* More general callback-based iteration of all entries */ +typedef void (* dict_action_t) (void *closure, char *word, dict_entry_t *entry); + +int +dict_for_each (dict_t *dict, + dict_action_t action, + void *closure); + +int +dict_for_each_of_length (dict_t *dict, + dict_action_t action, + void *closure, + int min_length, + int max_length); + +int +dict_for_each_if (dict_t *dict, + dict_action_t action, + void *closure, + dict_entry_predicate_t predicate); + +int +dict_for_each_of_length_if (dict_t *dict, + dict_action_t action, + void *closure, + int min_length, + int max_length, + dict_entry_predicate_t predicate); + +/* Character-by-character perusal of the dictionary */ +dict_cursor_t +dict_root (dict_t *dict); + +dict_cursor_t +dict_cursor_next (dict_cursor_t cursor, + char next); + +dict_entry_t * +dict_cursor_resolve (dict_cursor_t cursor); + +#define DICT_CURSOR_NIL NULL #endif /* _DICT_H_ */