From ba5e5fc10971719fa5f7584a113b1b26f5932f45 Mon Sep 17 00:00:00 2001 From: Robert James Kaes Date: Tue, 26 Sep 2000 04:59:20 +0000 Subject: Added the TE_EXISTS return code, and cleaned up the ternary_destroy function. --- src/ternary.c | 54 ++++++++++++++++++++---------------------------------- src/ternary.h | 3 ++- 2 files changed, 22 insertions(+), 35 deletions(-) diff --git a/src/ternary.c b/src/ternary.c index fcb61c0..196cfb3 100644 --- a/src/ternary.c +++ b/src/ternary.c @@ -1,4 +1,4 @@ -/* $Id: ternary.c,v 1.1 2000-09-12 00:10:28 rjkaes Exp $ +/* $Id: ternary.c,v 1.2 2000-09-26 04:59:20 rjkaes Exp $ * * This module creates a Ternary Search Tree which can store both string * keys, and arbitrary data for each key. It works similar to a hash, and @@ -33,7 +33,9 @@ #include #include +#include "log.h" #include "ternary.h" +#include "tinyproxy.h" /* * Macros for the tree structures (limits) @@ -224,7 +226,7 @@ TERNARY ternary_new(void) */ if (TE_ISERROR(token = create_token_ref(cur))) { /* error in token generation -- clean up and return */ - free(trees[cur]); + safefree(trees[cur]); trees[cur] = NULL; return token; } @@ -239,27 +241,6 @@ TERNARY ternary_new(void) return token; } -/* - * Recursively deletes the branches (and their branches) - * - * Parameter: Tnode *p node on branch - * void(*)(void *) function pointer to free data routine - * Returned: none - * Exceptions: none - */ -static void delete_branch(Tnode *p, void (*freeptr)(void *ptr)) -{ - if (p) { - delete_branch(p->lokid, freeptr); - delete_branch(p->hikid, freeptr); - if (p->splitchar) - delete_branch(p->eqkid, freeptr); - else - (*freeptr)(p->eqkid); - free(p); - } -} - /* * Delete an exisiting tree * @@ -274,7 +255,7 @@ static void delete_branch(Tnode *p, void (*freeptr)(void *ptr)) int ternary_destroy(TERNARY tno, void (*freeptr)(void *)) { int cur; /* index of current tree */ - unsigned int i; + unsigned int i, j; /* * Check that tno refers to an existing tree; @@ -283,15 +264,18 @@ int ternary_destroy(TERNARY tno, void (*freeptr)(void *)) if (TE_ISERROR(cur = read_token_ref(tno))) return cur; - /* - * Free the tree and reset the array element - */ - delete_branch(trees[cur]->tree_root, freeptr); - for (i = 0; i < trees[cur]->freen; i++) - free(trees[cur]->freearr[i]); + for (i = 0; i < trees[cur]->freen; i++) { + for (j = 0; j < BUFSIZE; j++) { + Tnode *ptr = (trees[cur]->freearr[i] + j); + if (ptr->splitchar == 0) + (*freeptr)(ptr->eqkid); + safefree(ptr); + } + } - free(trees[cur]); - trees[cur] = NULL; + trees[cur]->token = 0; + trees[cur]->tree_root = trees[cur]->buf = NULL; + trees[cur]->bufn = trees[cur]->freen = 0; return TE_NONE; } @@ -329,8 +313,10 @@ int ternary_insert(TERNARY tno, const char *s, void *data) while ((pp = *p)) { if ((d = *s - pp->splitchar) == 0) { - if (*s++ == 0) - return TE_NONE; + if (*s++ == 0) { + DEBUG2("Key exists: %s", s); + return TE_EXISTS; + } p = &(pp->eqkid); } else if (d < 0) p = &(pp->lokid); diff --git a/src/ternary.h b/src/ternary.h index 032889d..fcb6c17 100644 --- a/src/ternary.h +++ b/src/ternary.h @@ -1,4 +1,4 @@ -/* $Id: ternary.h,v 1.1 2000-09-12 00:10:28 rjkaes Exp $ +/* $Id: ternary.h,v 1.2 2000-09-26 04:59:20 rjkaes Exp $ * * See 'ternary.c' for a detailed description. * @@ -50,6 +50,7 @@ extern char te_errbuf[256]; #define TE_NOROOM -6 /* can't allocate space (sys err) */ #define TE_TOOMANYTS -7 /* too many trees in use */ #define TE_INTINCON -8 /* internal inconsistency */ +#define TE_EXISTS -9 /* key already exists in tree */ /* * Library functions. -- cgit v1.2.3