kern

diff src/rbtree.c @ 69:b45e2d5f0ae1

ok I *think* i've fixed it now
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 12 Oct 2011 14:39:40 +0300
parents 0a205396e1a0
children b4b7198986a6
line diff
     1.1 --- a/src/rbtree.c	Mon Oct 10 04:16:01 2011 +0300
     1.2 +++ b/src/rbtree.c	Wed Oct 12 14:39:40 2011 +0300
     1.3 @@ -2,6 +2,7 @@
     1.4  #include <stdlib.h>
     1.5  #include <string.h>
     1.6  #include "rbtree.h"
     1.7 +#include "panic.h"
     1.8  
     1.9  #define INT2PTR(x)	((void*)(x))
    1.10  #define PTR2INT(x)	((int)(x))
    1.11 @@ -13,7 +14,6 @@
    1.12  static void del_tree(struct rbnode *node, void (*delfunc)(struct rbnode*, void*), void *cls);
    1.13  static struct rbnode *insert(struct rbtree *rb, struct rbnode *tree, void *key, void *data);
    1.14  static struct rbnode *delete(struct rbtree *rb, struct rbnode *tree, void *key);
    1.15 -/*static struct rbnode *find(struct rbtree *rb, struct rbnode *node, void *key);*/
    1.16  static void traverse(struct rbnode *node, void (*func)(struct rbnode*, void*), void *cls);
    1.17  
    1.18  struct rbtree *rb_create(rb_cmp_func_t cmp_func)
    1.19 @@ -59,6 +59,27 @@
    1.20  	del_tree(rb->root, rb->del, rb->del_cls);
    1.21  }
    1.22  
    1.23 +void rb_clear(struct rbtree *rb)
    1.24 +{
    1.25 +	del_tree(rb->root, rb->del, rb->del_cls);
    1.26 +	rb->root = 0;
    1.27 +}
    1.28 +
    1.29 +int rb_copy(struct rbtree *dest, struct rbtree *src)
    1.30 +{
    1.31 +	struct rbnode *node;
    1.32 +
    1.33 +	rb_clear(dest);
    1.34 +
    1.35 +	rb_begin(src);
    1.36 +	while((node = rb_next(src))) {
    1.37 +		if(rb_insert(dest, node->key, node->data) == -1) {
    1.38 +			return -1;
    1.39 +		}
    1.40 +	}
    1.41 +	return 0;
    1.42 +}
    1.43 +
    1.44  void rb_set_allocator(struct rbtree *rb, rb_alloc_func_t alloc, rb_free_func_t free)
    1.45  {
    1.46  	rb->alloc = alloc;
    1.47 @@ -237,6 +258,9 @@
    1.48  
    1.49  	if(!tree) {
    1.50  		struct rbnode *node = rb->alloc(sizeof *node);
    1.51 +		if(!node) {
    1.52 +			panic("failed to allocate tree node\n");
    1.53 +		}
    1.54  		node->red = 1;
    1.55  		node->key = key;
    1.56  		node->data = data;
    1.57 @@ -455,3 +479,14 @@
    1.58  	}
    1.59  	return tree;
    1.60  }
    1.61 +
    1.62 +void rb_dbg_print_tree(struct rbtree *tree)
    1.63 +{
    1.64 +	struct rbnode *node;
    1.65 +
    1.66 +	rb_begin(tree);
    1.67 +	while((node = rb_next(tree))) {
    1.68 +		printf("%d ", rb_node_keyi(node));
    1.69 +	}
    1.70 +	printf("\n");
    1.71 +}