From bfa7f970e514dfdfa067191f1b3fc30a004972bf Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Wed, 6 Dec 1995 14:52:21 +0000 Subject: [PATCH] New function: dict_delete. --- dict/delete.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 dict/delete.c diff --git a/dict/delete.c b/dict/delete.c new file mode 100644 index 0000000..4ede113 --- /dev/null +++ b/dict/delete.c @@ -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 +#include +#include +#include + +#include + +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); +} -- 1.7.10.4