template<typename T, typename KEY> void RBTree<T, KEY>::setnull(RBTNode<T, KEY> *h)
{
    if (h == NULL)
    {
        return;
    }
    setnull(h->pLeft);
    setnull(h->pRight);
    {
        //std::cout << "delete " << h->key << std::endl;
        delete h;
        h = NULL;
    }
}
Exemple #2
0
void main(){
	stack* s = setnull();
	testpush(s);
	print(s);
	testpop(s);
	print(s);
}
    /** parse tokens */
    const Token *parse(const Token &tok, std::list<ExecutionPath *> &checks) const
    {
        if (Token::Match(tok.previous(), "[;{}] const| struct| %type% * %var% ;"))
        {
            const Token * vartok = tok.tokAt(2);

            if (tok.str() == "const")
                vartok = vartok->next();

            if (tok.str() == "struct")
                vartok = vartok->next();

            if (vartok->varId() != 0)
                checks.push_back(new Nullpointer(owner, vartok->varId(), vartok->str()));
            return vartok->next();
        }

        // Template pointer variable..
        if (Token::Match(tok.previous(), "[;{}] %type% ::|<"))
        {
            const Token * vartok = &tok;
            while (Token::Match(vartok, "%type% ::"))
                vartok = vartok->tokAt(2);
            if (Token::Match(vartok, "%type% < %type%"))
            {
                vartok = vartok->tokAt(3);
                while (vartok && (vartok->str() == "*" || vartok->isName()))
                    vartok = vartok->next();
            }
            if (vartok
                && (vartok->str() == ">" || vartok->isName())
                && Token::Match(vartok->next(), "* %var% ;|="))
            {
                vartok = vartok->tokAt(2);
                checks.push_back(new Nullpointer(owner, vartok->varId(), vartok->str()));
                if (Token::simpleMatch(vartok->next(), "= 0 ;"))
                    setnull(checks, vartok->varId());
                return vartok->next();
            }
        }

        if (Token::simpleMatch(&tok, "try {"))
        {
            // Bail out all used variables
            unsigned int indentlevel = 0;
            for (const Token *tok2 = &tok; tok2; tok2 = tok2->next())
            {
                if (tok2->str() == "{")
                    ++indentlevel;
                else if (tok2->str() == "}")
                {
                    if (indentlevel == 0)
                        break;
                    if (indentlevel == 1 && !Token::simpleMatch(tok2,"} catch ("))
                        return tok2;
                    --indentlevel;
                }
                else if (tok2->varId())
                    bailOutVar(checks,tok2->varId());
            }
        }

        if (Token::Match(&tok, "%var% ("))
        {
            if (tok.str() == "sizeof")
                return tok.next()->link();

            // parse usage..
            std::list<const Token *> var;
            CheckNullPointer::parseFunctionCall(tok, var, 0);
            for (std::list<const Token *>::const_iterator it = var.begin(); it != var.end(); ++it)
                dereference(checks, *it);
        }

        else if (Token::simpleMatch(&tok, "( 0 &&"))
            return tok.link();

        if (tok.varId() != 0)
        {
            // unknown : not really used. it is passed to isPointerDeRef.
            //           if isPointerDeRef fails to determine if there
            //           is a dereference the this will be set to true.
            bool unknown = false;

            if (Token::Match(tok.previous(), "[;{}=] %var% = 0 ;"))
                setnull(checks, tok.varId());
            else if (CheckNullPointer::isPointerDeRef(&tok, unknown))
                dereference(checks, &tok);
            else
                // TODO: Report debug warning that it's unknown if a
                // pointer is dereferenced
                bailOutVar(checks, tok.varId());
        }

        else if (tok.str() == "delete")
        {
            const Token *ret = tok.next();
            if (Token::simpleMatch(ret, "[ ]"))
                ret = ret->tokAt(2);
            if (Token::Match(ret, "%var% ;"))
                return ret->next();
        }

        return &tok;
    }
