X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Futils%2Favltree.c;h=87db2f78d0e9b8e7c1eee042af3f32de0c697887;hb=b75718ea9fe4d6c90f1794e517a0712729553c0c;hp=56bc57d3087b69bccc42c20fde8cdfcd835f8162;hpb=472f9e4bed3b6d62bb063c6d8111cd37688c34ac;p=sysdb.git diff --git a/src/utils/avltree.c b/src/utils/avltree.c index 56bc57d..87db2f7 100644 --- a/src/utils/avltree.c +++ b/src/utils/avltree.c @@ -36,6 +36,7 @@ #include #include +#include #include /* @@ -66,8 +67,6 @@ struct node { struct sdb_avltree { pthread_rwlock_t lock; - sdb_object_cmp_cb cmp; - node_t *root; size_t size; }; @@ -155,9 +154,30 @@ tree_clear(sdb_avltree_t *tree) { node_t *n; - n = node_smallest(tree); + if ((! tree) || (! tree->root)) + return; + + /* do a depth-first iteration and delete the leafs */ + n = tree->root; while (n) { - node_t *tmp = node_next(n); + node_t *tmp; + + if (n->left) { + n = n->left; + continue; + } + else if (n->right) { + n = n->right; + continue; + } + + tmp = n->parent; + if (tmp) { + if (tmp->left == n) + tmp->left = NULL; + else + tmp->right = NULL; + } node_destroy(n); n = tmp; @@ -260,7 +280,7 @@ rebalance(sdb_avltree_t *tree, node_t *n) */ sdb_avltree_t * -sdb_avltree_create(sdb_object_cmp_cb cmp) +sdb_avltree_create(void) { sdb_avltree_t *tree; @@ -268,11 +288,7 @@ sdb_avltree_create(sdb_object_cmp_cb cmp) if (! tree) return NULL; - if (! cmp) - cmp = sdb_object_cmp_by_name; - pthread_rwlock_init(&tree->lock, /* attr = */ NULL); - tree->cmp = cmp; tree->root = NULL; tree->size = 0; @@ -331,7 +347,7 @@ sdb_avltree_insert(sdb_avltree_t *tree, sdb_object_t *obj) while (42) { assert(parent); - diff = tree->cmp(obj, parent->obj); + diff = strcasecmp(obj->name, parent->obj->name); if (! diff) { node_destroy(n); pthread_rwlock_unlock(&tree->lock); @@ -363,7 +379,7 @@ sdb_avltree_insert(sdb_avltree_t *tree, sdb_object_t *obj) } /* sdb_avltree_insert */ sdb_object_t * -sdb_avltree_lookup(sdb_avltree_t *tree, const sdb_object_t *ref) +sdb_avltree_lookup(sdb_avltree_t *tree, const char *name) { node_t *n; @@ -372,7 +388,7 @@ sdb_avltree_lookup(sdb_avltree_t *tree, const sdb_object_t *ref) n = tree->root; while (n) { - int diff = tree->cmp(n->obj, ref); + int diff = strcasecmp(n->obj->name, name); if (! diff) { sdb_object_ref(n->obj); @@ -419,7 +435,7 @@ sdb_avltree_iter_destroy(sdb_avltree_iter_t *iter) free(iter); } /* sdb_avltree_iter_destroy */ -_Bool +bool sdb_avltree_iter_has_next(sdb_avltree_iter_t *iter) { if (! iter) @@ -441,18 +457,26 @@ sdb_avltree_iter_get_next(sdb_avltree_iter_t *iter) return n ? n->obj : NULL; } /* sdb_avltree_iter_get_next */ +sdb_object_t * +sdb_avltree_iter_peek_next(sdb_avltree_iter_t *iter) +{ + if ((! iter) || (! iter->node)) + return NULL; + return iter->node->obj; +} /* sdb_avltree_iter_peek_next */ + size_t sdb_avltree_size(sdb_avltree_t *tree) { return tree ? tree->size : 0; } /* sdb_avltree_size */ -_Bool +bool sdb_avltree_valid(sdb_avltree_t *tree) { node_t *n; - _Bool status = 1; + bool status = 1; size_t size = 0; if (! tree)