int main(void) { Trie *trie = NULL; Trie_init(&trie); /* find on empty trie. */ assert(!Trie_find(trie, (ts){0}, 1)); /* Add and find length 1. */ assert(!Trie_add(trie, (ts){0}, 1)); assert(Trie_find(trie, (ts){0}, 1)); assert(!Trie_find(trie, (ts){1}, 1)); /* Add previously added. */ assert(Trie_add(trie, (ts){0}, 1)); /* Add and find length 3 */ { assert(Trie_find(trie, (ts){0}, 1)); assert(!Trie_find(trie, (ts){0, 1}, 2)); assert(!Trie_find(trie, (ts){0, 1, 2}, 3)); assert(!Trie_add(trie, (ts){0, 1, 2}, 3)); assert(Trie_find(trie, (ts){0}, 1)); assert(!Trie_find(trie, (ts){0, 1}, 2)); assert(Trie_find(trie, (ts){0, 1, 2}, 3)); } return EXIT_SUCCESS; }
int main(int argc, char** argv) { if (!strcmp(argv[1], "load")) { FILE* file = fopen("trie-data", "r"); Trie_typ* loaded = Trie_load(file); struct termios oldT, newT; ioctl(0, TCGETS, &oldT); newT = oldT; newT.c_lflag &= ~(ECHO | ICANON); ioctl(0, TCSETS, &newT); char word[1024]; int pos = 0; while (1) { char c; read(0, &c, 1); if (c == '/') { pos = 0; memset(word, 0, 1024); } else if (c == '?') { Trie_destroy(loaded); fclose(file); return 0; } else { word[pos++] = c; word[pos] = '\0'; find_and_print(loaded, word); } } return 0; } Trie_typ* trie = Trie_init(); char word[1024]; while (fgets(word, 1024-1, stdin)) { word[strlen(word)-1] = '\0'; // replace the newline Trie_add(trie, word); } if (!strcmp(argv[1], "build")) { FILE* stream = fopen("trie-data", "w"); if (stream) { Trie_save(trie, stream); fclose(stream); } else { printf("Error occurred\n"); } } find_and_print(trie, argv[1]); Trie_destroy(trie); trie = NULL; return 0; }
int Trie_add(Trie *trie, t *word, size_t size) { size_t i; int present; Trie **next; for (i = 0; i < size; ++i) { next = &trie->children[word[i]]; if (*next == NULL) Trie_init(next); trie = *next; } present = trie->is_word; trie->is_word = 1; return present; }