Example #1
0
static PKEY_CONTEXT EnumContext(
	PKEY_CONTEXT pCurrent
	)
{
	PKEY_CONTEXT Ctx;
	if (!HandleEnum(g_KeyStoreTable, 0, pCurrent, &Ctx))
		Ctx = NULL;
	return(Ctx);
}
void ParserThread::DoParse()
{

    while (true)
    {
        Token* tk = PeekToken();

        switch (tk->type_id())
        {
        case TKN_L_BRACE: //{
        {
            SkipBrace();
            break;
        }
        case TKN_R_BRACE: //}
        {
            // the only time we get to find a } is when recursively called by e.g. HandleClass
            // we have to return now...
            TRACE("DoParse(): return from%s%d:%d",tk->get_string().c_str(),tk->line_number(),tk->column_number());
            ConsumeToken();
            return;
        }
        case TKN_R_PAREN: //)
        {
            TRACE("DoParse(): return from%s%d:%d",tk->get_string().c_str(),tk->line_number(),tk->column_number());
            ConsumeToken();
            if(m_Context.parseType==FunctionParameter
               && m_Context.typeQueue.size()>0
               && m_Context.nameQueue.size()>0)
            {
                DoAddToken(tkParameter, m_Context.nameQueue.back().name);
            }
            return;
        }
        case TKN_L_PAREN :       // (
        {
            SkipParentheses();
            break;
        }
        case TKN_FOR:
        case TKN_WHILE:
        case TKN_IF:
        case TKN_SWITCH:
        {
            TRACE("handling for or while block");
            HandleForWhile();
            break;
        }
        case TKN_ELSE:
        {
            ConsumeToken();
            if(PeekToken()->type_id()==TKN_IF)
            {
                ConsumeToken();
                HandleForWhile();
            }
            else
                SkipStatementBlock();
            break;
        }
        case TKN_CLASS:
        case TKN_STRUCT:
        {
            m_Context.EndStatement();
            if (m_Options.handleClasses)
                HandleClass(ctClass);
            else
                SkipStatementBlock();
            break;
        }

        case  TKN_EXPLICIT:
        case  TKN_CONST:
        case  TKN_FRIEND:
        case  TKN_VIRTUAL:
        case  TKN_VOLATILE:
        case  TKN_STATIC:
        case  TKN_INLINE:
        case  TKN_AUTO:
        case  TKN_REGISTER:
        case  TKN_MUTABLE:
        {
            ConsumeToken();
            //m_Context.typeQualifier = tk->type_id();
            break;
        }
        case TKN_IDENTIFIER:
        {
            ParseFullIdentifer();
            // we are interested in the following token.

            Token * peek = PeekToken();
            int peekID = peek-> type_id();
            switch (peekID)
            {
            case TKN_L_PAREN:      // This is a function definition or declration, because it has AAA BBB (

                if(m_Context.nameQueue.empty())   // AAA(
                {
                    //HandleMacro();
                    if(   m_Context.parentToken!= NULL
                       && m_Context.parentToken->m_SymbolKind == tkClass
                       && m_Context.parentToken->m_Name.get_text() == tk->get_text())
                        HandleFunction();
                    else
                    {
                        SkipParentheses();
                    }

                }
                else                            // AAA BBB(
                {
                    HandleFunction();
                }
                break;
            case  TKN_SEMICOLON:     // A B;
                if(m_Context.nameQueue.empty())   // AAA;
                {
                    SkipStatementBlock();
                }
                else                            // AAA BBB;
                {
                    // the last element of the m_Context.name is the actual variable name
                    cc_string variableName = m_Context.nameQueue.back().name.get_text();

                    // the last element of the m_Context.type is the actual type name
                    cc_string variableType = m_Context.typeQueue.back().name.get_text();

                    TRACE("Variable Find name(%s) type(%s)",variableName.c_str(),variableType.c_str());
                    //Add variable to tokenstree
                    if (m_Options.handleVars)
                        DoAddToken(tkVariable, m_Context.nameQueue.back().name);


                    ConsumeToken();    //consume the semicolon
                    m_Context.EndStatement();
                }
                break;
            case TKN_BITAND://&
                m_Context.typeQualifier.isReference = true;
                ConsumeToken();
                break;
            case TKN_MULT:  //*
                m_Context.typeQualifier.isPointer = true;
                ConsumeToken();
                break;
            case TKN_L_SQUARE:
            case TKN_PLUS:
            case TKN_PLUS_ASSIGN:
            case TKN_DOUBLE_PLUS:
            case TKN_MINUS:
            case TKN_DOUBLE_MINUS:
            case TKN_MINUS_ASSIGN:
            case TKN_MULT_ASSIGN:
            case TKN_DIV:
            case TKN_DIV_ASSIGN:
            case TKN_MODULO:
            case TKN_MODULO_ASSIGN:
            case TKN_L_SHIFT:
            case TKN_L_SHIFT_ASSIGN:
            case TKN_R_SHIFT:
            case TKN_R_SHIFT_ASSIGN:
            case TKN_DOT:
            case TKN_ARROW:
                ConsumeToken();
                SkipStatementBlock();
                break;

            case TKN_COMMA:
            case TKN_ASSIGN:
                // A B = ....;
                // A B,C,D=2;
                if(m_Context.nameQueue.empty())   // A,
                {
                    TRACE("Something wrong in mode A, ");
                    SkipStatementBlock();
                }
                else                            // A B,
                {
                    cc_string variableName = m_Context.nameQueue.back().name.get_text();
                    cc_string variableType = m_Context.typeQueue.back().name.get_text();
                    TRACE("Variable Find name(%s) type(%s)",variableName.c_str(),variableType.c_str());
                    //Add variable to tokenstree
                    if (m_Options.handleVars)
                    {
                        if(m_Context.parseType == FunctionParameter)
                            DoAddToken(tkParameter, m_Context.nameQueue.back().name);
                        else
                            DoAddToken(tkVariable, m_Context.nameQueue.back().name);
                    }

                    ConsumeToken();       //consume , or =

                    // tk is updated
                    if(peek->type_id()  == TKN_ASSIGN)
                    {
                        SkipStatementBlock();
                    }
                    else
                        m_Context.nameQueue.clear();  // clear name information, because we need to read another name

                }
                break;
            }
            break;
        }// End of handling of case TKN_IDENTIFIER
        case TKN_SEMICOLON:
        {
            ConsumeToken();
            m_Context.EndStatement();
            break;
        }
        case TKN_PUBLIC:
        {
            ConsumeToken();
            Token * peek = PeekToken();
            if(peek->type_id() == TKN_COLON)
            {
                m_Context.accessScope = tsPublic;
                m_Context.EndStatement();
                ConsumeToken();
            }
            break;
        }
        case TKN_PRIVATE:
        {
            ConsumeToken();
            Token * peek = PeekToken();
            if(peek->type_id() == TKN_COLON)
            {
                m_Context.accessScope = tsPrivate;
                m_Context.EndStatement();
                ConsumeToken();
            }
            break;
        }
        case TKN_PROTECT:
        {
            ConsumeToken();
            Token * peek = PeekToken();
            if(peek->type_id() == TKN_COLON)
            {
                m_Context.accessScope = tsProtected;
                m_Context.EndStatement();
                ConsumeToken();
            }
            break;
        }
        case TKN_USING:
        {
            ParseUsing();
            break;
        }
        case TKN_DELETE:
        case TKN_NEW:
        case TKN_RETURN:
        case TKN_EXTERN:
        case TKN_GOTO:
        {
            SkipStatementBlock();
            break;
        }
        case TKN_TEMPLATE:
        {
            bool readArgsOK = GetTemplateArgs();   // should following a <> pair,
            if(!readArgsOK)   //should return true, otherwise, we should
                SkipStatementBlock();
            break;
        }
        case TKN_ENUM:
        {
            if (m_Options.handleEnums)
                HandleEnum();
            else
                SkipStatementBlock();
            break;
        }
        case TKN_TYPEDEF:
        {
            if (m_Options.handleTypedefs)
                HandleTypedef();
            else
                SkipStatementBlock();
            m_Context.EndStatement();

            break;
        }
        case TKN_NAMESPACE:
        {
           HandleNamespace();
           break;
        }
        case TKN_OPERATOR:
        {
            ConsumeToken(); //eat the operator keyword
            Token *op = ConsumeToken();

            // eat the operator pair
            if(op->type_id()==TKN_L_PAREN || op->type_id()==TKN_L_SQUARE)
                ConsumeToken();

            ScopeBlock Operator;
            Operator.name = *op;
            m_Context.nameQueue.push_back(Operator);
            Token *peek = PeekToken();
            if(peek->type_id()==TKN_L_PAREN)
            {
                HandleFunction();
            }
            break;
        }
        default:
        {
            //cout<<"Skip unhandled"<<*tk<<endl;
            // As the tk is only a pointer to the Token buffer, so it may changed by
            // some function calling on ConsumeToken or PeekToken
            ConsumeToken();
            break;
        }
        }
    }

}