From 5e131ba1815778bc6ea172cc4ca4f0c478edd316 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Thu, 30 Nov 2006 23:27:10 -0800 Subject: [PATCH] Abstract subanagram code from rack into new bag.c This will allow for some simpler sharing with the new rack-fancy --- Makefile | 2 +- rack.c | 48 ------------------------------------ subanagram.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++ subanagram.h | 25 +++++++++++++++++++ word-game.h | 1 + 5 files changed, 96 insertions(+), 49 deletions(-) create mode 100644 subanagram.c create mode 100644 subanagram.h diff --git a/Makefile b/Makefile index 903deee..f8756be 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ FANCYLIBS=`pkg-config --libs goocanvas` PROGRAMS=grid4 grid5 drill2 rack rack-fancy all: $(PROGRAMS) -LIBRARY=bag.o dict.o grid.o word-game.o +LIBRARY=bag.o dict.o grid.o subanagram.o word-game.o FANCYLIBRARY=demo-item.o %: %.o $(LIBRARY) diff --git a/rack.c b/rack.c index 968a9ee..e3ef209 100644 --- a/rack.c +++ b/rack.c @@ -23,54 +23,6 @@ #include #include -static const char *subanagram_anagram; -static char subanagram_enumerate_word[WORD_GAME_MAX_WORD_LENGTH]; -static dict_t *subanagram_enumerate_answers; - -static void -subanagram_enumerate (dict_cursor_t cursor, - uint8_t seen) -{ - char c; - unsigned int i, last; - uint8_t next_seen; - - if (cursor == DICT_CURSOR_NIL) - return; - - if (DICT_ENTRY_IS_WORD (dict_cursor_resolve (cursor))) - dict_add_word (subanagram_enumerate_answers, subanagram_enumerate_word); - - last = strlen (subanagram_enumerate_word); - - for (i = 0; i < strlen (subanagram_anagram); i++) { - if (seen & (1 << i)) - continue; - next_seen = seen | (1 << i); - c = subanagram_anagram[i]; - if (c == '?' || c == '_') { - for (c = 'a'; c <= 'z'; c++) { - subanagram_enumerate_word[last] = c; - subanagram_enumerate (dict_cursor_next (cursor, c), next_seen); - } - } else { - subanagram_enumerate_word[last] = c; - subanagram_enumerate (dict_cursor_next (cursor, c), next_seen); - } - subanagram_enumerate_word[last] = '\0'; - } -} - -static void -subanagram_expand (const char *anagram, dict_t *dict, dict_t *answers) -{ - subanagram_anagram = anagram; - memset (subanagram_enumerate_word, '\0', WORD_GAME_MAX_WORD_LENGTH); - subanagram_enumerate_answers = answers; - - subanagram_enumerate (dict_root (dict), 0); -} - static int character_compare (const void *_a, const void *_b) diff --git a/subanagram.c b/subanagram.c new file mode 100644 index 0000000..b726a40 --- /dev/null +++ b/subanagram.c @@ -0,0 +1,69 @@ +/* + * Copyright © 2006 Carl Worth + * + * This program is free software; you can redistribute it and\/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." + */ + +#include "word-game.h" + +#include + +static const char *subanagram_letters; +static char subanagram_enumerate_word[WORD_GAME_MAX_WORD_LENGTH]; +static dict_t *subanagram_enumerate_answers; + +static void +subanagram_enumerate (dict_cursor_t cursor, + uint8_t seen) +{ + char c; + unsigned int i, last; + uint8_t next_seen; + + if (cursor == DICT_CURSOR_NIL) + return; + + if (DICT_ENTRY_IS_WORD (dict_cursor_resolve (cursor))) + dict_add_word (subanagram_enumerate_answers, subanagram_enumerate_word); + + last = strlen (subanagram_enumerate_word); + + for (i = 0; i < strlen (subanagram_letters); i++) { + if (seen & (1 << i)) + continue; + next_seen = seen | (1 << i); + c = subanagram_letters[i]; + if (c == '?' || c == '_') { + for (c = 'a'; c <= 'z'; c++) { + subanagram_enumerate_word[last] = c; + subanagram_enumerate (dict_cursor_next (cursor, c), next_seen); + } + } else { + subanagram_enumerate_word[last] = c; + subanagram_enumerate (dict_cursor_next (cursor, c), next_seen); + } + subanagram_enumerate_word[last] = '\0'; + } +} + +void +subanagram_expand (const char *letters, dict_t *dict, dict_t *answers) +{ + subanagram_letters = letters; + memset (subanagram_enumerate_word, '\0', WORD_GAME_MAX_WORD_LENGTH); + subanagram_enumerate_answers = answers; + + subanagram_enumerate (dict_root (dict), 0); +} diff --git a/subanagram.h b/subanagram.h new file mode 100644 index 0000000..32b614e --- /dev/null +++ b/subanagram.h @@ -0,0 +1,25 @@ +/* + * Copyright © 2006 Carl Worth + * + * This program is free software; you can redistribute it and\/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." + */ + +#ifndef _SUBANAGRAM_H_ +#define _SUBANAGRAM_H_ + +void +subanagram_expand (const char *letters, dict_t *dict, dict_t *answers); + +#endif /* _SUBANAGRAM_H_ */ diff --git a/word-game.h b/word-game.h index 9088a89..a4b3609 100644 --- a/word-game.h +++ b/word-game.h @@ -21,6 +21,7 @@ #include "dict.h" #include "bag.h" +#include "subanagram.h" #define WORD_GAME_MAX_WORD_LENGTH 15 -- 2.43.0