New function: dict_delete.
authorAdam Dickmeiss <adam@indexdata.dk>
Wed, 6 Dec 1995 14:52:21 +0000 (14:52 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Wed, 6 Dec 1995 14:52:21 +0000 (14:52 +0000)
dict/delete.c [new file with mode: 0644]

diff --git a/dict/delete.c b/dict/delete.c
new file mode 100644 (file)
index 0000000..4ede113
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 1994, Index Data I/S 
+ * All rights reserved.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log: delete.c,v $
+ * Revision 1.1  1995-12-06 14:52:21  adam
+ * New function: dict_delete.
+ *
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+
+#include <dict.h>
+
+static int dict_del (Dict dict, const Dict_char *str)
+{
+    Dict_ptr ptr = 1;
+    int mid, lo, hi;
+    int cmp;
+    void *p;
+    short *indxp;
+    char *info;
+
+    dict_bf_readp (dict->dbf, ptr, &p);
+    mid = lo = 0;
+    hi = DICT_nodir(p)-1;
+    indxp = (short*) ((char*) p+DICT_pagesize(dict)-sizeof(short));    
+    while (lo <= hi)
+    {
+        mid = (lo+hi)/2;
+        if (indxp[-mid] > 0)
+        {
+            /* string (Dict_char *) DICT_EOS terminated */
+            /* unsigned char        length of information */
+            /* char *               information */
+            info = (char*)p + indxp[-mid];
+            cmp = dict_strcmp((Dict_char*) info, str);
+            if (!cmp)
+            {
+                while (mid < hi)
+                {
+                    indxp[-mid] = indxp[-mid-1];
+                    mid++;
+                }
+                (DICT_nodir(p))--;
+                dict_bf_touch (dict->dbf, ptr);
+                return 1;
+            }
+        }
+        else
+        {
+            Dict_char dc;
+            Dict_ptr subptr;
+
+            /* Dict_ptr             subptr */
+            /* Dict_char            sub char */
+            /* unsigned char        length of information */
+            /* char *               information */
+            info = (char*)p - indxp[-mid];
+            memcpy (&dc, info+sizeof(Dict_ptr), sizeof(Dict_char));
+            cmp = dc- *str;
+            if (!cmp)
+            {
+                memcpy (&subptr, info, sizeof(Dict_ptr));
+                if (*++str == DICT_EOS)
+                {
+                    if (info[sizeof(Dict_ptr)+sizeof(Dict_char)])
+                    {
+                        info[sizeof(Dict_ptr)+sizeof(Dict_char)] = 0;
+                        dict_bf_touch (dict->dbf, ptr);
+                        return 1;
+                    }
+                    return 0;
+                }
+                else
+                {
+                    if (subptr == 0)
+                        return 0;
+                    ptr = subptr;
+                    dict_bf_readp (dict->dbf, ptr, &p);
+                    mid = lo = 0;
+                    hi = DICT_nodir(p)-1;
+                    indxp = (short*) ((char*) p+DICT_pagesize(dict)
+                                      -sizeof(short));
+                    continue;
+                }
+            }
+        }
+        if (cmp < 0)
+            lo = mid+1;
+        else
+            hi = mid-1;
+    }
+    return 0;
+}
+
+int dict_delete (Dict dict, const Dict_char *p)
+{
+    if (dict->head.last == 1)
+        return 0;
+    return dict_del (dict, p);
+}