X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Futils%2Favltree.c;h=f0987f54fdba41cce4f8fd85b9a7b11eb435f86c;hb=dcf7802ad0958d4752b2c13f70e2fdf345d3509f;hp=7397a34fdbb56dfd54d4db07c82f797cf3d93b76;hpb=7c0c900e329faf456e2b7e1a017a197ef7839c5d;p=sysdb.git diff --git a/src/utils/avltree.c b/src/utils/avltree.c index 7397a34..f0987f5 100644 --- a/src/utils/avltree.c +++ b/src/utils/avltree.c @@ -37,6 +37,7 @@ #include #include +#include #include /* @@ -154,9 +155,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; @@ -414,7 +436,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) @@ -436,18 +458,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)