diff --git a/cli/filelister.cpp b/cli/filelister.cpp index 826f795df..9268530b6 100644 --- a/cli/filelister.cpp +++ b/cli/filelister.cpp @@ -159,7 +159,7 @@ void FileLister::recursiveAddFiles(std::vector &filenames, std::map oss << cleanedPath; - if (MyIsDirectory(cleanedPath.c_str())) { + if (MyIsDirectory(cleanedPath)) { char c = cleanedPath[ cleanedPath.size()-1 ]; switch (c) { case '\\': @@ -175,8 +175,7 @@ void FileLister::recursiveAddFiles(std::vector &filenames, std::map bdir << cleanedPath << '\\'; } } else { - std::string::size_type pos; - pos = cleanedPath.find_last_of('\\'); + std::string::size_type pos = cleanedPath.find_last_of('\\'); if (std::string::npos != pos) { bdir << cleanedPath.substr(0, pos + 1); } @@ -202,7 +201,7 @@ void FileLister::recursiveAddFiles(std::vector &filenames, std::map #endif // defined(UNICODE) std::ostringstream fname; - fname << bdir.str().c_str() << ansiFfd; + fname << bdir.str() << ansiFfd; if ((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { // File @@ -236,10 +235,7 @@ bool FileLister::isDirectory(const std::string &path) bool FileLister::fileExists(const std::string &path) { - if (MyFileExists(path) == TRUE) - return true; - else - return false; + return (MyFileExists(path) == TRUE); } diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 5ebcf68f1..f555cd9e1 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -46,9 +46,8 @@ namespace { //--------------------------------------------------------------------------- -void CheckBufferOverrun::arrayIndexOutOfBoundsError(const Token *tok, const ArrayInfo &arrayInfo, const std::vector &index) +static void makeArrayIndexOutOfBoundsError(std::ostream& oss, const CheckBufferOverrun::ArrayInfo &arrayInfo, const std::vector &index) { - std::ostringstream oss; oss << "Array '" << arrayInfo.varname(); for (unsigned int i = 0; i < arrayInfo.num().size(); ++i) oss << "[" << arrayInfo.num(i) << "]"; @@ -61,24 +60,18 @@ void CheckBufferOverrun::arrayIndexOutOfBoundsError(const Token *tok, const Arra oss << "[" << index[i] << "]"; } oss << " out of bounds"; +} +void CheckBufferOverrun::arrayIndexOutOfBoundsError(const Token *tok, const ArrayInfo &arrayInfo, const std::vector &index) +{ + std::ostringstream oss; + makeArrayIndexOutOfBoundsError(oss, arrayInfo, index); reportError(tok, Severity::error, "arrayIndexOutOfBounds", oss.str()); } void CheckBufferOverrun::arrayIndexOutOfBoundsError(const std::list &callstack, const ArrayInfo &arrayInfo, const std::vector &index) { std::ostringstream oss; - oss << "Array '" << arrayInfo.varname(); - for (unsigned int i = 0; i < arrayInfo.num().size(); ++i) - oss << "[" << arrayInfo.num(i) << "]"; - oss << "' index "; - if (index.size() == 1) - oss << index[0]; - else { - oss << arrayInfo.varname(); - for (unsigned int i = 0; i < index.size(); ++i) - oss << "[" << index[i] << "]"; - } - oss << " out of bounds"; + makeArrayIndexOutOfBoundsError(oss, arrayInfo, index); reportError(callstack, Severity::error, "arrayIndexOutOfBounds", oss.str()); } @@ -542,7 +535,7 @@ void CheckBufferOverrun::checkFunctionParameter(const Token &tok, unsigned int p total_size["fwrite"] = 1001; // parameter 2 * parameter 3 } - if (par == 2) { + else if (par == 2) { total_size["read"] = 3; total_size["pread"] = 3; total_size["write"] = 3; @@ -928,7 +921,7 @@ void CheckBufferOverrun::checkScope(const Token *tok, const std::vectortokAt(varc + 4)); if (total_size > 0 && len >= (unsigned int)total_size) { - bufferOverrunError(tok, varid > 0 ? "" : varnames.c_str()); + bufferOverrunError(tok, varid > 0 ? std::string("") : varnames); continue; } } else if ((varid > 0 && Token::Match(tok, "strcpy|strcat ( %varid% , %var% )", varid)) || @@ -1653,7 +1646,7 @@ void CheckBufferOverrun::checkSprintfCall(const Token *tok, const MathLib::bigin std::list parameters; const Token* vaArg = tok->tokAt(2)->nextArgument()->nextArgument(); while (vaArg) { - if (Token::Match(vaArg, "%any% [,)]")) { + if (Token::Match(vaArg->next(), "[,)]")) { if (Token::Match(vaArg, "%str%")) parameters.push_back(vaArg); diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index b57818a06..c48b8888e 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -24,8 +24,6 @@ #include "errorlogger.h" #include "symboldatabase.h" -#include - #include #include #include @@ -487,7 +485,7 @@ void CheckClass::initializeVarList(const Function &func, std::list else break; } - if (Token::Match(tok2, "%any% =")) + if (tok2 && tok2->strAt(1) == "=") assignVar(ftok->str(), scope, usage); } @@ -833,7 +831,7 @@ void CheckClass::checkReturnPtrThis(const Scope *scope, const Function *func, co tok = tok->tokAt(4); // check if a function is called - if (Token::Match(tok->next(), "%any% (") && + if (tok->strAt(2) == "(" && tok->linkAt(2)->next()->str() == ";") { std::list::const_iterator it; diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index 1540f8c7e..3fe3f3713 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -314,9 +313,9 @@ void CheckMemoryLeak::memoryLeak(const Token *tok, const std::string &varname, A alloctype == CheckMemoryLeak::Pipe || alloctype == CheckMemoryLeak::Fd || alloctype == CheckMemoryLeak::Dir) - resourceLeakError(tok, varname.c_str()); + resourceLeakError(tok, varname); else - memleakError(tok, varname.c_str()); + memleakError(tok, varname); } //--------------------------------------------------------------------------- @@ -2553,7 +2552,7 @@ void CheckMemoryLeakInClass::variable(const Scope *scope, const Token *tokVarnam // Function call .. possible deallocation else if (Token::Match(tok->previous(), "[{};] %var% (")) { - if (!CheckMemoryLeakInFunction::test_white_list(tok->str().c_str())) { + if (!CheckMemoryLeakInFunction::test_white_list(tok->str())) { return; } } @@ -2562,9 +2561,9 @@ void CheckMemoryLeakInClass::variable(const Scope *scope, const Token *tokVarnam } if (allocInConstructor && !deallocInDestructor) { - memoryLeak(tokVarname, (classname + "::" + varname).c_str(), Alloc); + memoryLeak(tokVarname, classname + "::" + varname, Alloc); } else if (Alloc != CheckMemoryLeak::No && Dealloc == CheckMemoryLeak::No) { - memoryLeak(tokVarname, (classname + "::" + varname).c_str(), Alloc); + memoryLeak(tokVarname, classname + "::" + varname, Alloc); } } @@ -2707,7 +2706,7 @@ void CheckMemoryLeakStructMember::checkStructVariable(const Token * const vartok else if (tok3->str() == "}") { if (indentlevel3 == 0) { - memoryLeak(tok3, (vartok->str() + "." + tok2->strAt(2)).c_str(), Malloc); + memoryLeak(tok3, vartok->str() + "." + tok2->strAt(2), Malloc); break; } --indentlevel3; @@ -2739,7 +2738,7 @@ void CheckMemoryLeakStructMember::checkStructVariable(const Token * const vartok // Deallocating the struct.. else if (indentlevel2 == 0 && Token::Match(tok3, "free|kfree ( %varid% )", structid)) { - memoryLeak(tok3, (vartok->str() + "." + tok2->strAt(2)).c_str(), Malloc); + memoryLeak(tok3, vartok->str() + "." + tok2->strAt(2), Malloc); break; } @@ -2785,7 +2784,7 @@ void CheckMemoryLeakStructMember::checkStructVariable(const Token * const vartok // Returning from function without deallocating struct member? if (!Token::Match(tok3, "return %varid% ;", structid) && !Token::Match(tok3, "return & %varid% .", structid)) { - memoryLeak(tok3, (vartok->str() + "." + tok2->strAt(2)).c_str(), Malloc); + memoryLeak(tok3, vartok->str() + "." + tok2->strAt(2), Malloc); } break; } diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 7ff0f5906..ff33f3485 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -789,14 +789,11 @@ bool CheckStl::isStlContainer(unsigned int varid) if (Token::simpleMatch(type, "std ::")) type = type->tokAt(2); - // all possible stl containers - static const char STL_CONTAINER_LIST[] = "bitset|deque|list|map|multimap|multiset|priority_queue|queue|set|stack|hash_map|hash_multimap|hash_set|vector"; - - // container template string - const std::string checkStr(std::string(STL_CONTAINER_LIST) + " <"); + // all possible stl containers as a token + static const char STL_CONTAINER_LIST[] = "bitset|deque|list|map|multimap|multiset|priority_queue|queue|set|stack|hash_map|hash_multimap|hash_set|vector <"; // check if it's an stl template - if (Token::Match(type, checkStr.c_str())) + if (Token::Match(type, STL_CONTAINER_LIST)) return true; } @@ -861,7 +858,7 @@ void CheckStl::size() void CheckStl::sizeError(const Token *tok) { - const std::string varname(tok ? tok->str().c_str() : "list"); + const std::string varname(tok ? tok->str() : std::string("list")); reportError(tok, Severity::performance, "stlSize", "Possible inefficient checking for '" + varname + "' emptiness.\n" "Checking for '" + varname + "' emptiness might be inefficient. " diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index d387e2814..5c358b748 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -417,7 +417,7 @@ static int doAssignment(Variables &variables, const Token *tok, bool dereference if (Token::Match(tok->tokAt(start), "&| %var%") || Token::Match(tok->tokAt(start), "( const| struct|union| %type% *| ) &| %var%") || Token::Match(tok->tokAt(start), "( const| struct|union| %type% *| ) ( &| %var%") || - Token::Match(tok->tokAt(start), "%any% < const| struct|union| %type% *| > ( &| %var%")) { + Token::Match(tok->tokAt(start+1), "< const| struct|union| %type% *| > ( &| %var%")) { unsigned char offset = 0; unsigned int varid2; bool addressOf = false; diff --git a/lib/mathlib.cpp b/lib/mathlib.cpp index 64dc7bda5..305cf0b7b 100644 --- a/lib/mathlib.cpp +++ b/lib/mathlib.cpp @@ -21,10 +21,8 @@ #include "mathlib.h" #include "tokenize.h" -#include #include #include -#include #include #include #include @@ -70,7 +68,7 @@ double MathLib::toDoubleNumber(const std::string &str) else if (isNullValue(str)) return 0.0; // otherwise, convert to double - std::istringstream istr(str.c_str()); + std::istringstream istr(str); double ret; istr >> ret; return ret; diff --git a/lib/preprocessor.cpp b/lib/preprocessor.cpp index 95152fc43..6377e5533 100644 --- a/lib/preprocessor.cpp +++ b/lib/preprocessor.cpp @@ -25,7 +25,6 @@ #include "settings.h" #include -#include #include #include #include @@ -590,7 +589,7 @@ std::string Preprocessor::removeParentheses(const std::string &str) if (str.find("\n#if") == std::string::npos && str.compare(0, 3, "#if") != 0) return str; - std::istringstream istr(str.c_str()); + std::istringstream istr(str); std::ostringstream ret; std::string line; while (std::getline(istr, line)) { @@ -836,7 +835,7 @@ void Preprocessor::preprocess(std::istream &srcCodeStream, std::string &processe // Replace "defined A" with "defined(A)" { - std::istringstream istr(processedFile.c_str()); + std::istringstream istr(processedFile); std::ostringstream ostr; std::string line; while (std::getline(istr, line)) { @@ -1183,7 +1182,7 @@ std::list Preprocessor::getcfgs(const std::string &filedata, const if (s.find("&&") != std::string::npos) { Tokenizer tokenizer(_settings, _errorLogger); - std::istringstream tempIstr(s.c_str()); + std::istringstream tempIstr(s); if (!tokenizer.tokenize(tempIstr, filename.c_str(), "", true)) { std::ostringstream lineStream; lineStream << __LINE__; @@ -1300,7 +1299,7 @@ void Preprocessor::simplifyCondition(const std::map &c { Settings settings; Tokenizer tokenizer(&settings, NULL); - std::istringstream istr(("(" + condition + ")").c_str()); + std::istringstream istr("(" + condition + ")"); if (!tokenizer.tokenize(istr, "", "", true)) { // If tokenize returns false, then there is syntax error in the // code which we can't handle. So stop here. @@ -1519,7 +1518,7 @@ std::string Preprocessor::getcode(const std::string &filedata, const std::string if (line.find("=") != std::string::npos) { Tokenizer tokenizer(settings, NULL); line.erase(0, sizeof("#pragma endasm")); - std::istringstream tempIstr(line.c_str()); + std::istringstream tempIstr(line); tokenizer.tokenize(tempIstr, ""); if (Token::Match(tokenizer.tokens(), "( %var% = %any% )")) { ret << "asm(" << tokenizer.tokens()->strAt(1) << ");"; @@ -2210,7 +2209,7 @@ public: tokenizer.setSettings(&settings); // Tokenize the macro to make it easier to handle - std::istringstream istr(macro.c_str()); + std::istringstream istr(macro); tokenizer.createTokens(istr); // macro name.. @@ -2481,7 +2480,7 @@ std::string Preprocessor::expandMacros(const std::string &code, std::string file std::ostringstream ostr; // read code.. - std::istringstream istr(code.c_str()); + std::istringstream istr(code); std::string line; while (getlines(istr, line)) { // defining a macro.. diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 684ccd624..3a545e89f 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -129,7 +129,7 @@ void Tokenizer::addtoken(const char str[], const unsigned int lineno, const unsi } if (_tokensBack) { - _tokensBack->insertToken(str2.str().c_str()); + _tokensBack->insertToken(str2.str()); } else { _tokens = new Token(&_tokensBack); _tokensBack = _tokens; @@ -145,20 +145,12 @@ void Tokenizer::addtoken(const Token * tok, const unsigned int lineno, const uns if (tok == 0) return; - // Replace hexadecimal value with decimal - std::ostringstream str2; - if (strncmp(tok->str().c_str(), "0x", 2) == 0) { - str2 << std::strtoul(tok->str().c_str() + 2, NULL, 16); - } else { - str2 << tok->str(); - } - if (_tokensBack) { - _tokensBack->insertToken(str2.str().c_str()); + _tokensBack->insertToken(tok->str()); } else { _tokens = new Token(&_tokensBack); _tokensBack = _tokens; - _tokensBack->str(str2.str()); + _tokensBack->str(tok->str()); } _tokensBack->linenr(lineno); @@ -330,7 +322,7 @@ void Tokenizer::createTokens(std::istream &code) bool foundOurfile = false; fileIndexes.push_back(FileIndex); for (unsigned int i = 0; i < _files.size(); ++i) { - if (Path::sameFileName(_files[i].c_str(), line.c_str())) { + if (Path::sameFileName(_files[i], line)) { // Use this index foundOurfile = true; FileIndex = i; @@ -759,7 +751,7 @@ static Token *splitDefinitionFromTypedef(Token *tok) static unsigned int count = 0; name = "Unnamed" + MathLib::toString(count++); } - tok->next()->insertToken(name.c_str()); + tok->next()->insertToken(name); } else return NULL; } else if (tok->strAt(3) == ":") { @@ -798,7 +790,7 @@ static Token *splitDefinitionFromTypedef(Token *tok) } tok1->insertToken(tok->next()->str()); // struct, union or enum tok1 = tok1->next(); - tok1->insertToken(name.c_str()); + tok1->insertToken(name); tok->deleteThis(); tok = tok3; } @@ -1849,7 +1841,7 @@ void Tokenizer::simplifyTypedef() } } -void Tokenizer::simplifyMulAnd(void) +void Tokenizer::simplifyMulAnd() { for (Token *tok = _tokens; tok; tok = tok->next()) { if (Token::Match(tok, "[;{}] *")) { @@ -5141,10 +5133,10 @@ void Tokenizer::simplifyConditionOperator() while (pos1 != std::string::npos) { std::string::size_type pos2 = str.find(" ", pos1); if (pos2 == std::string::npos) { - tok->insertToken(str.substr(pos1).c_str()); + tok->insertToken(str.substr(pos1)); pos1 = pos2; } else { - tok->insertToken(str.substr(pos1, pos2 - pos1).c_str()); + tok->insertToken(str.substr(pos1, pos2 - pos1)); pos1 = pos2 + 1; } tok = tok->next(); @@ -5661,7 +5653,7 @@ bool Tokenizer::simplifyFunctionReturn() static void incdec(std::string &value, const std::string &op) { int ivalue = 0; - std::istringstream istr(value.c_str()); + std::istringstream istr(value); istr >> ivalue; if (op == "++") ++ivalue; @@ -6311,7 +6303,7 @@ void Tokenizer::simplifyIfNot() // if( foo(x) == 0 ) if (Token::Match(tok->link()->tokAt(-2), "( %var%")) { tok->deleteNext(2); - tok->link()->previous()->insertToken(tok->link()->previous()->str().c_str()); + tok->link()->previous()->insertToken(tok->link()->previous()->str()); tok->link()->tokAt(-2)->str("!"); } @@ -7649,7 +7641,7 @@ void Tokenizer::simplifyGoto() if (indentlevel == 1 && lev == 0) ret2 = true; } - token->insertToken(tok2->str().c_str()); + token->insertToken(tok2->str()); token = token->next(); token->linenr(tok2->linenr()); token->varId(tok2->varId()); @@ -8140,7 +8132,7 @@ void Tokenizer::simplifyEnum() } if (enumType) { - const std::string pattern(className.empty() ? "" : (className + " :: " + enumType->str()).c_str()); + const std::string pattern(className.empty() ? std::string("") : (className + " :: " + enumType->str())); // count { and } for tok2 int level = 0; @@ -9117,7 +9109,7 @@ void Tokenizer::simplifyStructDecl() tok->insertToken("static"); tok = tok->next(); } - tok->insertToken(type->str().c_str()); + tok->insertToken(type->str()); } tok = restart; @@ -9138,11 +9130,11 @@ void Tokenizer::simplifyStructDecl() name = "Anonymous" + MathLib::toString(count++); - tok1->insertToken(name.c_str()); + tok1->insertToken(name); tok->insertToken(";"); tok = tok->next(); - tok->insertToken(name.c_str()); + tok->insertToken(name); } // unnamed anonymous struct/union so possibly remove it diff --git a/test/testexceptionsafety.cpp b/test/testexceptionsafety.cpp index 9d3e233d5..e50b142fe 100644 --- a/test/testexceptionsafety.cpp +++ b/test/testexceptionsafety.cpp @@ -49,7 +49,7 @@ private: // Tokenize.. Tokenizer tokenizer(&settings, this); - std::istringstream istr(code.c_str()); + std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); tokenizer.simplifyTokenList(); diff --git a/test/testpreprocessor.cpp b/test/testpreprocessor.cpp index 7cf434d12..3bbe01af2 100644 --- a/test/testpreprocessor.cpp +++ b/test/testpreprocessor.cpp @@ -30,7 +30,6 @@ #include #include #include -#include extern std::ostringstream errout; extern std::ostringstream output; @@ -2294,7 +2293,7 @@ private: void unicodeInComment() { const std::string filedata("//\xC8"); - std::istringstream istr(filedata.c_str()); + std::istringstream istr(filedata); Settings settings; Preprocessor preprocessor(&settings, this); ASSERT_EQUALS("", preprocessor.read(istr, "test.cpp", 0)); @@ -2302,7 +2301,7 @@ private: void unicodeInString() { const std::string filedata("\"\xC8\""); - std::istringstream istr(filedata.c_str()); + std::istringstream istr(filedata); Settings settings; Preprocessor preprocessor(&settings, this); ASSERT_EQUALS(filedata, preprocessor.read(istr, "test.cpp", 0)); @@ -2716,7 +2715,7 @@ private: void testPreprocessorRead1() { const std::string filedata("/*\n*/ # /*\n*/ defi\\\nne FO\\\nO 10\\\n20"); - std::istringstream istr(filedata.c_str()); + std::istringstream istr(filedata); Settings settings; Preprocessor preprocessor(&settings, this); ASSERT_EQUALS("#define FOO 1020", preprocessor.read(istr, "test.cpp", 0)); @@ -2724,7 +2723,7 @@ private: void testPreprocessorRead2() { const std::string filedata("\"foo\\\\\nbar\""); - std::istringstream istr(filedata.c_str()); + std::istringstream istr(filedata); Settings settings; Preprocessor preprocessor(&settings, this); ASSERT_EQUALS("\"foo\\bar\"", preprocessor.read(istr, "test.cpp", 0)); @@ -2732,7 +2731,7 @@ private: void testPreprocessorRead3() { const std::string filedata("#define A \" a \"\n\" b\""); - std::istringstream istr(filedata.c_str()); + std::istringstream istr(filedata); Settings settings; Preprocessor preprocessor(&settings, this); ASSERT_EQUALS(filedata, preprocessor.read(istr, "test.cpp", 0)); @@ -2742,7 +2741,7 @@ private: { // test < \\> < > (unescaped) const std::string filedata("#define A \" \\\\\"/*space*/ \" \""); - std::istringstream istr(filedata.c_str()); + std::istringstream istr(filedata); Settings settings; Preprocessor preprocessor(&settings, this); ASSERT_EQUALS("#define A \" \\\\\" \" \"", preprocessor.read(istr, "test.cpp", 0)); @@ -2751,7 +2750,7 @@ private: { // test <" \\\" "> (unescaped) const std::string filedata("#define A \" \\\\\\\" \""); - std::istringstream istr(filedata.c_str()); + std::istringstream istr(filedata); Settings settings; Preprocessor preprocessor(&settings, this); ASSERT_EQUALS("#define A \" \\\\\\\" \"", preprocessor.read(istr, "test.cpp", 0)); @@ -2760,7 +2759,7 @@ private: { // test <" \\\\"> <" "> (unescaped) const std::string filedata("#define A \" \\\\\\\\\"/*space*/ \" \""); - std::istringstream istr(filedata.c_str()); + std::istringstream istr(filedata); Settings settings; Preprocessor preprocessor(&settings, this); ASSERT_EQUALS("#define A \" \\\\\\\\\" \" \"", preprocessor.read(istr, "test.cpp", 0)); @@ -2775,7 +2774,7 @@ private: std::string processedFile; std::list cfg; std::list paths; - preprocessor.preprocess(src, processedFile, cfg, "", paths); // don't hang + preprocessor.preprocess(src, processedFile, cfg, "", paths); // don't hang } void missingInclude() { diff --git a/test/teststl.cpp b/test/teststl.cpp index 5b4b8387a..5f13c5971 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -127,7 +127,7 @@ private: // Tokenize.. Tokenizer tokenizer(&settings, this); - std::istringstream istr(code.c_str()); + std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); tokenizer.simplifyTokenList(); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 319801e34..edad393da 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -5101,7 +5101,7 @@ private: Settings settings; // tokenize.. Tokenizer tokenizer(&settings, this); - std::istringstream istr(code.c_str()); + std::istringstream istr(code); tokenizer.tokenize(istr, "test.cpp"); std::ostringstream ostr;