Exemple #1
0
extern void
rb_delete(RBTree *rb, void *data)
{
	RBNode	   *node = rb->root;
	int			cmp;

	while (node != RBNIL)
	{
		cmp = rb->comparator(data, node->data, rb->arg);

		if (cmp == 0)
		{
			/* found node to delete */
			if (rb->freefunc)
				rb->freefunc (node->data);

			node->data = NULL;
			rb_delete_node(rb, node);
			return;
		}
		else if (cmp < 0)
			node = node->left;
		else
			node = node->right;
	}
}
Exemple #2
0
WHook *mainloop_unregister_hook(const char *name, WHook *hk)
{
    bool found=FALSE;
    Rb_node node;

    if(named_hooks==NULL)
        return NULL;
    
    if(hk==NULL){
        assert(name!=NULL);
        node=rb_find_key_n(named_hooks, name, &found);
    }else{
        rb_traverse(node, named_hooks){
            if((WHook*)rb_val(node)==hk){
                found=TRUE;
                break;
            }
        }
    }

    if(found){
        hk=(WHook*)rb_val(node);
        free((char*)node->k.key);
        rb_delete_node(node);
    }
    
    return hk;
}
Exemple #3
0
static WPHolder *do_remove_node(Rb_node node)
{
    WPHolder *ph=(WPHolder*)node->v.val;

    rb_delete_node(node);

    return ph;
}
Exemple #4
0
void rb_free_tree(Rb_node n)
{
  if (!ishead(n)) {
    fprintf(stderr, "ERROR: Rb_free_tree called on a non-head node\n");
    exit(1);
  }
 
  while(rb_first(n) != rb_nil(n)) {
    rb_delete_node(rb_first(n));
  }
  free(n);
}
Exemple #5
0
void stacking_unassoc(WStacking *st)
{
    Rb_node node=NULL;
    int found=0;
    
    if(st->reg==NULL)
        return;
    
    if(stacking_of_reg!=NULL)
        node=rb_find_pkey_n(stacking_of_reg, st->reg, &found);
    
    if(node!=NULL)
        rb_delete_node(node);
    
    st->reg=NULL;
}
Exemple #6
0
void stringstore_free(StringId id)
{
    Rb_node node=(Rb_node)id;
    
    if(node==NULL)
        return;
    
    if(node->v.ival<=0){
        warn("Stringstore reference count corrupted.");
        return;
    }
    
    node->v.ival--;
    
    if(node->v.ival==0){
        char *s=(char*)(node->k.key);
        rb_delete_node(node);
        free(s);
    }
}
Exemple #7
0
/*
 * Return data on left most node and delete
 * that node
 */
extern void *
rb_leftmost(RBTree *rb)
{
	RBNode	   *node = rb->root;
	RBNode	   *leftmost = rb->root;
	void	   *res = NULL;

	while (node != RBNIL)
	{
		leftmost = node;
		node = node->left;
	}

	if (leftmost != RBNIL)
	{
		res = leftmost->data;
		leftmost->data = NULL;
		rb_delete_node(rb, leftmost);
	}

	return res;
}
Exemple #8
0
/*
 * rb_delete: remove the given tree entry
 *
 * "node" must have previously been found via rb_find or rb_leftmost.
 * It is caller's responsibility to free any subsidiary data attached
 * to the node before calling rb_delete.  (Do *not* try to push that
 * responsibility off to the freefunc, as some other physical node
 * may be the one actually freed!)
 */
void
rb_delete(RBTree *rb, RBNode *node)
{
	rb_delete_node(rb, node);
}