X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=dict%2Fdelete.c;fp=dict%2Fdelete.c;h=b8ac9da849f08ce473b7fdaa75b9ea1dd46920f7;hp=f3d26cb4bb30873f9cac6e63a97eed198c594d18;hb=6e88e0163a9e3c23963fcb37fe94c936d65dfcc3;hpb=bd0cbfb4847938554141691eb5da1d1967f20d17 diff --git a/dict/delete.c b/dict/delete.c index f3d26cb..b8ac9da 100644 --- a/dict/delete.c +++ b/dict/delete.c @@ -207,19 +207,31 @@ static int dict_del_string(Dict dict, const Dict_char *str, Dict_ptr ptr, ((char*) p+DICT_bsize(p)-sizeof(short)); info = (char*)p - indxp[-mid]; + subptr = 0; /* avoid dict_del_subtree (end of function)*/ if (r == 2) - { /* subptr page is empty and already removed */ - hi = DICT_nodir(p)-1; - while (mid < hi) + { /* subptr page became empty and is removed */ + + /* see if this entry is a real one or if it just + serves as pointer to subptr */ + if (info[sizeof(Dict_ptr)+sizeof(Dict_char)]) { - indxp[-mid] = indxp[-mid-1]; - mid++; + /* this entry do exist, set subptr to 0 */ + memcpy(info, &subptr, sizeof(subptr)); + } + else + { + /* this entry ONLY points to subptr. remove it */ + hi = DICT_nodir(p)-1; + while (mid < hi) + { + indxp[-mid] = indxp[-mid-1]; + mid++; + } + (DICT_nodir(p))--; } - (DICT_nodir(p))--; dict_bf_touch(dict->dbf, ptr); r = 1; } - subptr = 0; /* prevent dict_del_subtree (below) */ } break; }