Example #1
0
Expr* Expr::remove() {
  if (list) {
    if (next)
      next->prev = prev;
    else
      list->tail = prev;

    if (prev)
      prev->next = next;
    else
      list->head = next;

    list->length--;

    next = NULL;
    prev = NULL;
    list = NULL;
  } else {
    callReplaceChild(this, NULL);
  }

  if (parentSymbol) {
    remove_help(this, 'r');
  } else {
    trace_remove(this, 'R');
  }

  return this;
}
Example #2
0
void save_help_olc(HELP_OLC *data) {
  // first, remove our old helpfile from disc
  LIST    *kwds = parse_keywords(data->old_keywords);
  char *primary = listGet(kwds, 0);
  if(primary && *primary)
    remove_help(primary);
  deleteListWith(kwds, free);

  // now, add our new one
  add_help(data->keywords, bufferString(data->info), data->user_groups,
	   data->related, TRUE);
}
Example #3
0
File: hehe.C Project: cook-/Ve281
Val* Tree<Key,Val>::remove(Key key)
{
	Node<Key,Val>* node=root;//change *root but not root
	int find=0;
	Val* returnval=NULL;
	while (find==0)
	{
		if (!node) return NULL;
		if (*(node->lkey)==key) 
		{
			find=1;
			returnval=node->lval;
		}
		else if ((node->rkey!=NULL)&&(*(node->rkey)==key)) 
		{
			find=2;
			returnval=node->rval;
		}else 
		{
			if (IsThreeNode(node)) 
			{
				if (key<*(node->lkey)) node=node->left;
				else if (key>*(node->rkey)) node=node->right;
				else node=node->center;
			}else {
				if (key<*(node->lkey)) node=node->left;
				else node=node->center;
			}
		}
	}
	Val val=*returnval;
	bool a=remove_help(root,key,val);
	if (a) {
		Node<Key,Val>* n=root;
		root=root->left;
		n->left=NULL;
		delete n;
	}
	return returnval;
}
Example #4
0
void Expr::replace(Expr* new_ast) {
  if (new_ast->parentSymbol || new_ast->parentExpr)
    INT_FATAL(new_ast, "Argument is already in AST in Expr::replace");
  if (new_ast->list)
    INT_FATAL(new_ast, "Argument is in a list in Expr::replace");
  if (list) {
    new_ast->next = next;
    new_ast->prev = prev;
    new_ast->list = list;
    if (next)
      next->prev = new_ast;
    else
      list->tail = new_ast;
    if (prev)
      prev->next = new_ast;
    else
      list->head = new_ast;
    next = NULL;
    prev = NULL;
    list = NULL;
  } else {
    callReplaceChild(this, new_ast);
  }

  Symbol* myParentSymbol = parentSymbol;
  Expr* myParentExpr = parentExpr;
  remove_help(this, 'p');
  insert_help(new_ast, myParentExpr, myParentSymbol);

  // Update the _this field in a FnSymbol if necessary.
  if (DefExpr* def = toDefExpr(this))
    if (ArgSymbol* arg = toArgSymbol(def->sym))
      if (FnSymbol* fn = toFnSymbol(myParentSymbol))
        if (fn->_this == arg)
          fn->_this = toDefExpr(new_ast)->sym;
}
Example #5
0
File: hehe.C Project: cook-/Ve281
static bool remove_help(Node<Key,Val>* node, Key &key, Val &val)
{
	if (node->left!=NULL) //interior node
	{
		if (key<*(node->lkey)) //left
		{
			bool a=remove_help(node->left, key,val);
			if (a) //become 1-node at left
			{
                		return fix_left(node);
			}
		}
		else if (key==*(node->lkey)) //lkey
		{
			Key* succ_key;
			Val* succ_val;
			bool b=inordersuccessor_and_delete(node->center, succ_key, succ_val);
			node->lkey=succ_key;
			node->lval=succ_val;
			if (b) //become 1-node at center
			{
				if (fixinorder(node->center)) 
				{
					return fix_center(node);
                		}
			}
		}
		//others situation:rkey,center,right at 3-node
		else if (node->rkey!=NULL) //3-node
		{
			if (key<*(node->rkey)) //center at 3-node
			{
				bool a=remove_help(node->center, key,val);
				if (a) //become 1-node at center
				{
                			return fix_center(node);
				}
           		}
			else if (key > *(node->rkey)) //right at 3-node
			{
				bool a=remove_help(node->right, key,val);
				if (a) //become 1-node at right
				{
					fix_right(node);
					return false;
				}
			}
            		else //rkey of 3-node
			{
                		Key* succ_key;
				Val* succ_val;
				bool b=inordersuccessor_and_delete(node->right, succ_key, succ_val);
				node->rkey=succ_key;
				node->rval=succ_val;
                		if (b) 
				{
                    			if (fixinorder(node->right)) 
					{
                        			fix_right(node);
                        			return false;
					}
				}
			}
		}

		//2-node, must be center
		else {
			bool a=remove_help(node->center, key, val);
			if (a)
			{
				return fix_center(node);
			}
		}
	}

	//leaf node
	else 
	{
		if (key==*(node->lkey)) //lkey of 2-node or 3-node
		{
			node->lkey=node->rkey;
			node->lval=node->rval;
			node->rkey=NULL;
			node->rval=NULL;
			node->right=NULL;
            		return (node->lkey==NULL);
		}
        	else if ((node->rkey!=NULL)&&(*(node->rkey)==key))//rkey of 3-node
		{
            		node->rkey=NULL;
			node->rval=NULL;
		}
	}

	return false;
}