From daf0c71f7776dec8ab3fc334a7b087b3473dcb32 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Sun, 31 Jul 2011 13:26:26 -0400 Subject: [PATCH] fix #2911 (Token::Match(tok, %oror%|&&) doesn't match &&) --- lib/token.cpp | 23 ++++++++++++++--------- test/testtoken.cpp | 15 +++++++++------ 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/lib/token.cpp b/lib/token.cpp index 9fb4883a8..c71cf9d92 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -561,6 +561,9 @@ bool Token::Match(const Token *tok, const char pattern[], unsigned int varid) int result = multiCompare(p, tok->str().c_str()); if (result == -1) return false; // No match + + while (*p && *p != ' ') + p++; } // single compare.. @@ -568,38 +571,40 @@ bool Token::Match(const Token *tok, const char pattern[], unsigned int varid) { if (tok->str() != "|") return false; + p += 4; } else if (p[3] == 'p') { if (!tok->isOp()) return false; + p += 4; } else patternUnderstood = false; } // Oror (%oror%) - else + else if (p[5] == '%') { // multicompare.. - if (p[5] == '|') + if (p[6] == '|') { int result = multiCompare(p, tok->str().c_str()); if (result == -1) return false; // No match + + while (*p && *p != ' ') + p++; } // single compare.. - if (tok->str() != "||") + else if (tok->str() != "||") return false; - patternUnderstood = true; - } + else + p += 6; - if (patternUnderstood) - { - while (*p && *p != ' ') - p++; + patternUnderstood = true; } break; default: diff --git a/test/testtoken.cpp b/test/testtoken.cpp index bff3784c5..3dc3a0ca3 100644 --- a/test/testtoken.cpp +++ b/test/testtoken.cpp @@ -233,18 +233,21 @@ private: void matchOr() { givenACodeSampleToTokenize bitwiseOr("|"); - ASSERT_EQUALS(true, Token::Match(bitwiseOr.tokens(), "%or%")); + ASSERT_EQUALS(true, Token::Match(bitwiseOr.tokens(), "%or%")); + ASSERT_EQUALS(false, Token::Match(bitwiseOr.tokens(), "%op%")); + ASSERT_EQUALS(false, Token::Match(bitwiseOr.tokens(), "%oror%")); givenACodeSampleToTokenize logicalOr("||"); - ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%oror%")); ASSERT_EQUALS(false, Token::Match(logicalOr.tokens(), "%or%")); - ASSERT_EQUALS(false, Token::Match(bitwiseOr.tokens(), "%oror%")); - ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "&&|%oror%")); - ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%oror%|&&")); + ASSERT_EQUALS(false, Token::Match(logicalOr.tokens(), "%op%")); + ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%oror%")); + ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "&&|%oror%")); + ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%oror%|&&")); givenACodeSampleToTokenize logicalAnd("&&"); + ASSERT_EQUALS(true, Token::Match(logicalAnd.tokens(), "&&")); ASSERT_EQUALS(true, Token::Match(logicalAnd.tokens(), "&&|%oror%")); - TODO_ASSERT_EQUALS(true, false, Token::Match(logicalAnd.tokens(), "%oror%|&&")); + ASSERT_EQUALS(true, Token::Match(logicalAnd.tokens(), "%oror%|&&")); } void matchOp()