#include <stdio.h> #include "trie.h" static char buf[80]; static char *string; /* Listdictionary prints out all words in the dictionary begining with a given prefix. */ static void print (char *s, register unsigned long i); static unsigned long wseek (register char *s, unsigned long i); void listdictionary(char *prefix) { string = buf; while (*string++ = *prefix++); string--; /* Wseek to the start node and call print */ print (string, wseek (buf, root)); } /* Wseek takes a string s and a start edge i and follows the edges of the dawg pointed to by i labelled by chars from s. It returns an edge into the dawg. */ static unsigned long wseek (register char *s, unsigned long i) { if (*s) { /* not the null string */ register unsigned long *p = dawg + ptr(i); do { if (chr(*p) == chr(*s))/* Look for an edge */ return wseek (s + 1, *p);/* Found the edge */ } while (!last(*p++)); return 0; /* No edge - dead state */ } else /* null string */ return i; /* return this edge */ } /* Print takes a pointer into stringbuf s and a start edge i and prints all strings represented by the sub-dawg pointed to by i. */ static void print (char *s, register unsigned long i) { if (term(i)) { /* edge points at a complete word */ *s = '\0'; printf ("%s\n", buf); /* so print the word */ } if (ptr(i)) { /* Compute index: is it non-zero ? */ register unsigned long *p = dawg + ptr(i); do { /* for each edge out of this node */ *s = chr(*p) + 'a' - 1; print (s + 1, *p);/* recur */ } while (!last(*p++)); } }