template<typename T, typename KEY> RBTree<T, KEY>::~RBTree()
{
    setnull(pRoot);
}
Exemple #5
0
int txn60008Process()
{
	int iRet,nRet;
	char sCount      [32 + 1];
	char sSqlCmd     [1024  ];

	setnull(sCount);
	setnull(sSqlCmd);

	nRet = dbsExecuteV("select count(1) from TG_PLATFORMINFO where platformid = :sPid",
						f_sPlatformId,sCount);
	if(nRet < 0)
	{
		logMsg(LOG_ERR,"查询数据库失败[%d][%s]",dbsSqlCode(),dbsErrStr());
		return -1;
	}
	if(atoi(sCount) == 0 && (memcmp(f_sChgType,"01",2) == 0 || memcmp(f_sChgType,"02",2) == 0))
	{
		logMsg(LOG_ERR,"平台不存在");
		strcat(f_sError,"E0000006");
		return -1;
	}
	if(atoi(sCount) == 1 && memcmp(f_sChgType,"00",2) == 0)
	{
		logMsg(LOG_ERR,"平台已存在,不可新建");
		strcat(f_sError,"E0000015");
		return -1;
	}

	setnull(sSqlCmd);
	switch(atoi(f_sChgType))
	{
		case 0:
			sprintf(sSqlCmd,"insert into  TG_PLATFORMINFO (platformid,PLATFORMTYPE,PLATFORMNAME,remark,status,createdate)"
							"VALUES('%s','00','%s','%s','00',to_char(sysdate,'YYYYMMDD'))",
							f_sPlatformId,f_sPlatformName,f_sRemarks);
			break;
		case 1:
			sprintf(sSqlCmd,"update TG_PLATFORMINFO set PLATFORMNAME = '%s',remark = '%s' where "
							"platformid = '%s'",
							f_sPlatformName,f_sRemarks,f_sPlatformId);
			break;
		case 2:
			sprintf(sSqlCmd,"update TG_PLATFORMINFO set status = '02' where "
							"platformid = '%s'",
							f_sPlatformId);
		default:
			logMsg(LOG_ERR,"错误的修改类型[%s]",f_sChgType);
			return -1;
	}

	nRet = dbsExecuteV(sSqlCmd);
	if(nRet < 0)
	{
		logMsg(LOG_ERR,"数据库操作失败[%s][%s][%d]",sSqlCmd,dbsErrStr(),dbsSqlCode());
		return -1;
	}

	if(atoi(f_sChgType) == 0)
	{
		setnull(sSqlCmd);
		sprintf(sSqlCmd,"insert into TG_PLATACCINFO "
						"VALUES ('%s',0,0,0,0,0,0,0,0,0,rtrim(fn_getmd5(0)),0,rtrim(fn_getmd5(0)))",
						f_sPlatformId);
		nRet = dbsExecuteV(sSqlCmd);
		if(nRet < 0)
		{
			logMsg(LOG_ERR,"插入数据库失败[%s][%s][%d]",sSqlCmd,dbsErrStr(),dbsSqlCode());
			return -1;
		}
	}


	return 0;
}
Exemple #6
0
int txn60008Initial(char *pData,T_HEAD t_Head)
{
	T_TXN60008 *t_txn = (T_TXN60008 *) pData;

	setnull(f_sPlatformId  );
	setnull(f_sChgType     );
	setnull(f_sPlatformName);
	setnull(f_sRemarks     );
	setnull(f_sTxnDate     );
	setnull(f_sTxnTime     );
	setnull(f_sTxnId       );
	setnull(f_sRtCode      );
	setnull(f_sChannelCode );
	setnull(f_sTermCode    );
	setnull(f_sDrct        );
	setnull(f_sError       );

	memcpy(f_sPlatformId  ,t_txn->sPlatformId  ,sizeof(f_sPlatformId  ));
	memcpy(f_sChgType     ,t_txn->sChgType     ,sizeof(f_sChgType     ));
	memcpy(f_sPlatformName,t_txn->sPlatformName,sizeof(f_sPlatformName));
	memcpy(f_sRemarks     ,t_txn->sRemarks     ,sizeof(f_sRemarks     ));
	memcpy(f_sTxnDate     ,t_Head.sTxnDate     ,sizeof(f_sTxnDate     ));
	memcpy(f_sTxnTime     ,t_Head.sTxnTime     ,sizeof(f_sTxnTime     ));
	memcpy(f_sTxnId       ,t_Head.sTxnId       ,sizeof(f_sTxnId       ));
	memcpy(f_sRtCode      ,t_Head.sRtCode      ,sizeof(f_sRtCode      ));
	memcpy(f_sChannelCode ,t_Head.sChannelCode ,sizeof(f_sChannelCode ));
	memcpy(f_sTermCode    ,t_Head.sTermCode    ,sizeof(f_sTermCode    ));
	memcpy(f_sDrct        ,t_Head.sDrct        ,sizeof(f_sDrct        ));

	logMsg(LOG_BUG,"PLATNAME[%s]",f_sPlatformName);
	logMsg(LOG_BUG,"CHANNELCODE[%s]",f_sChannelCode);

	return 0;
}
Exemple #7
0
int main()
{
   char expression[30],*p;
   sqstack *operator, *operand;
   int sum, flag = 0;
   int op1, op2;

   operator = (sqstack *)malloc(sizeof(sqstack));
   setnull(operator);
   operand = (sqstack *)malloc(sizeof(sqstack));
   setnull(operand);

   gets(expression);
   p = expression;

   while ( *p )
   {
      if ( (*p >= '0') && (*p <= '9') ) 
      {  
         p++;
         continue;
      }
      switch ( *p )
      {
         case '+' :
         case '-' :
         case '*' :
         case '/' :
         case ' ' :
         case '(' :
         case ')' :  
                   break;
         default  :
                   printf("Wrong Character %c in expression!\n", *p);
                   return -1;
      }
      p++;
   }

   p = expression;
   while ( *p )
   {
      if ( (*p >= '0') && (*p <= '9') )
      {
         if ( flag )
         {
            sum = 10*sum + (*p - '0');
         }
         else
         {
            sum = *p - '0';
            flag = 1;
         }
         p++;
         continue;
      }
     
      if ( flag )
      {
         printf("push data %d\n", sum);
         push_stack(operand, sum);
         flag = 0;
      }

      if ( *p == ' ' )
      {
         p++;
         continue;
      }      

      if ( empty_stack( operator ) )
      {
         printf("push %c\n", *p);
         push_stack(operator, (int)*p);
         p++;
         continue;
      }
      
      if ( *p == ')' )
      {
         printf("*** Wow, we meet ) ***\n");
         deal_bracket(operator, operand);
         p++;
         continue;
      }

      if ( (convert_operator(*p) > convert_operator((char)top_stack(operator))) || ((char)top_stack(operator) == '(') )
      {
         printf("push %c\n", *p);
         push_stack(operator, (int)*p);
      }
      else
      {
         deal_tmp(operator, operand, *p);
      }
      p++;
   }
   if ( flag )  push_stack(operand, sum);
 
   while ( !empty_stack(operator) )
   {
      op2 = pop_stack(operand);
      op1 = pop_stack(operand);
       
      switch ( (char)pop_stack(operator) )
      {
         case '+' :
                   printf("push data: %d + %d\n", op1, op2);
                   push_stack(operand, op1 + op2);
                   break;
         case '-' :
                   printf("push data: %d - %d\n", op1, op2);
                   push_stack(operand, op1 - op2);
         case '*' :
                   printf("push data: %d * %d\n", op1, op2);
                   push_stack(operand, op1 * op2);
                   break;
         case '/' :
                   printf("push data: %d / %d\n", op1, op2);         
                   push_stack(operand, op1 / op2);
                   break;
      }
   }   
        
   printf("%d\n", pop_stack(operand));

   return 0;
}
	/** parse tokens */
	const Token *parse(const Token &tok, std::list<ExecutionPath *> &checks) const {
		if (tok.varId() != 0) {
			// Pointer declaration declaration?
			if(symbolDatabase)
			{
				const Variable* var = symbolDatabase->getVariableFromVarId(tok.varId());
				if (var && var->isPointer() && var->nameToken() == &tok)
					checks.push_back(new Nullpointer(owner, var->varId(), var->name(), symbolDatabase));
			}
		}

        if (Token::simpleMatch(&tok, "try {")) {
            // Bail out all used variables
            const Token* tok2 = &tok;
            const Token* endtok = tok.linkAt(1);
            for (; tok2 && tok2 != endtok; tok2 = tok2->next()) {
                if (tok2->varId())
                    bailOutVar(checks,tok2->varId());
            }
            return tok2;
        }

        if (Token::Match(&tok, "%var% (")) {
            if (tok.str() == "sizeof" || tok.str() == "typeid")
                return tok.next()->link();

            // parse usage..
            std::list<const Token *> var;
            CheckNullPointer::parseFunctionCall(tok, var, 0);
            for (std::list<const Token *>::const_iterator it = var.begin(); it != var.end(); ++it)
                dereference(checks, *it);
        }

        else if (Token::simpleMatch(&tok, "( 0 &&"))
            return tok.link();

        if (tok.varId() != 0) {
            // unknown: if isPointerDeRef fails to determine if there
            //          is a dereference this will be set to true.
            bool unknown = owner->inconclusiveFlag();
            bool deref = CheckNullPointer::isPointerDeRef(&tok, unknown, symbolDatabase);

            if (deref)
                dereference(checks, &tok);
            else if (unknown && owner->inconclusiveFlag())
                dereference(checks, &tok);
            if (Token::Match(tok.previous(), "[;{}=] %var% = 0 ;"))
                setnull(checks, tok.varId());
            else if (!deref &&
                     (!tok.previous()->isOp() || tok.previous()->str() == "&") && !tok.previous()->isAssignmentOp() &&
                     (!tok.next()->isOp() || tok.next()->str() == ">>"))
                bailOutVar(checks, tok.varId()); // If its possible that the pointers value changes, bail out.
        }

        else if (tok.str() == "delete") {
            const Token *ret = tok.next();
            if (Token::simpleMatch(ret, "[ ]"))
                ret = ret->tokAt(2);
            if (Token::Match(ret, "%var% ;"))
                return ret->next();
        }

        else if (tok.str() == "return") {
            bool unknown = owner->inconclusiveFlag();
            const Token* tok2 = &tok;
            for (; tok2 && tok2->str() != ";"; tok2 = tok2->next()) {
                if (tok2->varId()) {
                    if (CheckNullPointer::isPointerDeRef(tok2, unknown, symbolDatabase) || unknown)
                        dereference(checks, tok2);
                }

                // If return statement contains "?" then assume there
                // is no dangours dereferencing later
                if (tok2->str() == "?") {
                    while (tok2 && tok2->str() != ";")
                        tok2 = tok2->next();
                    return tok2;
                }
            }
        }

        return &tok;
    }