Eval_p EvalTreeExtractEntry(Eval_p *root, Eval_p key, int pos) { Eval_p x, cell; if (!(*root)) { return NULL; } *root = splay_tree(*root, key, pos); if(EvalCompare(key, (*root), pos)==0) { if (!(*root)->evals[pos].lson) { x = (*root)->evals[pos].rson; } else { x = splay_tree((*root)->evals[pos].lson, key, pos); x->evals[pos].rson = (*root)->evals[pos].rson; } cell = *root; cell->evals[pos].lson = cell->evals[pos].rson = NULL; *root = x; return cell; } return NULL; }
Eval_p EvalTreeInsert(Eval_p *root, Eval_p newnode, int pos) { long cmpres; if (!*root) { newnode->evals[pos].lson = newnode->evals[pos].rson = NULL; *root = newnode; return NULL; } *root = splay_tree(*root, newnode, pos); cmpres = EvalCompare(newnode, *root, pos); if (cmpres < 0) { newnode->evals[pos].lson = (*root)->evals[pos].lson; newnode->evals[pos].rson = *root; (*root)->evals[pos].lson = NULL; *root = newnode; return NULL; } else if(cmpres > 0) { newnode->evals[pos].rson = (*root)->evals[pos].rson; newnode->evals[pos].lson = *root; (*root)->evals[pos].rson = NULL; *root = newnode; return NULL; } return *root; }
/* return NULL if ok, else pointer on error description */ char * VerifySyntaxForEvalCompare(char * StringToVerify) { UnderVerify = TRUE; VerifyErrorDesc = NULL; EvalCompare(StringToVerify); UnderVerify = FALSE; return VerifyErrorDesc; }
Eval_p EvalTreeFind(Eval_p *root, Eval_p key, int pos) { if(*root) { *root = splay_tree(*root, key, pos); if(EvalCompare(*root, key, pos)==0) { return *root; } } return NULL; }
static Eval_p splay_tree(Eval_p tree, Eval_p splay, int pos) { Eval_p left, right, tmp, newnode; long cmpres; if (!tree) { return tree; } newnode = evals_alloc_raw(splay->eval_no); newnode->evals[pos].lson = NULL; newnode->evals[pos].rson = NULL; left = newnode; right = newnode; for (;;) { cmpres = EvalCompare(splay, tree, pos); if (cmpres < 0) { if(!tree->evals[pos].lson) { break; } if(EvalCompare(splay, tree->evals[pos].lson, pos) < 0) { tmp = tree->evals[pos].lson; tree->evals[pos].lson = tmp->evals[pos].rson; tmp->evals[pos].rson = tree; tree = tmp; if (!tree->evals[pos].lson) { break; } } right->evals[pos].lson = tree; right = tree; tree = tree->evals[pos].lson; } else if(cmpres > 0) { if (!tree->evals[pos].rson) { break; } if(EvalCompare(splay, tree->evals[pos].rson, pos) > 0) { tmp = tree->evals[pos].rson; tree->evals[pos].rson = tmp->evals[pos].lson; tmp->evals[pos].lson = tree; tree = tmp; if (!tree->evals[pos].rson) { break; } } left->evals[pos].rson = tree; left = tree; tree = tree->evals[pos].rson; } else { break; } } left->evals[pos].rson = tree->evals[pos].lson; right->evals[pos].lson = tree->evals[pos].rson; tree->evals[pos].lson = newnode->evals[pos].rson; tree->evals[pos].rson = newnode->evals[pos].lson; EvalsFree(newnode); return tree; }