| |
| #include "cs_config.h" |
| #include <unistd.h> |
| #include <string.h> |
| #include "util/neo_misc.h" |
| #include "util/neo_err.h" |
| #include "util/neo_hash.h" |
| |
| void dump_string_hash(NE_HASH *hash) |
| { |
| NE_HASHNODE *node; |
| int x; |
| |
| for (x = 0; x < hash->size; x++) |
| { |
| ne_warn("Node %d", x); |
| for (node = hash->nodes[x]; node; node = node->next) |
| { |
| ne_warn(" %s = %s [%8x | %d]", node->key, node->value, node->hashv, node->hashv & (hash->size - 1)); |
| } |
| } |
| } |
| |
| NEOERR *dictionary_test (void) |
| { |
| NEOERR *err = STATUS_OK; |
| int x; |
| char *word; |
| NE_HASH *hash = NULL; |
| FILE *fp; |
| char buf[256]; |
| |
| err = ne_hash_init(&hash, ne_hash_str_hash, ne_hash_str_comp); |
| if (err) |
| return nerr_pass(err); |
| |
| fp = fopen ("/usr/dict/words", "r"); |
| if (fp == NULL) { |
| fp = fopen ("/usr/share/dict/words", "r"); |
| if (fp == NULL) |
| return nerr_raise_errno(NERR_IO, "Unable to open file /usr/dict/words"); |
| } |
| |
| ne_warn("Loading words into hash"); |
| while (fgets (buf, sizeof(buf), fp) != NULL) |
| { |
| x = strlen (buf); |
| if (buf[x-1] == '\n') |
| buf[x-1] = '\0'; |
| |
| word = strdup(buf); |
| err = ne_hash_insert(hash, word, word); |
| if (err) break; |
| word = ne_hash_lookup(hash, buf); |
| if (word == NULL) |
| { |
| err = nerr_raise(NERR_ASSERT, "Unable to find word %s in hash", buf); |
| break; |
| } |
| if (strcmp(word, buf)) |
| { |
| err = nerr_raise(NERR_ASSERT, "Lookup returned wrong word: %s != %s", buf, word); |
| break; |
| } |
| } |
| fclose (fp); |
| ne_warn("Loaded %d words", hash->num); |
| if (err) |
| { |
| dump_string_hash(hash); |
| return nerr_pass(err); |
| } |
| |
| fp = fopen ("/usr/dict/words", "r"); |
| if (fp == NULL) { |
| fp = fopen ("/usr/share/dict/words", "r"); |
| if (fp == NULL) |
| return nerr_raise_errno(NERR_IO, "Unable to open file /usr/dict/words"); |
| } |
| |
| ne_warn("Testing words in hash"); |
| while (fgets (buf, sizeof(buf), fp) != NULL) |
| { |
| x = strlen (buf); |
| if (buf[x-1] == '\n') |
| buf[x-1] = '\0'; |
| |
| if (!(word = ne_hash_lookup(hash, buf))) |
| { |
| err = nerr_raise(NERR_ASSERT, "Unable to find word %s in hash", buf); |
| break; |
| } |
| if (strcmp(word, buf)) |
| { |
| err = nerr_raise(NERR_ASSERT, "Lookup returned wrong word: %s != %s", buf, word); |
| break; |
| } |
| } |
| fclose (fp); |
| ne_hash_destroy(&hash); |
| |
| return nerr_pass(err); |
| } |
| |
| int main(int argc, char **argv) |
| { |
| NEOERR *err; |
| |
| err = dictionary_test(); |
| if (err) |
| { |
| nerr_log_error(err); |
| printf("FAIL\n"); |
| return -1; |
| } |
| printf("PASS\n"); |
| return 0; |
| } |