Esempio n. 1
0
bool FilterWithBufferedInput::IsolatedFlush(bool hardFlush, bool blocking)
{
	if (!blocking)
		throw BlockingInputOnly("FilterWithBufferedInput");

	if (hardFlush)
		ForceNextPut();
	FlushDerived();

	return false;
}
Esempio n. 2
0
void Parser::ProcessNextToken(int token, const char *text)
{
    //printf("           * Loop %s [%s]\n", get_token_name(ID_FROM_TOKEN(token)), text);

    switch(token)
    {
    case T_LEFTBRACE:
        {
            mBraceDepth++;
            FlushDerived();
            ClearFlag(FLAG_UNOPENED);
            break;
        }

    case T_COMMA:
        {
            FlushDerived();
            break;
        }

    case T_COLON_COLON:
        {
            SetFlag(FLAG_COLON_COLON);
            break;
        }

    case T_FRIEND:
        {
            SetFlag(FLAG_FRIEND);
            break;
        }

    case T_ENUM:
        {
            SetFlag(FLAG_ENUM|FLAG_UNOPENED);
            break;
        }

    case T_MM_IGNORE_START:
        {
            mIgnore = 1;
            break;
        }

    case T_MM_IGNORE_END:
        {
            mIgnore = 0;
            break;
        }

    case T_RIGHTBRACE:
        {
            mBraceDepth--;
            if(!IsSet(FLAG_ENUM))
            {
                PopScope();
                ProcessStatement();
            }
            break;
        }

    case T_CLASS:
    case T_STRUCT:
    case T_NAMESPACE:
        {
            Scope *pScope      = new Scope;
            pScope->braceDepth = mBraceDepth;
            pScope->isClass    = (token != T_NAMESPACE);
            pScope->mpName     = NULL;
            pScope->isExposed  = IsSet(FLAG_NEXT_IS_EXPOSED);
            mScopes.push_back(pScope);
            SetFlag(pScope->isClass ? FLAG_CLASS|FLAG_UNOPENED : FLAG_NAMESPACE);
            ClearFlag(FLAG_NEXT_IS_EXPOSED);
            break;
        }

    case T_BOOL:
    case T_CHAR:
    case T_DOUBLE:
    case T_FLOAT:
    case T_INT:
    case T_LONG:
    case T_SHORT:
    case T_VOID:
    case T_WCHART:
        {
            Identifier *pIdentifier = new Identifier;
            pIdentifier->mpName = strdup(text);
            pIdentifier->isKeyword = true;
            if(IsSet(FLAG_NEXT_IS_CONST))
            {
                pIdentifier->isConst = true;
                ClearFlag(FLAG_NEXT_IS_CONST);
            }
            mIdentifiers.push_back(pIdentifier);
            break;
        }

    case T_IDENTIFIER:
        {
            if(IsSet(FLAG_NAMESPACE|FLAG_CLASS))
            {
                int size = mScopes.size();
                if(size > 0)
                {
                    Scope *pScope = mScopes[size-1];
                    pScope->mpName = strdup(text);
                    if(IsSet(FLAG_CLASS))
                    {
                        if(IsExposed())
                        {
                            mpGenerator->AddClass(text); //(GetFullScopeName());
                        }
                    }
                    ClearFlag(FLAG_NAMESPACE|FLAG_CLASS);
                }
            }
            else if(IsExposed())
            {
                if(!IsSet(FLAG_PAREN))
                {
                    if(IsSet(FLAG_COLON_COLON))
                    {
                        int size = mIdentifiers.size();
                        if(size > 0)
                        {
                            Identifier *pIdentifier = mIdentifiers[size-1];
                            char temp[2048];
                            sprintf(temp, "%s::%s", pIdentifier->mpName, text);
                            free(pIdentifier->mpName);
                            pIdentifier->mpName = strdup(temp);
                        }
                        ClearFlag(FLAG_COLON_COLON);
                    }
                    else
                    {
                        Identifier *pIdentifier = new Identifier;
                        pIdentifier->mpName = strdup(text);
                        pIdentifier->isBracketed = IsSet(FLAG_BRACKET);
                        if(IsSet(FLAG_NEXT_IS_CONST))
                        {
                            pIdentifier->isConst = true;
                            ClearFlag(FLAG_NEXT_IS_CONST);
                        }
                        mIdentifiers.push_back(pIdentifier);
                    }
                }
            }
            break;
        }

    case T_STAR:
        {
            int size = mIdentifiers.size();
            if(size > 0)
            {
                Identifier *pIdentifier = mIdentifiers[size-1];
                pIdentifier->starCount++;
            }
            break;
        }

    case T_LEFTPAREN:
        {
            SetFlag(FLAG_PAREN);
            break;
        }

    case T_MM_EXPOSE:
    case T_MM_EXPOSED:
        {
            SetFlag(FLAG_NEXT_IS_EXPOSED);
            break;
        }

    case T_LESS:
        {
            mBracketCount++;
            SetFlag(FLAG_BRACKET);
            break;
        }

    case T_GREATER:
        {
            mBracketCount--;
            if(mBracketCount == 0)
            {
                ClearFlag(FLAG_BRACKET);
            }
            break;
        }

    case T_CONST:
        {
            int size = mIdentifiers.size();
            if(size > 0)
            {
                Identifier *pIdentifier = mIdentifiers[size-1];
                pIdentifier->isConst = true;
            }
            else
            {
                SetFlag(FLAG_NEXT_IS_CONST);
            }
            break;
        }

    case T_SEMICOLON:
        {
            if(IsSet(FLAG_ENUM))
            {
                for(unsigned int i=0; i<mIdentifiers.size(); i++)
                {
                    Identifier *pIdentifier = mIdentifiers[i];
                    mpGenerator->AddEnum(pIdentifier->mpName, GetFullScopeName());
                }

                mIdentifiers.clear();
                ClearFlag(FLAG_ENUM|FLAG_PAREN);
            }
            else
            {
                ProcessStatement();
            }
            break;
        }
    }
}