trie->next[i] = NULL;
}
+void
+trie_destroy (trie_t *trie);
+
+static void
+trie_fini (trie_t *trie)
+{
+ int i;
+
+ for (i = 0; i < 26; i++)
+ if (trie->next[i])
+ trie_destroy (trie->next[i]);
+}
+
trie_t *
trie_create (void)
{
void
trie_destroy (trie_t *trie)
{
- int i;
-
- for (i = 0; i < 26; i++)
- if (trie->next[i])
- trie_destroy (trie->next[i]);
+ trie_fini (trie);
free (trie);
}
}
void
-dict_init (dict_t *dict,
- const char *filename)
+dict_init (dict_t *dict)
+{
+ trie_init (dict);
+}
+
+void
+dict_fini (dict_t *dict)
+{
+ trie_fini (dict);
+}
+
+void
+dict_add_word (dict_t *dict,
+ const char *word)
+{
+ trie_add (dict, word);
+}
+
+void
+dict_add_words_from_file (dict_t *dict,
+ const char *filename)
{
FILE *file;
char *line = NULL;
exit (1);
}
- dict->trie = trie_create ();
-
while (1) {
bytes_read = getline (&line, &line_size, file);
if (bytes_read == -1)
break;
chomp (line);
- trie_add (dict->trie, line);
+ dict_add_word (dict, line);
}
if (line)
free (line);
fclose (file);
}
-void
-dict_fini (dict_t *dict)
+dict_entry_t *
+dict_lookup (dict_t *dict,
+ const char *word)
+{
+ trie_t *trie;
+
+ trie = trie_find (dict, word);
+ if (trie == NULL)
+ return NULL;
+ else
+ return &trie->flags;
+}
+
+/* Yes, this function is rather silly. I have it here in the hope that
+ * it could be used for some better type-checking, (if only C had such
+ * a thing). */
+dict_cursor_t
+dict_root (dict_t *dict)
+{
+ return dict;
+}
+
+dict_cursor_t
+dict_cursor_next (dict_cursor_t cursor,
+ char next)
+{
+ trie_t *trie = cursor;
+
+ if (trie == NULL)
+ return DICT_CURSOR_NIL;
+
+ return trie->next[TRIE_CHAR_TO_INDEX (next)];
+}
+
+dict_entry_t *
+dict_cursor_resolve (dict_cursor_t cursor)
{
- trie_destroy (dict->trie);
+ trie_t *trie;
+
+ if (cursor == DICT_CURSOR_NIL)
+ return NULL;
+
+ trie = cursor;
+ return &trie->flags;
}
void
string_init (&string);
- trie_print (dict->trie, &string, NULL);
+ trie_print (dict, &string, NULL);
string_fini (&string);
}