| /* |
| Copyright 2020 Google LLC |
| |
| Use of this source code is governed by a BSD-style |
| license that can be found in the LICENSE file or at |
| https://developers.google.com/open-source/licenses/bsd |
| */ |
| |
| #include "tree.h" |
| |
| #include "basics.h" |
| #include "system.h" |
| |
| struct tree_node *tree_search(void *key, struct tree_node **rootp, |
| int (*compare)(const void *, const void *), |
| int insert) |
| { |
| int res; |
| if (*rootp == NULL) { |
| if (!insert) { |
| return NULL; |
| } else { |
| struct tree_node *n = |
| reftable_calloc(sizeof(struct tree_node)); |
| n->key = key; |
| *rootp = n; |
| return *rootp; |
| } |
| } |
| |
| res = compare(key, (*rootp)->key); |
| if (res < 0) |
| return tree_search(key, &(*rootp)->left, compare, insert); |
| else if (res > 0) |
| return tree_search(key, &(*rootp)->right, compare, insert); |
| return *rootp; |
| } |
| |
| void infix_walk(struct tree_node *t, void (*action)(void *arg, void *key), |
| void *arg) |
| { |
| if (t->left) { |
| infix_walk(t->left, action, arg); |
| } |
| action(arg, t->key); |
| if (t->right) { |
| infix_walk(t->right, action, arg); |
| } |
| } |
| |
| void tree_free(struct tree_node *t) |
| { |
| if (t == NULL) { |
| return; |
| } |
| if (t->left) { |
| tree_free(t->left); |
| } |
| if (t->right) { |
| tree_free(t->right); |
| } |
| reftable_free(t); |
| } |