--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/load.c Sun Aug 05 23:06:42 2007 +0200
@@ -0,0 +1,99 @@
+#include <stdio.h>
+
+#include "dictre.h"
+
+enum
+{
+ MAX=500000
+};
+
+struct Word words[MAX];
+int nwords;
+struct Def defs[MAX];
+int ndefs;
+int dont_touch[20];
+int ndont_touch;
+
+void load_init()
+{
+ ndefs = 0;
+ nwords = 0;
+ ndont_touch = 0;
+}
+
+static void new_word(struct Word *from)
+{
+ memcpy(&words[nwords], from, sizeof(*from));
+ nwords++;
+}
+
+static void new_dont_touch(int n)
+{
+ dont_touch[ndont_touch++] = n;
+}
+
+static int new_def(char *def, int offset, int length)
+{
+ defs[ndefs].d = def;
+ defs[ndefs].offset = offset;
+ defs[ndefs].length = length;
+ return ndefs++;
+}
+
+static int search_def(int offset, int length)
+{
+ int i;
+
+ for(i=0; i < ndefs; ++i)
+ {
+ if (defs[i].offset == offset &&
+ defs[i].length == length)
+ return i;
+ }
+ return -1;
+}
+
+static void print_word(struct Word *w)
+{
+ printf("%s\t%i\n", w->w, w->def);
+}
+
+void load_dictionary(FILE *index, FILE *fdefs)
+{
+ struct Word w;
+ int last_offset = 0;
+
+ do {
+ int offset, length;
+ char *defstr;
+ w.w = get_word(index);
+ if (w.w == 0)
+ break;
+ offset = get_int(index);
+ length = get_int(index);
+ if (offset > last_offset)
+ {
+ w.def = -1;
+ last_offset = offset;
+ }
+ else
+ w.def = search_def(offset, length);
+ if (w.def == -1)
+ {
+ defstr = get_def(fdefs, offset, length);
+ w.def = new_def(defstr, offset, length);
+ }
+ /* sizeof -1 instead of strlen() */
+ if (strncmp(w.w, "00database", sizeof("00database") - 1) == 0)
+ new_dont_touch(w.def);
+ new_word(&w);
+ } while(1);
+}
+
+void print_words()
+{
+ int i;
+
+ for(i=0; i < nwords; ++i)
+ print_word(&words[i]);
+}