//--------------------------------------------------------------------------- #include "CommonCheck.h" #include "tokenize.h" #include #include #include #include //--------------------------------------------------------------------------- bool HasErrors; bool OnlyReportUniqueErrors; std::ostringstream errout; //--------------------------------------------------------------------------- std::string FileLine(const TOKEN *tok) { std::ostringstream ostr; ostr << "[" << Files[tok->FileIndex] << ":" << tok->linenr << "]"; return ostr.str(); } //--------------------------------------------------------------------------- std::list ErrorList; void ReportErr(const std::string &errmsg) { if ( OnlyReportUniqueErrors ) { if ( std::find( ErrorList.begin(), ErrorList.end(), errmsg ) != ErrorList.end() ) return; ErrorList.push_back( errmsg ); } errout << errmsg << std::endl; HasErrors = true; } //--------------------------------------------------------------------------- bool IsName(const char str[]) { return (str[0]=='_' || std::isalpha(str[0])); } //--------------------------------------------------------------------------- bool IsNumber(const char str[]) { return std::isdigit(str[0]); } //--------------------------------------------------------------------------- bool IsStandardType(const char str[]) { if (!str) return false; bool Ret = false; const char *type[] = {"bool","char","short","int","long","float","double",0}; for (int i = 0; type[i]; i++) Ret |= (strcmp(str,type[i])==0); return Ret; } //--------------------------------------------------------------------------- bool setindentlevel( const TOKEN *tok, int &indentlevel, int endlevel ) { if ( tok->str[0] == '{' ) indentlevel++; else if ( tok->str[0] == '}' ) indentlevel--; return bool(tok->str[0]=='}' && indentlevel<=endlevel); } //--------------------------------------------------------------------------- void GotoNextStatement( const TOKEN **tok ) { // Goto end of statement.. while ( *tok && ! strchr("{};", (*tok)->str[0]) ) *tok = (*tok)->next; // Goto next statement if ( *tok ) *tok = (*tok)->next; } //--------------------------------------------------------------------------- void FindMatchingTokenInScope( const TOKEN **tok, const char pattern[], int &indentlevel ) { while ( *tok ) { if ( setindentlevel( *tok, indentlevel, -1 ) ) *tok = NULL; else if ( match( *tok, pattern ) ) return; else *tok = (*tok)->next; } } //---------------------------------------------------------------------------