5 static int bintree_compare_mem(void *v1, void *v2, Bintree *tree)
7 return memcmp(v1, v2, tree->key_size);
10 Bintree bintree_create(size_t key_size, BintreeComparator cmp)
15 .cmp = cmp ? cmp : &bintree_compare_mem,
19 static BintreeNode **search_recursive(Bintree *tree, BintreeNode **nodeptr, void *key)
24 if ((cond = tree->cmp((*nodeptr)->key, key, tree)) == 0)
27 return search_recursive(tree, &(*nodeptr)->left, key);
29 return search_recursive(tree, &(*nodeptr)->right, key);
35 BintreeNode **bintree_search(Bintree *tree, void *key)
37 return search_recursive(tree, &tree->root, key);
40 void bintree_add_node(Bintree *tree, BintreeNode **nodeptr, void *key, void *value)
42 *nodeptr = malloc(sizeof(BintreeNode));
43 (*nodeptr)->key = malloc(tree->key_size);
44 memcpy((*nodeptr)->key, key, tree->key_size);
45 (*nodeptr)->value = value;
46 (*nodeptr)->left = (*nodeptr)->right = NULL;
49 static void free_recursive(BintreeNode *node, BintreeFreeFunction func, void *arg)
52 free_recursive(node->left, func, arg);
53 free_recursive(node->right, func, arg);
56 func(node->value, arg);
61 void bintree_clear(Bintree *tree, BintreeFreeFunction func, void *arg)
64 free_recursive(tree->root, func, arg);