From e369495b297825ed267050c99cb74439f79bce90 Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Tue, 27 May 2014 14:20:29 +0000 Subject: apr_skiplist_add()... idea from yann git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1597797 13f79535-47bb-0310-9956-ffa450edef68 --- tables/apr_skiplist.c | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) (limited to 'tables') diff --git a/tables/apr_skiplist.c b/tables/apr_skiplist.c index effcf603b..a638a698a 100644 --- a/tables/apr_skiplist.c +++ b/tables/apr_skiplist.c @@ -339,16 +339,8 @@ APR_DECLARE(void *) apr_skiplist_previous(apr_skiplist *sl, apr_skiplistnode **i return (*iter) ? ((*iter)->data) : NULL; } -APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert(apr_skiplist *sl, void *data) -{ - if (!sl->compare) { - return 0; - } - return apr_skiplist_insert_compare(sl, data, sl->compare); -} - -APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert_compare(apr_skiplist *sl, void *data, - apr_skiplist_compare comp) +static apr_skiplistnode *insert_compare(apr_skiplist *sl, void *data, + apr_skiplist_compare comp, int replace) { apr_skiplistnode *m, *p, *tmp, *ret = NULL, **stack; int nh = 1, ch, stacki; @@ -406,11 +398,11 @@ APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert_compare(apr_skiplist *sl, vo if (m->next) { compared = comp(data, m->next->data); } - if (compared == 0) { + if (compared == 0 && replace) { free(stack); /* OK. was malloc'ed */ return 0; } - if ((m->next == NULL) || (compared < 0)) { + if ( (compared < 0) || (replace && (m->next == NULL)) ) { if (ch <= nh) { /* push on stack */ stack[stacki++] = m; @@ -470,6 +462,34 @@ APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert_compare(apr_skiplist *sl, vo return ret; } +APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert(apr_skiplist *sl, void *data) +{ + if (!sl->compare) { + return 0; + } + return insert_compare(sl, data, sl->compare, 1); +} + +APR_DECLARE(apr_skiplistnode *) apr_skiplist_add_compare(apr_skiplist *sl, void *data, + apr_skiplist_compare comp) +{ + return insert_compare(sl, data, comp, 0); +} + +APR_DECLARE(apr_skiplistnode *) apr_skiplist_add(apr_skiplist *sl, void *data) +{ + if (!sl->compare) { + return 0; + } + return insert_compare(sl, data, sl->compare, 0); +} + +APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert_compare(apr_skiplist *sl, void *data, + apr_skiplist_compare comp) +{ + return insert_compare(sl, data, comp, 1); +} + APR_DECLARE(int) apr_skiplist_remove(apr_skiplist *sl, void *data, apr_skiplist_freefunc myfree) { if (!sl->compare) { -- cgit v1.2.1