git
1/*
2Copyright 2020 Google LLC
3
4Use of this source code is governed by a BSD-style
5license that can be found in the LICENSE file or at
6https://developers.google.com/open-source/licenses/bsd
7*/
8
9#include "system.h"10#include "tree.h"11
12#include "basics.h"13
14struct tree_node *tree_search(void *key, struct tree_node **rootp,15int (*compare)(const void *, const void *),16int insert)17{
18int res;19if (!*rootp) {20if (!insert) {21return NULL;22} else {23struct tree_node *n;24REFTABLE_CALLOC_ARRAY(n, 1);25n->key = key;26*rootp = n;27return *rootp;28}29}30
31res = compare(key, (*rootp)->key);32if (res < 0)33return tree_search(key, &(*rootp)->left, compare, insert);34else if (res > 0)35return tree_search(key, &(*rootp)->right, compare, insert);36return *rootp;37}
38
39void infix_walk(struct tree_node *t, void (*action)(void *arg, void *key),40void *arg)41{
42if (t->left)43infix_walk(t->left, action, arg);44action(arg, t->key);45if (t->right)46infix_walk(t->right, action, arg);47}
48
49void tree_free(struct tree_node *t)50{
51if (!t)52return;53if (t->left)54tree_free(t->left);55if (t->right)56tree_free(t->right);57reftable_free(t);58}
59