X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=dict.h;h=6152c724e303c8d4177a44ea0cb024c8c9a2e69e;hb=a5187a6b925208af24014e40290f323f8ecd9be7;hp=ccc0c0b8af961570514fd232fe1e29efde80ab71;hpb=2d604d8b8a380f7f3028c234282bfdcf12f95dad;p=wordgame diff --git a/dict.h b/dict.h index ccc0c0b..6152c72 100644 --- a/dict.h +++ b/dict.h @@ -19,9 +19,27 @@ #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; @@ -56,12 +74,17 @@ 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_IS_WORD(entry) ((entry) && ((*entry) & 0x01)) +#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_by_length (dict_t *dict); + int dict_print_if (dict_t *dict, dict_entry_predicate_t predicate); @@ -70,6 +93,31 @@ 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); + +int +dict_for_each (dict_t *dict, + dict_action_t action, + void *closure); + +int +dict_for_each_by_length (dict_t *dict, + dict_action_t action, + void *closure); + +int +dict_for_each_if (dict_t *dict, + dict_action_t action, + void *closure, + dict_entry_predicate_t predicate); + +int +dict_for_each_by_length_if (dict_t *dict, + dict_action_t action, + void *closure, + dict_entry_predicate_t predicate); + /* Character-by-character perusal of the dictionary */ dict_cursor_t dict_root (dict_t *dict);