Formatting: uniformize end of lines.
This commit is contained in:
parent
13bcb66c14
commit
661068bcd4
|
@ -72,17 +72,17 @@ void CheckBufferOverrunClass::CheckBufferOverrun_CheckScope( const TOKEN *tok, c
|
||||||
varc = 2 * ( varc - 1 );
|
varc = 2 * ( varc - 1 );
|
||||||
|
|
||||||
|
|
||||||
// Array index..
|
// Array index..
|
||||||
if ( varid > 0 )
|
if ( varid > 0 )
|
||||||
{
|
{
|
||||||
if ( TOKEN::Match(tok, "%varid% [ %num% ]", 0, 0, varid) )
|
if ( TOKEN::Match(tok, "%varid% [ %num% ]", 0, 0, varid) )
|
||||||
{
|
{
|
||||||
const char *num = tok->strAt(2);
|
const char *num = tok->strAt(2);
|
||||||
if (strtol(num, NULL, 10) >= size)
|
if (strtol(num, NULL, 10) >= size)
|
||||||
{
|
{
|
||||||
ReportError(tok->next(), "Array index out of bounds");
|
ReportError(tok->next(), "Array index out of bounds");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( TOKEN::Match(tok, "%var1% [ %num% ]", varname) )
|
else if ( TOKEN::Match(tok, "%var1% [ %num% ]", varname) )
|
||||||
{
|
{
|
||||||
|
@ -108,18 +108,18 @@ void CheckBufferOverrunClass::CheckBufferOverrun_CheckScope( const TOKEN *tok, c
|
||||||
if ( indentlevel < 0 )
|
if ( indentlevel < 0 )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Array index..
|
// Array index..
|
||||||
if ( varid > 0 )
|
if ( varid > 0 )
|
||||||
{
|
{
|
||||||
if ( !tok->isName() && !TOKEN::Match(tok,"[.&]") && TOKEN::Match(tok->next(), "%varid% [ %num% ]", 0, 0, varid) )
|
if ( !tok->isName() && !TOKEN::Match(tok,"[.&]") && TOKEN::Match(tok->next(), "%varid% [ %num% ]", 0, 0, varid) )
|
||||||
{
|
{
|
||||||
const char *num = tok->strAt(3);
|
const char *num = tok->strAt(3);
|
||||||
if (strtol(num, NULL, 10) >= size)
|
if (strtol(num, NULL, 10) >= size)
|
||||||
{
|
{
|
||||||
ReportError(tok->next(), "Array index out of bounds");
|
ReportError(tok->next(), "Array index out of bounds");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( !tok->isName() && !TOKEN::Match(tok,"[.&]") && TOKEN::Match(tok->next(), "%var1% [ %num% ]", varname) )
|
else if ( !tok->isName() && !TOKEN::Match(tok,"[.&]") && TOKEN::Match(tok->next(), "%var1% [ %num% ]", varname) )
|
||||||
{
|
{
|
||||||
|
@ -133,22 +133,22 @@ void CheckBufferOverrunClass::CheckBufferOverrun_CheckScope( const TOKEN *tok, c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// memset, memcmp, memcpy, strncpy, fgets..
|
// memset, memcmp, memcpy, strncpy, fgets..
|
||||||
if ( varid > 0 )
|
if ( varid > 0 )
|
||||||
{
|
{
|
||||||
if ( TOKEN::Match(tok, "memset|memcpy|memmove|memcmp|strncpy|fgets") )
|
if ( TOKEN::Match(tok, "memset|memcpy|memmove|memcmp|strncpy|fgets") )
|
||||||
{
|
{
|
||||||
if ( TOKEN::Match( tok->next(), "( %varid% , %num% , %num% )", 0, 0, varid ) ||
|
if ( TOKEN::Match( tok->next(), "( %varid% , %num% , %num% )", 0, 0, varid ) ||
|
||||||
TOKEN::Match( tok->next(), "( %var% , %varid% , %num% )", 0, 0, varid ) )
|
TOKEN::Match( tok->next(), "( %var% , %varid% , %num% )", 0, 0, varid ) )
|
||||||
{
|
{
|
||||||
const char *num = tok->strAt(6);
|
const char *num = tok->strAt(6);
|
||||||
if ( atoi(num) > total_size )
|
if ( atoi(num) > total_size )
|
||||||
{
|
{
|
||||||
ReportError(tok, "Buffer overrun");
|
ReportError(tok, "Buffer overrun");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (TOKEN::Match(tok,"memset|memcpy|memmove|memcmp|strncpy|fgets") )
|
else if (TOKEN::Match(tok,"memset|memcpy|memmove|memcmp|strncpy|fgets") )
|
||||||
{
|
{
|
||||||
|
@ -359,14 +359,14 @@ void CheckBufferOverrunClass::CheckBufferOverrun_LocalVariable()
|
||||||
{
|
{
|
||||||
const char *varname[2] = {0};
|
const char *varname[2] = {0};
|
||||||
unsigned int size = 0;
|
unsigned int size = 0;
|
||||||
const char *type = 0;
|
const char *type = 0;
|
||||||
unsigned int varid = 0;
|
unsigned int varid = 0;
|
||||||
|
|
||||||
if (TOKEN::Match(tok, "%type% %var% [ %num% ] ;"))
|
if (TOKEN::Match(tok, "%type% %var% [ %num% ] ;"))
|
||||||
{
|
{
|
||||||
varname[0] = tok->strAt(1);
|
varname[0] = tok->strAt(1);
|
||||||
size = strtoul(tok->strAt(3), NULL, 10);
|
size = strtoul(tok->strAt(3), NULL, 10);
|
||||||
type = tok->aaaa();
|
type = tok->aaaa();
|
||||||
varid = tok->tokAt(1)->varId();
|
varid = tok->tokAt(1)->varId();
|
||||||
}
|
}
|
||||||
else if (indentlevel > 0 && TOKEN::Match(tok, "[*;{}] %var% = new %type% [ %num% ]"))
|
else if (indentlevel > 0 && TOKEN::Match(tok, "[*;{}] %var% = new %type% [ %num% ]"))
|
||||||
|
@ -374,7 +374,7 @@ void CheckBufferOverrunClass::CheckBufferOverrun_LocalVariable()
|
||||||
varname[0] = tok->strAt(1);
|
varname[0] = tok->strAt(1);
|
||||||
size = strtoul(tok->strAt(6), NULL, 10);
|
size = strtoul(tok->strAt(6), NULL, 10);
|
||||||
type = tok->strAt(4);
|
type = tok->strAt(4);
|
||||||
varid = tok->tokAt(1)->varId();
|
varid = tok->tokAt(1)->varId();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -281,14 +281,14 @@ void CheckMemoryLeakClass::MismatchError( const TOKEN *Tok1, const std::list<con
|
||||||
void CheckMemoryLeakClass::MemoryLeak( const TOKEN *tok, const char varname[], AllocType alloctype )
|
void CheckMemoryLeakClass::MemoryLeak( const TOKEN *tok, const char varname[], AllocType alloctype )
|
||||||
{
|
{
|
||||||
std::ostringstream errmsg;
|
std::ostringstream errmsg;
|
||||||
errmsg << _tokenizer->fileLine(tok);
|
errmsg << _tokenizer->fileLine(tok);
|
||||||
|
|
||||||
if( alloctype == CheckMemoryLeakClass::FOPEN ||
|
if( alloctype == CheckMemoryLeakClass::FOPEN ||
|
||||||
alloctype == CheckMemoryLeakClass::POPEN )
|
alloctype == CheckMemoryLeakClass::POPEN )
|
||||||
errmsg << ": Resource leak: ";
|
errmsg << ": Resource leak: ";
|
||||||
else
|
else
|
||||||
errmsg << ": Memory leak: ";
|
errmsg << ": Memory leak: ";
|
||||||
|
|
||||||
errmsg << varname;
|
errmsg << varname;
|
||||||
_errorLogger->reportErr( errmsg.str() );
|
_errorLogger->reportErr( errmsg.str() );
|
||||||
}
|
}
|
||||||
|
@ -403,21 +403,21 @@ TOKEN *CheckMemoryLeakClass::getcode(const TOKEN *tok, std::list<const TOKEN *>
|
||||||
|
|
||||||
// assignment..
|
// assignment..
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// is the pointer in rhs?
|
// is the pointer in rhs?
|
||||||
bool rhs = false;
|
bool rhs = false;
|
||||||
for ( const TOKEN *tok2 = tok->tokAt(2); tok2; tok2 = tok2->next() )
|
for ( const TOKEN *tok2 = tok->tokAt(2); tok2; tok2 = tok2->next() )
|
||||||
{
|
{
|
||||||
if ( tok2->str() == ";" )
|
if ( tok2->str() == ";" )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if ( tok2->str() == varname )
|
if ( tok2->str() == varname )
|
||||||
{
|
{
|
||||||
rhs = true;
|
rhs = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addtoken( rhs ? "use" : "assign" );
|
addtoken( rhs ? "use" : "assign" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -197,7 +197,7 @@ void CppCheck::check()
|
||||||
|
|
||||||
_checkFunctionUsage.check();
|
_checkFunctionUsage.check();
|
||||||
}
|
}
|
||||||
|
|
||||||
_errorList.clear();
|
_errorList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,9 +215,9 @@ void CppCheck::checkFile(const std::string &code, const char FileName[])
|
||||||
std::istringstream istr(code);
|
std::istringstream istr(code);
|
||||||
_tokenizer.tokenize(istr, FileName);
|
_tokenizer.tokenize(istr, FileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set variable id
|
// Set variable id
|
||||||
_tokenizer.setVarId();
|
_tokenizer.setVarId();
|
||||||
|
|
||||||
_tokenizer.fillFunctionList();
|
_tokenizer.fillFunctionList();
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
Preprocessor::Preprocessor()
|
Preprocessor::Preprocessor()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Just read the code into a string. Perform simple cleanup of the code */
|
/** Just read the code into a string. Perform simple cleanup of the code */
|
||||||
|
@ -46,7 +46,7 @@ std::string Preprocessor::read(std::istream &istr, const std::string &filename)
|
||||||
for (char ch = (char)istr.get(); istr.good(); ch = (char)istr.get())
|
for (char ch = (char)istr.get(); istr.good(); ch = (char)istr.get())
|
||||||
{
|
{
|
||||||
if ( ch < 0 )
|
if ( ch < 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ( ch == '\n' )
|
if ( ch == '\n' )
|
||||||
++lineno;
|
++lineno;
|
||||||
|
|
|
@ -25,13 +25,13 @@
|
||||||
#include <istream>
|
#include <istream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
|
|
||||||
class Preprocessor
|
class Preprocessor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Preprocessor();
|
Preprocessor();
|
||||||
|
|
||||||
void preprocess(std::istream &istr, std::map<std::string, std::string> &result, const std::string &filename);
|
void preprocess(std::istream &istr, std::map<std::string, std::string> &result, const std::string &filename);
|
||||||
|
|
||||||
/** Just read the code into a string. Perform simple cleanup of the code */
|
/** Just read the code into a string. Perform simple cleanup of the code */
|
||||||
|
|
|
@ -42,9 +42,9 @@ private:
|
||||||
Tokenizer tokenizer;
|
Tokenizer tokenizer;
|
||||||
std::istringstream istr(code);
|
std::istringstream istr(code);
|
||||||
tokenizer.tokenize( istr, "test.cpp" );
|
tokenizer.tokenize( istr, "test.cpp" );
|
||||||
tokenizer.simplifyTokenList();
|
tokenizer.simplifyTokenList();
|
||||||
|
|
||||||
// Assign variable ids
|
// Assign variable ids
|
||||||
tokenizer.setVarId();
|
tokenizer.setVarId();
|
||||||
|
|
||||||
// Fill function list
|
// Fill function list
|
||||||
|
@ -81,9 +81,9 @@ private:
|
||||||
TEST_CASE( array_index_12 );
|
TEST_CASE( array_index_12 );
|
||||||
|
|
||||||
TEST_CASE( buffer_overrun_1 );
|
TEST_CASE( buffer_overrun_1 );
|
||||||
TEST_CASE( buffer_overrun_2 );
|
TEST_CASE( buffer_overrun_2 );
|
||||||
|
|
||||||
TEST_CASE( varid1 );
|
TEST_CASE( varid1 );
|
||||||
TEST_CASE( varid2 );
|
TEST_CASE( varid2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,37 +358,37 @@ private:
|
||||||
ASSERT_EQUALS( std::string("[test.cpp:8]: Buffer overrun\n"), errout.str() );
|
ASSERT_EQUALS( std::string("[test.cpp:8]: Buffer overrun\n"), errout.str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void varid1()
|
void varid1()
|
||||||
{
|
{
|
||||||
check( "void foo()\n"
|
check( "void foo()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" char str[10];\n"
|
" char str[10];\n"
|
||||||
" if (str[0])\n"
|
" if (str[0])\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" char str[50];\n"
|
" char str[50];\n"
|
||||||
" str[30] = 0;\n"
|
" str[30] = 0;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"}\n" );
|
"}\n" );
|
||||||
ASSERT_EQUALS( std::string(""), errout.str() );
|
ASSERT_EQUALS( std::string(""), errout.str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void varid2()
|
void varid2()
|
||||||
{
|
{
|
||||||
check( "void foo()\n"
|
check( "void foo()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" char str[10];\n"
|
" char str[10];\n"
|
||||||
" if (str[0])\n"
|
" if (str[0])\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" char str[50];\n"
|
" char str[50];\n"
|
||||||
" memset(str,0,50);\n"
|
" memset(str,0,50);\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"}\n" );
|
"}\n" );
|
||||||
ASSERT_EQUALS( std::string(""), errout.str() );
|
ASSERT_EQUALS( std::string(""), errout.str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -103,8 +103,8 @@ private:
|
||||||
TEST_CASE( switch2 );
|
TEST_CASE( switch2 );
|
||||||
|
|
||||||
TEST_CASE( ret1 );
|
TEST_CASE( ret1 );
|
||||||
TEST_CASE( ret2 );
|
TEST_CASE( ret2 );
|
||||||
TEST_CASE( ret3 );
|
TEST_CASE( ret3 );
|
||||||
TEST_CASE( ret4 );
|
TEST_CASE( ret4 );
|
||||||
|
|
||||||
TEST_CASE( mismatch1 );
|
TEST_CASE( mismatch1 );
|
||||||
|
@ -116,7 +116,7 @@ private:
|
||||||
TEST_CASE( func5 );
|
TEST_CASE( func5 );
|
||||||
TEST_CASE( func6 );
|
TEST_CASE( func6 );
|
||||||
// TODO TEST_CASE( func7 );
|
// TODO TEST_CASE( func7 );
|
||||||
TEST_CASE( func8 ); // Using callback
|
TEST_CASE( func8 ); // Using callback
|
||||||
// TODO TEST_CASE( func9 ); // Embedding the function call in a if-condition
|
// TODO TEST_CASE( func9 ); // Embedding the function call in a if-condition
|
||||||
|
|
||||||
TEST_CASE( class1 );
|
TEST_CASE( class1 );
|
||||||
|
@ -692,24 +692,24 @@ private:
|
||||||
ASSERT_EQUALS( std::string("[test.cpp:6]: Memory leak: abc\n"), errout.str() );
|
ASSERT_EQUALS( std::string("[test.cpp:6]: Memory leak: abc\n"), errout.str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ret3()
|
void ret3()
|
||||||
{
|
{
|
||||||
check( "void foo()\n"
|
check( "void foo()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" FILE *filep = fopen(\"myfile.txt\",\"w\");\n"
|
" FILE *filep = fopen(\"myfile.txt\",\"w\");\n"
|
||||||
"}\n" );
|
"}\n" );
|
||||||
|
|
||||||
ASSERT_EQUALS( std::string("[test.cpp:4]: Resource leak: filep\n"), errout.str() );
|
ASSERT_EQUALS( std::string("[test.cpp:4]: Resource leak: filep\n"), errout.str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ret4()
|
void ret4()
|
||||||
{
|
{
|
||||||
check( "void foo()\n"
|
check( "void foo()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" FILE *p = popen( \"ls -l\", \"r\");\n"
|
" FILE *p = popen( \"ls -l\", \"r\");\n"
|
||||||
"}\n" );
|
"}\n" );
|
||||||
|
|
||||||
ASSERT_EQUALS( std::string("[test.cpp:4]: Resource leak: p\n"), errout.str() );
|
ASSERT_EQUALS( std::string("[test.cpp:4]: Resource leak: p\n"), errout.str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void mismatch1()
|
void mismatch1()
|
||||||
|
@ -845,23 +845,23 @@ private:
|
||||||
"}\n" );
|
"}\n" );
|
||||||
ASSERT_EQUALS( std::string(""), errout.str() );
|
ASSERT_EQUALS( std::string(""), errout.str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void func9()
|
void func9()
|
||||||
{
|
{
|
||||||
check( "int b()\n"
|
check( "int b()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" return 0;\n"
|
" return 0;\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"\n"
|
"\n"
|
||||||
"void a()\n"
|
"void a()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" char *a = new char[10];\n"
|
" char *a = new char[10];\n"
|
||||||
" if (b())\n"
|
" if (b())\n"
|
||||||
" return;\n"
|
" return;\n"
|
||||||
" delete [] a;\n"
|
" delete [] a;\n"
|
||||||
"}\n" );
|
"}\n" );
|
||||||
ASSERT_EQUALS( std::string(""), errout.str() );
|
ASSERT_EQUALS( std::string(""), errout.str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1066,15 +1066,15 @@ private:
|
||||||
" free(a - 10);\n"
|
" free(a - 10);\n"
|
||||||
"}\n" );
|
"}\n" );
|
||||||
|
|
||||||
ASSERT_EQUALS( std::string(""), errout.str() );
|
ASSERT_EQUALS( std::string(""), errout.str() );
|
||||||
|
|
||||||
check( "void foo()\n"
|
check( "void foo()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" char *a = (char *)malloc(10);\n"
|
" char *a = (char *)malloc(10);\n"
|
||||||
" a = (void *)a + 10;\n"
|
" a = (void *)a + 10;\n"
|
||||||
" free(a - 10);\n"
|
" free(a - 10);\n"
|
||||||
"}\n" );
|
"}\n" );
|
||||||
|
|
||||||
ASSERT_EQUALS( std::string(""), errout.str() );
|
ASSERT_EQUALS( std::string(""), errout.str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
128
testtokenize.cpp
128
testtokenize.cpp
|
@ -50,8 +50,8 @@ private:
|
||||||
|
|
||||||
TEST_CASE( multi_compare );
|
TEST_CASE( multi_compare );
|
||||||
|
|
||||||
TEST_CASE( match1 );
|
TEST_CASE( match1 );
|
||||||
|
|
||||||
TEST_CASE( match2 );
|
TEST_CASE( match2 );
|
||||||
|
|
||||||
TEST_CASE( varid1 );
|
TEST_CASE( varid1 );
|
||||||
|
@ -265,68 +265,68 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void match2()
|
void match2()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
const std::string code("");
|
const std::string code("");
|
||||||
|
|
||||||
// tokenize..
|
// tokenize..
|
||||||
Tokenizer tokenizer;
|
Tokenizer tokenizer;
|
||||||
std::istringstream istr(code);
|
std::istringstream istr(code);
|
||||||
tokenizer.tokenize(istr, "test.cpp");
|
tokenizer.tokenize(istr, "test.cpp");
|
||||||
|
|
||||||
// Match..
|
// Match..
|
||||||
ASSERT_EQUALS( true, TOKEN::Match(tokenizer.tokens(), "!!else") );
|
ASSERT_EQUALS( true, TOKEN::Match(tokenizer.tokens(), "!!else") );
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const std::string code("if ;");
|
const std::string code("if ;");
|
||||||
|
|
||||||
// tokenize..
|
// tokenize..
|
||||||
Tokenizer tokenizer;
|
Tokenizer tokenizer;
|
||||||
std::istringstream istr(code);
|
std::istringstream istr(code);
|
||||||
tokenizer.tokenize(istr, "test.cpp");
|
tokenizer.tokenize(istr, "test.cpp");
|
||||||
|
|
||||||
// Match..
|
// Match..
|
||||||
ASSERT_EQUALS( true, TOKEN::Match(tokenizer.tokens(), "if ; !!else") );
|
ASSERT_EQUALS( true, TOKEN::Match(tokenizer.tokens(), "if ; !!else") );
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const std::string code("if ; something");
|
const std::string code("if ; something");
|
||||||
|
|
||||||
// tokenize..
|
// tokenize..
|
||||||
Tokenizer tokenizer;
|
Tokenizer tokenizer;
|
||||||
std::istringstream istr(code);
|
std::istringstream istr(code);
|
||||||
tokenizer.tokenize(istr, "test.cpp");
|
tokenizer.tokenize(istr, "test.cpp");
|
||||||
|
|
||||||
// Match..
|
// Match..
|
||||||
ASSERT_EQUALS( true, TOKEN::Match(tokenizer.tokens(), "if ; !!else") );
|
ASSERT_EQUALS( true, TOKEN::Match(tokenizer.tokens(), "if ; !!else") );
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const std::string code("else");
|
const std::string code("else");
|
||||||
|
|
||||||
// tokenize..
|
// tokenize..
|
||||||
Tokenizer tokenizer;
|
Tokenizer tokenizer;
|
||||||
std::istringstream istr(code);
|
std::istringstream istr(code);
|
||||||
tokenizer.tokenize(istr, "test.cpp");
|
tokenizer.tokenize(istr, "test.cpp");
|
||||||
|
|
||||||
// Match..
|
// Match..
|
||||||
ASSERT_EQUALS( false, TOKEN::Match(tokenizer.tokens(), "!!else") );
|
ASSERT_EQUALS( false, TOKEN::Match(tokenizer.tokens(), "!!else") );
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const std::string code("if ; else");
|
const std::string code("if ; else");
|
||||||
|
|
||||||
// tokenize..
|
// tokenize..
|
||||||
Tokenizer tokenizer;
|
Tokenizer tokenizer;
|
||||||
std::istringstream istr(code);
|
std::istringstream istr(code);
|
||||||
tokenizer.tokenize(istr, "test.cpp");
|
tokenizer.tokenize(istr, "test.cpp");
|
||||||
|
|
||||||
// Match..
|
// Match..
|
||||||
ASSERT_EQUALS( false, TOKEN::Match(tokenizer.tokens(), "if ; !!else") );
|
ASSERT_EQUALS( false, TOKEN::Match(tokenizer.tokens(), "if ; !!else") );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void varid1()
|
void varid1()
|
||||||
{
|
{
|
||||||
|
|
186
token.cpp
186
token.cpp
|
@ -19,7 +19,7 @@
|
||||||
#include "token.h"
|
#include "token.h"
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
#ifdef __BORLANDC__
|
||||||
|
@ -32,11 +32,11 @@ TOKEN::TOKEN()
|
||||||
_cstr = 0;
|
_cstr = 0;
|
||||||
_str = "";
|
_str = "";
|
||||||
_linenr = 0;
|
_linenr = 0;
|
||||||
_next = 0;
|
_next = 0;
|
||||||
_previous = 0;
|
_previous = 0;
|
||||||
_varId = 0;
|
_varId = 0;
|
||||||
_isName = false;
|
_isName = false;
|
||||||
_isNumber = false;
|
_isNumber = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
TOKEN::~TOKEN()
|
TOKEN::~TOKEN()
|
||||||
|
@ -141,24 +141,24 @@ int TOKEN::multiCompare( const char *needle, const char *haystack )
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TOKEN::Match(const TOKEN *tok, const char pattern[], const char *varname1[], const char *varname2[], unsigned int varid)
|
bool TOKEN::Match(const TOKEN *tok, const char pattern[], const char *varname1[], const char *varname2[], unsigned int varid)
|
||||||
{
|
{
|
||||||
const char *p = pattern;
|
const char *p = pattern;
|
||||||
while ( *p )
|
while ( *p )
|
||||||
{
|
{
|
||||||
// Skip spaces in pattern..
|
// Skip spaces in pattern..
|
||||||
while ( *p == ' ' )
|
while ( *p == ' ' )
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
if (!tok)
|
if (!tok)
|
||||||
{
|
{
|
||||||
// If we have no tokens, pattern "!!else" should return true
|
// If we have no tokens, pattern "!!else" should return true
|
||||||
if( isNotPattern( p ) )
|
if( isNotPattern( p ) )
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract token from pattern..
|
// Extract token from pattern..
|
||||||
// TODO: Refactor this so there can't be buffer overflows
|
// TODO: Refactor this so there can't be buffer overflows
|
||||||
|
@ -221,7 +221,7 @@ bool TOKEN::Match(const TOKEN *tok, const char pattern[], const char *varname1[]
|
||||||
if ( tok->varId() != varid )
|
if ( tok->varId() != varid )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (strcmp(str,"%num%")==0)
|
else if (strcmp(str,"%num%")==0)
|
||||||
{
|
{
|
||||||
if ( ! tok->isNumber() )
|
if ( ! tok->isNumber() )
|
||||||
|
@ -257,13 +257,13 @@ bool TOKEN::Match(const TOKEN *tok, const char pattern[], const char *varname1[]
|
||||||
// No match
|
// No match
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse "not" options. Token can be anything except the given one
|
// Parse "not" options. Token can be anything except the given one
|
||||||
else if( isNotPattern( str ) )
|
else if( isNotPattern( str ) )
|
||||||
{
|
{
|
||||||
if( strcmp( tok->aaaa(), &(str[2]) ) == 0 )
|
if( strcmp( tok->aaaa(), &(str[2]) ) == 0 )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (str != tok->_str)
|
else if (str != tok->_str)
|
||||||
|
@ -275,14 +275,14 @@ bool TOKEN::Match(const TOKEN *tok, const char pattern[], const char *varname1[]
|
||||||
// The end of the pattern has been reached and nothing wrong has been found
|
// The end of the pattern has been reached and nothing wrong has been found
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TOKEN::isNotPattern( const char *pattern )
|
bool TOKEN::isNotPattern( const char *pattern )
|
||||||
{
|
{
|
||||||
if( pattern && strlen(pattern) > 2 && pattern[0] == '!' && pattern[1] == '!' )
|
if( pattern && strlen(pattern) > 2 && pattern[0] == '!' && pattern[1] == '!' )
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TOKEN::isName() const
|
bool TOKEN::isName() const
|
||||||
{
|
{
|
||||||
|
@ -355,50 +355,50 @@ void TOKEN::next( TOKEN *next )
|
||||||
{
|
{
|
||||||
_next = next;
|
_next = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
TOKEN *TOKEN::previous() const
|
TOKEN *TOKEN::previous() const
|
||||||
{
|
{
|
||||||
return _previous;
|
return _previous;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TOKEN::previous( TOKEN *previous )
|
void TOKEN::previous( TOKEN *previous )
|
||||||
{
|
{
|
||||||
_previous = previous;
|
_previous = previous;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TOKEN::insertToken( const char *str )
|
void TOKEN::insertToken( const char *str )
|
||||||
{
|
{
|
||||||
TOKEN *newToken = new TOKEN;
|
TOKEN *newToken = new TOKEN;
|
||||||
newToken->setstr( str );
|
newToken->setstr( str );
|
||||||
if( this->next() )
|
if( this->next() )
|
||||||
{
|
{
|
||||||
newToken->next( this->next() );
|
newToken->next( this->next() );
|
||||||
newToken->next()->previous( newToken );
|
newToken->next()->previous( newToken );
|
||||||
}
|
}
|
||||||
|
|
||||||
this->next( newToken );
|
this->next( newToken );
|
||||||
newToken->previous( this );
|
newToken->previous( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TOKEN::eraseTokens( TOKEN *begin, const TOKEN *end )
|
void TOKEN::eraseTokens( TOKEN *begin, const TOKEN *end )
|
||||||
{
|
{
|
||||||
if ( ! begin )
|
if ( ! begin )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while ( begin->next() && begin->next() != end )
|
while ( begin->next() && begin->next() != end )
|
||||||
{
|
{
|
||||||
begin->eraseToken();
|
begin->eraseToken();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TOKEN::eraseToken()
|
void TOKEN::eraseToken()
|
||||||
{
|
{
|
||||||
TOKEN *next = this->next();
|
TOKEN *next = this->next();
|
||||||
this->next( next->next() );
|
this->next( next->next() );
|
||||||
if ( next->next() )
|
if ( next->next() )
|
||||||
next->next()->previous( this );
|
next->next()->previous( this );
|
||||||
delete next;
|
delete next;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int TOKEN::fileIndex() const
|
unsigned int TOKEN::fileIndex() const
|
||||||
{
|
{
|
||||||
|
@ -419,22 +419,22 @@ void TOKEN::linenr( unsigned int linenr )
|
||||||
{
|
{
|
||||||
_linenr = linenr;
|
_linenr = linenr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TOKEN::printOut( const char *title ) const
|
void TOKEN::printOut( const char *title ) const
|
||||||
{
|
{
|
||||||
std::cout << std::endl << "###";
|
std::cout << std::endl << "###";
|
||||||
if ( title )
|
if ( title )
|
||||||
std::cout << " " << title << " ";
|
std::cout << " " << title << " ";
|
||||||
else
|
else
|
||||||
std::cout << "########";
|
std::cout << "########";
|
||||||
|
|
||||||
std::cout << "###" << std::endl;
|
std::cout << "###" << std::endl;
|
||||||
for( const TOKEN *t = this; t; t = t->next() )
|
for( const TOKEN *t = this; t; t = t->next() )
|
||||||
{
|
{
|
||||||
std::cout << t->linenr() << ": " << t->str();
|
std::cout << t->linenr() << ": " << t->str();
|
||||||
if ( t->varId() )
|
if ( t->varId() )
|
||||||
std::cout << " ("<< t->varId() <<")";
|
std::cout << " ("<< t->varId() <<")";
|
||||||
|
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
92
token.h
92
token.h
|
@ -70,11 +70,11 @@ public:
|
||||||
* "%num%" Any numeric token, e.g. "23"
|
* "%num%" Any numeric token, e.g. "23"
|
||||||
* "%str%" Any token starting with "-character (C-string).
|
* "%str%" Any token starting with "-character (C-string).
|
||||||
* "%var1%" Match with parameter varname1
|
* "%var1%" Match with parameter varname1
|
||||||
* "%var2%" Match with parameter varname2
|
* "%var2%" Match with parameter varname2
|
||||||
* "%varid%" Match with parameter varid
|
* "%varid%" Match with parameter varid
|
||||||
* "[abc]" Any of the characters 'a' or 'b' or 'c'
|
* "[abc]" Any of the characters 'a' or 'b' or 'c'
|
||||||
* "int|void|char" Any of the strings, int, void or char
|
* "int|void|char" Any of the strings, int, void or char
|
||||||
* "int|void|char|" Any of the strings, int, void or char or empty string
|
* "int|void|char|" Any of the strings, int, void or char or empty string
|
||||||
* "!!else" No tokens or any token that is not "else".
|
* "!!else" No tokens or any token that is not "else".
|
||||||
* "someRandomText" If token contains "someRandomText".
|
* "someRandomText" If token contains "someRandomText".
|
||||||
*
|
*
|
||||||
|
@ -92,7 +92,7 @@ public:
|
||||||
* @return true if given token matches with given pattern
|
* @return true if given token matches with given pattern
|
||||||
* false if given token does not match with given pattern
|
* false if given token does not match with given pattern
|
||||||
*/
|
*/
|
||||||
static bool Match(const TOKEN *tok, const char pattern[], const char *varname1[]=0, const char *varname2[]=0, unsigned int varid=0);
|
static bool Match(const TOKEN *tok, const char pattern[], const char *varname1[]=0, const char *varname2[]=0, unsigned int varid=0);
|
||||||
|
|
||||||
bool isName() const;
|
bool isName() const;
|
||||||
bool isNumber() const;
|
bool isNumber() const;
|
||||||
|
@ -124,59 +124,59 @@ public:
|
||||||
|
|
||||||
TOKEN *next() const;
|
TOKEN *next() const;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete tokens between begin and end. E.g. if begin = 1
|
* Delete tokens between begin and end. E.g. if begin = 1
|
||||||
* and end = 5, tokens 2,3 and 4 would be erased.
|
* and end = 5, tokens 2,3 and 4 would be erased.
|
||||||
*
|
*
|
||||||
* @param begin Tokens after this will be erased.
|
* @param begin Tokens after this will be erased.
|
||||||
* @param end Tokens before this will be erased.
|
* @param end Tokens before this will be erased.
|
||||||
*/
|
*/
|
||||||
static void eraseTokens( TOKEN *begin, const TOKEN *end );
|
static void eraseTokens( TOKEN *begin, const TOKEN *end );
|
||||||
|
|
||||||
void eraseToken();
|
void eraseToken();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert new token after this token. This function will handle
|
* Insert new token after this token. This function will handle
|
||||||
* relations between next and previous token also.
|
* relations between next and previous token also.
|
||||||
* @param str String for the new token.
|
* @param str String for the new token.
|
||||||
*/
|
*/
|
||||||
void insertToken( const char *str );
|
void insertToken( const char *str );
|
||||||
|
|
||||||
TOKEN *previous() const;
|
TOKEN *previous() const;
|
||||||
|
|
||||||
|
|
||||||
unsigned int varId() const;
|
unsigned int varId() const;
|
||||||
void varId( unsigned int id );
|
void varId( unsigned int id );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For debugging purposes, prints token and all tokens
|
* For debugging purposes, prints token and all tokens
|
||||||
* followed by it.
|
* followed by it.
|
||||||
* @param title Title for the printout or use default parameter or 0
|
* @param title Title for the printout or use default parameter or 0
|
||||||
* for no title.
|
* for no title.
|
||||||
*/
|
*/
|
||||||
void printOut( const char *title = 0 ) const;
|
void printOut( const char *title = 0 ) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void next( TOKEN *next );
|
void next( TOKEN *next );
|
||||||
void previous( TOKEN *previous );
|
void previous( TOKEN *previous );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if pattern is e.g. "!!else".
|
* Return true if pattern is e.g. "!!else".
|
||||||
* See Match() for more info.
|
* See Match() for more info.
|
||||||
*
|
*
|
||||||
* @param pattern Pattern to match, e.g. "if ; !!else"
|
* @param pattern Pattern to match, e.g. "if ; !!else"
|
||||||
* @return true if pattern starts with "!!" and contains 3
|
* @return true if pattern starts with "!!" and contains 3
|
||||||
* or more characters.
|
* or more characters.
|
||||||
*/
|
*/
|
||||||
static bool isNotPattern( const char *pattern );
|
static bool isNotPattern( const char *pattern );
|
||||||
|
|
||||||
std::string _str;
|
std::string _str;
|
||||||
char * _cstr;
|
char * _cstr;
|
||||||
bool _isName;
|
bool _isName;
|
||||||
bool _isNumber;
|
bool _isNumber;
|
||||||
unsigned int _varId;
|
unsigned int _varId;
|
||||||
TOKEN *_next;
|
TOKEN *_next;
|
||||||
TOKEN *_previous;
|
TOKEN *_previous;
|
||||||
unsigned int _fileIndex;
|
unsigned int _fileIndex;
|
||||||
unsigned int _linenr;
|
unsigned int _linenr;
|
||||||
|
|
36
tokenize.cpp
36
tokenize.cpp
|
@ -160,19 +160,19 @@ void Tokenizer::addtoken(const char str[], const unsigned int lineno, const unsi
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_tokensBack)
|
if (_tokensBack)
|
||||||
{
|
{
|
||||||
_tokensBack->insertToken( str2.str().c_str() );
|
_tokensBack->insertToken( str2.str().c_str() );
|
||||||
_tokensBack = _tokensBack->next();
|
_tokensBack = _tokensBack->next();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_tokens = new TOKEN;
|
_tokens = new TOKEN;
|
||||||
_tokensBack = _tokens;
|
_tokensBack = _tokens;
|
||||||
_tokensBack->setstr( str2.str().c_str() );
|
_tokensBack->setstr( str2.str().c_str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
_tokensBack->linenr( lineno );
|
_tokensBack->linenr( lineno );
|
||||||
_tokensBack->fileIndex( fileno );
|
_tokensBack->fileIndex( fileno );
|
||||||
|
|
||||||
// Check if str is defined..
|
// Check if str is defined..
|
||||||
for (DefineSymbol *sym = _dsymlist; sym; sym = sym->next)
|
for (DefineSymbol *sym = _dsymlist; sym; sym = sym->next)
|
||||||
|
@ -212,10 +212,10 @@ int Tokenizer::SizeOfType(const char type[]) const
|
||||||
void Tokenizer::InsertTokens(TOKEN *dest, TOKEN *src, unsigned int n)
|
void Tokenizer::InsertTokens(TOKEN *dest, TOKEN *src, unsigned int n)
|
||||||
{
|
{
|
||||||
while (n > 0)
|
while (n > 0)
|
||||||
{
|
{
|
||||||
dest->insertToken( src->aaaa() );
|
dest->insertToken( src->aaaa() );
|
||||||
dest->next()->fileIndex( src->fileIndex() );
|
dest->next()->fileIndex( src->fileIndex() );
|
||||||
dest->next()->linenr( src->linenr() );
|
dest->next()->linenr( src->linenr() );
|
||||||
dest = dest->next();
|
dest = dest->next();
|
||||||
src = src->next();
|
src = src->next();
|
||||||
n--;
|
n--;
|
||||||
|
@ -562,9 +562,9 @@ void Tokenizer::tokenizeCode(std::istream &code, const unsigned int FileIndex)
|
||||||
if (tok2->aaaa()!=type3 && (tok2->str() == type3))
|
if (tok2->aaaa()!=type3 && (tok2->str() == type3))
|
||||||
{
|
{
|
||||||
tok2->setstr(type1);
|
tok2->setstr(type1);
|
||||||
tok2->insertToken( type2 );
|
tok2->insertToken( type2 );
|
||||||
tok2->next()->fileIndex( tok2->fileIndex() );
|
tok2->next()->fileIndex( tok2->fileIndex() );
|
||||||
tok2->next()->linenr( tok2->linenr() );
|
tok2->next()->linenr( tok2->linenr() );
|
||||||
tok2 = tok2->next();
|
tok2 = tok2->next();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -581,8 +581,8 @@ void Tokenizer::tokenizeCode(std::istream &code, const unsigned int FileIndex)
|
||||||
{
|
{
|
||||||
bool last = TOKEN::Match( tok->next(), "}" );
|
bool last = TOKEN::Match( tok->next(), "}" );
|
||||||
|
|
||||||
// Unlink and delete tok->next()
|
// Unlink and delete tok->next()
|
||||||
tok->eraseToken();
|
tok->eraseToken();
|
||||||
|
|
||||||
// break if this was the last token to delete..
|
// break if this was the last token to delete..
|
||||||
if (last)
|
if (last)
|
||||||
|
|
Loading…
Reference in New Issue