X-Git-Url: https://git.cworth.org/git?p=wordgame;a=blobdiff_plain;f=grid.c;h=44ffa9d23f7487b90a8c0c71f542ae267d364c62;hp=9b0ffbe7eeb30896af40c006dae551373463a70d;hb=dd4b319cdb6e2883ae76317036b57b670344160a;hpb=70914305c0fe98948ba7e105a220fe7a36a62fec diff --git a/grid.c b/grid.c index 9b0ffbe..44ffa9d 100644 --- a/grid.c +++ b/grid.c @@ -101,11 +101,14 @@ board_enumerate (board_t *board, int y, int16_t seen, string_t *word, - trie_t *dict_trie) + dict_cursor_t dict_cursor) { char c; int dx, dy; + if (dict_cursor == DICT_CURSOR_NIL) + return; + if (x < 0 || x >= 4 || y < 0 || y >= 4 || seen & SEEN_BIT (x, y)) @@ -117,28 +120,22 @@ board_enumerate (board_t *board, c = board->letters[y][x]; string_append_char (word, c); - dict_trie = dict_trie->next[TRIE_CHAR_TO_INDEX (c)]; - if (dict_trie == NULL) - goto BAIL0; + dict_cursor = dict_cursor_next (dict_cursor, c); if (c == 'q') { string_append_char (word, 'u'); - dict_trie = dict_trie->next[TRIE_CHAR_TO_INDEX ('u')]; - if (dict_trie == NULL) - goto BAIL1; + dict_cursor = dict_cursor_next (dict_cursor, 'u'); } - if (dict_trie->flags & TRIE_FLAGS_IS_WORD) + if (DICT_ENTRY_IS_WORD (dict_cursor_resolve (dict_cursor))) dict_add_word (board->results, word->s); for (dy = -1; dy <= 1; dy++) for (dx = -1; dx <= 1; dx++) - board_enumerate (board, x + dx, y + dy, seen, word, dict_trie); + board_enumerate (board, x + dx, y + dy, seen, word, dict_cursor); - BAIL1: if (c == 'q') string_chop (word); - BAIL0: string_chop (word); } @@ -155,7 +152,7 @@ board_solve (board_t *board, dict_t *dict, dict_t *solution) for (y = 0; y < 4; y++) for (x = 0; x < 4; x++) - board_enumerate (board, x, y, seen, &word, dict); + board_enumerate (board, x, y, seen, &word, dict_root (dict)); string_fini (&word); } @@ -198,16 +195,16 @@ main (void) if (strlen (response) == 0) { board_print (&board); } else { - trie_t *t; - t = trie_find (&solution, response); - if (t && (t->flags & TRIE_FLAGS_IS_WORD)) { - if (t->flags & TRIE_FLAGS_SEEN) + dict_entry_t *entry; + entry = dict_lookup (&solution, response); + if (DICT_ENTRY_IS_WORD (entry)) { + if (*entry & TRIE_FLAGS_SEEN) printf ("(repeat)\n"); else - t->flags |= TRIE_FLAGS_SEEN; + *entry |= TRIE_FLAGS_SEEN; } else { - t = trie_find (&dict, response); - if (t && (t->flags & TRIE_FLAGS_IS_WORD)) + entry = dict_lookup (&dict, response); + if (DICT_ENTRY_IS_WORD (entry)) printf ("(a good word, but it's not in the puzzle)\n"); else printf ("*** %s is not a word\n", response);