diff --git a/testtokenize.cpp b/testtokenize.cpp new file mode 100644 index 000000000..3d7f373cc --- /dev/null +++ b/testtokenize.cpp @@ -0,0 +1,80 @@ +/* + * c++check - c/c++ syntax checking + * Copyright (C) 2007 Daniel Marjamäki + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see next) + { + if ( strcmp( expected[i], actual->str ) != 0) + return false; + } + return (expected[i] == NULL && actual == NULL); + } + + + void multiline() + { + const char filedata[] = "#define str \"abc\" \\\n" + " \"def\"\n"; + + // tokenize.. + tokens = tokens_back = NULL; + std::istringstream istr(filedata); + TokenizeCode(istr, 0); + + // Expected result.. + const char *expected[] = + { + "def", + "str", + ";", + 0 + }; + + // Compare.. + ASSERT_EQUALS( true, cmptok(expected, tokens) ); + + DeallocateTokens(); + } + +}; + +REGISTER_TEST( TestTokenizer ) diff --git a/tokenize.cpp b/tokenize.cpp index 80dd94b5a..885e185e5 100644 --- a/tokenize.cpp +++ b/tokenize.cpp @@ -326,9 +326,22 @@ void TokenizeCode(std::istream &code, const unsigned int FileIndex) // Preprocessor stuff? if (ch == '#' && !CurrentToken[0]) { - std::string line; - getline(code,line); - line = "#" + line; + std::string line("#"); + { + char chPrev = '#'; + while ( code.good() ) + { + ch = (char)code.get(); + if (chPrev!='\\' && ch=='\n') + break; + if (ch!=' ') + chPrev = ch; + if (ch!='\\' && ch!='\n') + line += ch; + if (ch=='\n') + ++lineno; + } + } if (strncmp(line.c_str(),"#include",8)==0 && line.find("\"") != std::string::npos) {