bool FilterWithBufferedInput::IsolatedFlush(bool hardFlush, bool blocking) { if (!blocking) throw BlockingInputOnly("FilterWithBufferedInput"); if (hardFlush) ForceNextPut(); FlushDerived(); return false; }
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; } } }