Token::strValue: fixed handling of backslash
This commit is contained in:
parent
35a6a1d9ea
commit
75b0430ba5
|
@ -150,7 +150,23 @@ void Token::concatStr(std::string const& b)
|
||||||
std::string Token::strValue() const
|
std::string Token::strValue() const
|
||||||
{
|
{
|
||||||
assert(_type == eString);
|
assert(_type == eString);
|
||||||
return _str.substr(1, _str.length() - 2);
|
std::string ret(_str.substr(1, _str.length() - 2));
|
||||||
|
std::string::size_type pos = 0U;
|
||||||
|
while ((pos = ret.find("\\",pos)) != std::string::npos) {
|
||||||
|
ret.erase(pos,1U);
|
||||||
|
if (ret[pos] >= 'a') {
|
||||||
|
if (ret[pos] == 'n')
|
||||||
|
ret[pos] = '\n';
|
||||||
|
else if (ret[pos] == 'r')
|
||||||
|
ret[pos] = '\r';
|
||||||
|
else if (ret[pos] == 't')
|
||||||
|
ret[pos] = '\t';
|
||||||
|
}
|
||||||
|
if (ret[pos] == '0')
|
||||||
|
return ret.substr(0,pos);
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Token::deleteNext(unsigned long index)
|
void Token::deleteNext(unsigned long index)
|
||||||
|
@ -665,21 +681,25 @@ bool Token::Match(const Token *tok, const char pattern[], unsigned int varid)
|
||||||
std::size_t Token::getStrLength(const Token *tok)
|
std::size_t Token::getStrLength(const Token *tok)
|
||||||
{
|
{
|
||||||
assert(tok != nullptr);
|
assert(tok != nullptr);
|
||||||
|
assert(tok->_type == eString);
|
||||||
|
|
||||||
std::size_t len = 0;
|
std::size_t len = 0;
|
||||||
const std::string strValue(tok->strValue());
|
std::string::const_iterator it = tok->str().begin() + 1U;
|
||||||
const char *str = strValue.c_str();
|
const std::string::const_iterator end = tok->str().end() - 1U;
|
||||||
|
|
||||||
while (*str) {
|
while (it != end) {
|
||||||
if (*str == '\\') {
|
if (*it == '\\') {
|
||||||
++str;
|
++it;
|
||||||
|
|
||||||
// string ends at '\0'
|
// string ends at '\0'
|
||||||
if (*str == '0')
|
if (*it == '0')
|
||||||
break;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
++str;
|
if (*it == '\0')
|
||||||
|
return len;
|
||||||
|
|
||||||
|
++it;
|
||||||
++len;
|
++len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1548,6 +1548,7 @@ static bool valueFlowForLoop2(const Token *tok,
|
||||||
std::map<unsigned int, MathLib::bigint> *memory2,
|
std::map<unsigned int, MathLib::bigint> *memory2,
|
||||||
std::map<unsigned int, MathLib::bigint> *memoryAfter)
|
std::map<unsigned int, MathLib::bigint> *memoryAfter)
|
||||||
{
|
{
|
||||||
|
// for ( firstExpression ; secondExpression ; thirdExpression )
|
||||||
const Token *firstExpression = tok->next()->astOperand2()->astOperand1();
|
const Token *firstExpression = tok->next()->astOperand2()->astOperand1();
|
||||||
const Token *secondExpression = tok->next()->astOperand2()->astOperand2()->astOperand1();
|
const Token *secondExpression = tok->next()->astOperand2()->astOperand2()->astOperand1();
|
||||||
const Token *thirdExpression = tok->next()->astOperand2()->astOperand2()->astOperand2();
|
const Token *thirdExpression = tok->next()->astOperand2()->astOperand2()->astOperand2();
|
||||||
|
|
|
@ -4263,7 +4263,7 @@ private:
|
||||||
ASSERT_EQUALS("'\\0' ;", tok("\"hello\"[5] ;"));
|
ASSERT_EQUALS("'\\0' ;", tok("\"hello\"[5] ;"));
|
||||||
ASSERT_EQUALS("'\\0' ;", tok("\"\"[0] ;"));
|
ASSERT_EQUALS("'\\0' ;", tok("\"\"[0] ;"));
|
||||||
ASSERT_EQUALS("'\\0' ;", tok("\"\\0\"[0] ;"));
|
ASSERT_EQUALS("'\\0' ;", tok("\"\\0\"[0] ;"));
|
||||||
ASSERT_EQUALS("'\\n' ;", tok("\"hello\\nworld\"[5] ;"));
|
ASSERT_EQUALS("'\n' ;", tok("\"hello\\nworld\"[5] ;"));
|
||||||
ASSERT_EQUALS("'w' ;", tok("\"hello\nworld\"[6] ;"));
|
ASSERT_EQUALS("'w' ;", tok("\"hello\nworld\"[6] ;"));
|
||||||
ASSERT_EQUALS("\"hello\" [ 7 ] ;", tok("\"hello\"[7] ;"));
|
ASSERT_EQUALS("\"hello\" [ 7 ] ;", tok("\"hello\"[7] ;"));
|
||||||
ASSERT_EQUALS("\"hello\" [ -1 ] ;", tok("\"hello\"[-1] ;"));
|
ASSERT_EQUALS("\"hello\" [ -1 ] ;", tok("\"hello\"[-1] ;"));
|
||||||
|
|
|
@ -282,11 +282,28 @@ private:
|
||||||
|
|
||||||
void strValue() const {
|
void strValue() const {
|
||||||
Token tok(0);
|
Token tok(0);
|
||||||
|
|
||||||
tok.str("\"\"");
|
tok.str("\"\"");
|
||||||
ASSERT_EQUALS("", tok.strValue());
|
ASSERT_EQUALS("", tok.strValue());
|
||||||
|
|
||||||
tok.str("\"0\"");
|
tok.str("\"0\"");
|
||||||
ASSERT_EQUALS("0", tok.strValue());
|
ASSERT_EQUALS("0", tok.strValue());
|
||||||
|
|
||||||
|
tok.str("\"a\\n\"");
|
||||||
|
ASSERT_EQUALS("a\n", tok.strValue());
|
||||||
|
|
||||||
|
tok.str("\"a\\r\"");
|
||||||
|
ASSERT_EQUALS("a\r", tok.strValue());
|
||||||
|
|
||||||
|
tok.str("\"a\\t\"");
|
||||||
|
ASSERT_EQUALS("a\t", tok.strValue());
|
||||||
|
|
||||||
|
tok.str("\"\\\\\"");
|
||||||
|
ASSERT_EQUALS("\\", tok.strValue());
|
||||||
|
|
||||||
|
tok.str("\"a\\0\"");
|
||||||
|
ASSERT_EQUALS("a", tok.strValue());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue