Fixed #1619 (tokenizer: remove calling convention)

This commit is contained in:
Robert Reif 2010-04-21 21:08:47 +02:00 committed by Daniel Marjamäki
parent f378b382a0
commit 90541386da
4 changed files with 45 additions and 3 deletions

View File

@ -477,12 +477,12 @@ void CheckBufferOverrun::checkFunctionCall(const Token &tok, unsigned int par, c
total_size["strncpy"] = 3; total_size["strncpy"] = 3;
total_size["memset"] = 3; total_size["memset"] = 3;
} }
if (par == 2) if (par == 2)
{ {
total_size["read"] = 3; total_size["read"] = 3;
total_size["write"] = 3; total_size["write"] = 3;
} }
std::map<std::string, unsigned int>::const_iterator it = total_size.find(tok.str()); std::map<std::string, unsigned int>::const_iterator it = total_size.find(tok.str());
if (it != total_size.end()) if (it != total_size.end())

View File

@ -1284,6 +1284,9 @@ bool Tokenizer::tokenize(std::istream &code, const char FileName[], const std::s
} }
} }
// remove calling conventions __cdecl, __stdcall..
simplifyCallingConvention();
// typedef.. // typedef..
simplifyTypedef(); simplifyTypedef();
@ -7073,3 +7076,20 @@ void Tokenizer::simplifyStructDecl()
} }
} }
} }
void Tokenizer::simplifyCallingConvention()
{
const char * pattern = "__cdecl|__stdcall|__fastcall|__pascal|__thiscall|__fortran|__clrcall|WINAPI|APIENTRY|CALLBACK";
while (Token::Match(_tokens, pattern))
{
_tokens->deleteThis();
}
for (Token *tok = _tokens; tok; tok = tok->next())
{
while (Token::Match(tok->next(), pattern))
{
tok->deleteNext();
}
}
}

View File

@ -428,6 +428,11 @@ public:
*/ */
bool simplifyDoWhileAddBracesHelper(Token *tok); bool simplifyDoWhileAddBracesHelper(Token *tok);
/**
* Remove calling convention
*/
void simplifyCallingConvention();
/** /**
* This will return a short name describing function parameters * This will return a short name describing function parameters
* e.g. parameters: (int a, char b) should get name "int,char,". * e.g. parameters: (int a, char b) should get name "int,char,".

View File

@ -237,6 +237,9 @@ private:
// register int var; => int var; // register int var; => int var;
// inline int foo() {} => int foo() {} // inline int foo() {} => int foo() {}
TEST_CASE(removeUnwantedKeywords); TEST_CASE(removeUnwantedKeywords);
// remove calling convention __cdecl, __stdcall, ...
TEST_CASE(simplifyCallingConvention);
} }
std::string tok(const char code[], bool simplify = true) std::string tok(const char code[], bool simplify = true)
@ -4612,6 +4615,20 @@ private:
ASSERT_EQUALS("if ( a ) { }", tok("if ( likely ( a ) ) { }", true)); ASSERT_EQUALS("if ( a ) { }", tok("if ( likely ( a ) ) { }", true));
ASSERT_EQUALS("if ( a ) { }", tok("if ( unlikely ( a ) ) { }", true)); ASSERT_EQUALS("if ( a ) { }", tok("if ( unlikely ( a ) ) { }", true));
} }
void simplifyCallingConvention()
{
ASSERT_EQUALS("int f ( ) ;", tok("int __cdecl f();", true));
ASSERT_EQUALS("int f ( ) ;", tok("int __stdcall f();", true));
ASSERT_EQUALS("int f ( ) ;", tok("int __fastcall f();", true));
ASSERT_EQUALS("int f ( ) ;", tok("int __pascal f();", true));
ASSERT_EQUALS("int f ( ) ;", tok("int __fortran f();", true));
ASSERT_EQUALS("int f ( ) ;", tok("int __clrcall f();", true));
ASSERT_EQUALS("int f ( ) ;", tok("int __thiscall f();", true));
ASSERT_EQUALS("int f ( ) ;", tok("int WINAPI f();", true));
ASSERT_EQUALS("int f ( ) ;", tok("int APIENTRY f();", true));
ASSERT_EQUALS("int f ( ) ;", tok("int CALLBACK f();", true));
}
}; };
REGISTER_TEST(TestSimplifyTokens) REGISTER_TEST(TestSimplifyTokens)