64 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
| /*
 | |
| 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 "system.h"
 | |
| #include "tree.h"
 | |
| 
 | |
| #include "basics.h"
 | |
| 
 | |
| struct tree_node *tree_search(void *key, struct tree_node **rootp,
 | |
| 			      int (*compare)(const void *, const void *),
 | |
| 			      int insert)
 | |
| {
 | |
| 	int res;
 | |
| 	if (!*rootp) {
 | |
| 		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) {
 | |
| 		return;
 | |
| 	}
 | |
| 	if (t->left) {
 | |
| 		tree_free(t->left);
 | |
| 	}
 | |
| 	if (t->right) {
 | |
| 		tree_free(t->right);
 | |
| 	}
 | |
| 	reftable_free(t);
 | |
| }
 |