/* 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); }