void rb_destroy(struct rb_root* root, void (*del_func)(struct rb_node*)) { struct rb_node* node = root->node; if (!del_func) del_func = rb_null_del; while (node) { if (node->left) node = node->left; else if (node->right) node = node->right; else { struct rb_node* tmp = node; node = rb_parent(node); if (node) { if (tmp == node->left) node->left = NULL; else node->right = NULL; } del_func(tmp); } } root->node = NULL; }
int db_avs_diff(const struct bu_attribute_value_set *left_set, const struct bu_attribute_value_set *right_set, const struct bn_tol *diff_tol, int (*add_func)(const char *attr_name, const char *attr_val, void *data), int (*del_func)(const char *attr_name, const char *attr_val, void *data), int (*chgd_func)(const char *attr_name, const char *attr_val_left, const char *attr_val_right, void *data), int (*unchgd_func)(const char *attr_name, const char *attr_val, void *data), void *client_data) { int state = DIFF_EMPTY; struct bu_attribute_value_pair *avp; for (BU_AVS_FOR(avp, left_set)) { const char *val2 = bu_avs_get(right_set, avp->name); if (!val2) { if (del_func) {state |= del_func(avp->name, avp->value, client_data);} } else { if (avpp_val_compare(avp->value, val2, diff_tol)) { if (unchgd_func) {state |= unchgd_func(avp->name, avp->value, client_data);} } else { if (chgd_func) {state |= chgd_func(avp->name, avp->value, val2, client_data);} } } } for (BU_AVS_FOR(avp, right_set)) { const char *val1 = bu_avs_get(left_set, avp->name); if (!val1) { if (add_func) {state |= add_func(avp->name, avp->value, client_data);} } } return state; }
void delete_evwr_list(track_ctx_t *trackctx, PyObject *pylist) { Py_ssize_t list_len; Py_ssize_t idx; midiseq_evwrObject *evwrobj = NULL; void (*del_func)(track_ctx_t *, ev_iterator_t *); if (trackctx->engine && engine_is_running(trackctx->engine) == TRUE) del_func = trackctx_event2trash; else del_func = trackctx_del_event; for (list_len = PyList_GET_SIZE(pylist), idx = 0; idx < list_len; idx++) { evwrobj = (midiseq_evwrObject *) PyList_GetItem(pylist, idx); del_func(trackctx, &(evwrobj->evit)); } }
int ConnectBrokenFunctionChunk(ea_t address) { int connected_links_count=0; func_t *func=get_func(address); char function_name[1024]={0,}; get_func_name(address,function_name,sizeof(function_name)); bool is_function=false; bool AddFunctionAsMemberOfFunction=false; ea_t cref=get_first_cref_to(address); while(cref!=BADADDR) { func_t *cref_func=get_func(cref); if(cref_func!=func) { char op_buffer[40]={0,}; ua_mnem(cref,op_buffer,sizeof(op_buffer)); if(cmd.itype==NN_call || cmd.itype==NN_callfi || cmd.itype==NN_callni) { is_function=true; break; } } cref=get_next_cref_to(address,cref); } if(!is_function) { if(func) del_func(address); cref=get_first_cref_to(address); while(cref!=BADADDR) { func_t *cref_func=get_func(cref); if(cref_func) { char cref_function_name[1024]; get_func_name(cref,cref_function_name,sizeof(cref_function_name)); msg("Adding Location %s(%x) To Function Member Of %s(%x:%x)\n",function_name,address,cref_function_name,cref_func->startEA,cref); append_func_tail(cref_func,address,GetBlockEnd(address)); connected_links_count++; } cref=get_next_cref_to(address,cref); } }else if(AddFunctionAsMemberOfFunction) { cref=get_first_cref_to(address); while(cref!=BADADDR) { char op_buffer[40]={0,}; ua_mnem(cref,op_buffer,sizeof(op_buffer)); if(!(cmd.itype==NN_call || cmd.itype==NN_callfi || cmd.itype==NN_callni)) { func_t *cref_func=get_func(cref); if(cref_func) { char cref_function_name[1024]; get_func_name(cref,cref_function_name,sizeof(cref_function_name)); msg("Adding Function %s(%x) To Function Member Of %s(%x:%x)\n",function_name,address,cref_function_name,cref_func->startEA,cref); append_func_tail(cref_func,address,GetBlockEnd(address)); connected_links_count++; } } cref=get_next_cref_to(address,cref); } } return connected_links_count; }
void mem_stree_clean(mem_stree_t *tree, void (*del_func)(void*)) { ONS_ASSERT(tree != NULL); if(del_func) while(tree->count) del_func(mem_stree_del(tree, tree->root->key, tree->root->klen)); else while(tree->count) mem_stree_del(tree, tree->root->key, tree->root->klen); }