diff --git a/testtokenize.cpp b/testtokenize.cpp index a3bba0698..80cae1b5c 100644 --- a/testtokenize.cpp +++ b/testtokenize.cpp @@ -41,7 +41,10 @@ private: TEST_CASE( inlineasm ); - TEST_CASE( dupfuncname ); + TEST_CASE( dupfuncname ); + + TEST_CASE( alwaysTrue ); + TEST_CASE( alwaysFalse ); } @@ -155,6 +158,47 @@ private: ASSERT_EQUALS( 1, tokenizer.FunctionList.size() ); ASSERT_EQUALS( std::string("b"), tokenizer.FunctionList[0]->str ); + } + + + bool alwaysTrueCheck(const char condition[]) + { + // tokenize.. + Tokenizer tokenizer( this ); + tokenizer.getFiles()->push_back( "test.cpp" ); + std::istringstream istr(condition); + tokenizer.TokenizeCode(istr, 0); + + // check.. + return tokenizer.alwaysTrue( tokenizer.tokens() ); + } + + void alwaysTrue() + { + ASSERT_EQUALS(true, alwaysTrueCheck("(1)")); + ASSERT_EQUALS(true, alwaysTrueCheck("(true)")); + ASSERT_EQUALS(true, alwaysTrueCheck("(true || false)")); + ASSERT_EQUALS(false, alwaysTrueCheck("(true && false)")); + } + + bool alwaysFalseCheck(const char condition[]) + { + // tokenize.. + Tokenizer tokenizer( this ); + tokenizer.getFiles()->push_back( "test.cpp" ); + std::istringstream istr(condition); + tokenizer.TokenizeCode(istr, 0); + + // check.. + return tokenizer.alwaysFalse( tokenizer.tokens() ); + } + + void alwaysFalse() + { + ASSERT_EQUALS(true, alwaysFalseCheck("(0)")); + ASSERT_EQUALS(true, alwaysFalseCheck("(false)")); + ASSERT_EQUALS(true, alwaysFalseCheck("(false && true)")); + ASSERT_EQUALS(false, alwaysFalseCheck("(false || true)")); } }; diff --git a/tokenize.cpp b/tokenize.cpp index 1e4c3c47e..4bf88ef6b 100644 --- a/tokenize.cpp +++ b/tokenize.cpp @@ -1468,7 +1468,7 @@ bool Tokenizer::Match(const TOKEN *tok, const char pattern[], const char *varnam return false; tok = tok->next; - if (!tok) + if (!tok && *p) return false; } @@ -1517,3 +1517,17 @@ bool Tokenizer::IsStandardType(const char str[]) Ret |= (strcmp(str,type[i])==0); return Ret; } +//--------------------------------------------------------------------------- + +bool Tokenizer::alwaysTrue( const TOKEN *tok ) +{ + return (Match(tok,"( 1 [|)]") | Match(tok,"( 1 ||") | + Match(tok,"( true [|)]") | Match(tok,"( true ||")); +} +//--------------------------------------------------------------------------- +bool Tokenizer::alwaysFalse( const TOKEN *tok ) +{ + return (Match(tok,"( 0 [&)]") | Match(tok,"( 0 &&") | + Match(tok,"( false [&)]") | Match(tok,"( false &&")); +} +//--------------------------------------------------------------------------- diff --git a/tokenize.h b/tokenize.h index c09d373ff..1a3e12649 100644 --- a/tokenize.h +++ b/tokenize.h @@ -90,6 +90,8 @@ public: static bool IsNumber(const char str[]); static bool IsStandardType(const char str[]); + bool alwaysTrue( const TOKEN *tok ); + bool alwaysFalse( const TOKEN *tok ); std::string fileLine( const TOKEN *tok );