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; } }
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; }
static WPHolder *do_remove_node(Rb_node node) { WPHolder *ph=(WPHolder*)node->v.val; rb_delete_node(node); return ph; }
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); }
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; }
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); } }
/* * 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; }
/* * 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); }