load.c
changeset 0 7f37716d4f1e
child 2 57a1fcb0c75c
--- /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]);
+}