New function: dict_delete.
[idzebra-moved-to-github.git] / dict / delete.c
1 /*
2  * Copyright (C) 1994, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: delete.c,v $
7  * Revision 1.1  1995-12-06 14:52:21  adam
8  * New function: dict_delete.
9  *
10  */
11
12 #include <stdlib.h>
13 #include <string.h>
14 #include <stdio.h>
15 #include <assert.h>
16
17 #include <dict.h>
18
19 static int dict_del (Dict dict, const Dict_char *str)
20 {
21     Dict_ptr ptr = 1;
22     int mid, lo, hi;
23     int cmp;
24     void *p;
25     short *indxp;
26     char *info;
27
28     dict_bf_readp (dict->dbf, ptr, &p);
29     mid = lo = 0;
30     hi = DICT_nodir(p)-1;
31     indxp = (short*) ((char*) p+DICT_pagesize(dict)-sizeof(short));    
32     while (lo <= hi)
33     {
34         mid = (lo+hi)/2;
35         if (indxp[-mid] > 0)
36         {
37             /* string (Dict_char *) DICT_EOS terminated */
38             /* unsigned char        length of information */
39             /* char *               information */
40             info = (char*)p + indxp[-mid];
41             cmp = dict_strcmp((Dict_char*) info, str);
42             if (!cmp)
43             {
44                 while (mid < hi)
45                 {
46                     indxp[-mid] = indxp[-mid-1];
47                     mid++;
48                 }
49                 (DICT_nodir(p))--;
50                 dict_bf_touch (dict->dbf, ptr);
51                 return 1;
52             }
53         }
54         else
55         {
56             Dict_char dc;
57             Dict_ptr subptr;
58
59             /* Dict_ptr             subptr */
60             /* Dict_char            sub char */
61             /* unsigned char        length of information */
62             /* char *               information */
63             info = (char*)p - indxp[-mid];
64             memcpy (&dc, info+sizeof(Dict_ptr), sizeof(Dict_char));
65             cmp = dc- *str;
66             if (!cmp)
67             {
68                 memcpy (&subptr, info, sizeof(Dict_ptr));
69                 if (*++str == DICT_EOS)
70                 {
71                     if (info[sizeof(Dict_ptr)+sizeof(Dict_char)])
72                     {
73                         info[sizeof(Dict_ptr)+sizeof(Dict_char)] = 0;
74                         dict_bf_touch (dict->dbf, ptr);
75                         return 1;
76                     }
77                     return 0;
78                 }
79                 else
80                 {
81                     if (subptr == 0)
82                         return 0;
83                     ptr = subptr;
84                     dict_bf_readp (dict->dbf, ptr, &p);
85                     mid = lo = 0;
86                     hi = DICT_nodir(p)-1;
87                     indxp = (short*) ((char*) p+DICT_pagesize(dict)
88                                       -sizeof(short));
89                     continue;
90                 }
91             }
92         }
93         if (cmp < 0)
94             lo = mid+1;
95         else
96             hi = mid-1;
97     }
98     return 0;
99 }
100
101 int dict_delete (Dict dict, const Dict_char *p)
102 {
103     if (dict->head.last == 1)
104         return 0;
105     return dict_del (dict, p);
106 }