Tokenizer: Remove simplifyCharAt from simplifyTokenList2
This commit is contained in:
parent
8e4da32594
commit
343d04feb4
|
@ -780,36 +780,6 @@ nonneg int Token::getStrSize(const Token *tok, const Settings *settings)
|
||||||
return getStrArraySize(tok) * sizeofType;
|
return getStrArraySize(tok) * sizeofType;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Token::getCharAt(const Token *tok, MathLib::bigint index)
|
|
||||||
{
|
|
||||||
assert(tok != nullptr);
|
|
||||||
std::string str(getStringLiteral(tok->str()));
|
|
||||||
std::string::const_iterator it = str.begin();
|
|
||||||
const std::string::const_iterator end = str.end();
|
|
||||||
|
|
||||||
while (it != end) {
|
|
||||||
if (index == 0) {
|
|
||||||
if (*it == '\0')
|
|
||||||
return "\\0";
|
|
||||||
|
|
||||||
std::string ret(1, *it);
|
|
||||||
if (*it == '\\') {
|
|
||||||
++it;
|
|
||||||
ret += *it;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*it == '\\')
|
|
||||||
++it;
|
|
||||||
++it;
|
|
||||||
--index;
|
|
||||||
}
|
|
||||||
assert(index == 0);
|
|
||||||
|
|
||||||
return "\\0";
|
|
||||||
}
|
|
||||||
|
|
||||||
void Token::move(Token *srcStart, Token *srcEnd, Token *newLocation)
|
void Token::move(Token *srcStart, Token *srcEnd, Token *newLocation)
|
||||||
{
|
{
|
||||||
/**[newLocation] -> b -> c -> [srcStart] -> [srcEnd] -> f */
|
/**[newLocation] -> b -> c -> [srcStart] -> [srcEnd] -> f */
|
||||||
|
|
10
lib/token.h
10
lib/token.h
|
@ -356,16 +356,6 @@ public:
|
||||||
**/
|
**/
|
||||||
static nonneg int getStrSize(const Token *tok, const Settings *const settings);
|
static nonneg int getStrSize(const Token *tok, const Settings *const settings);
|
||||||
|
|
||||||
/**
|
|
||||||
* @return char of C-string at index (possible escaped "\\n")
|
|
||||||
*
|
|
||||||
* Should be called for %%str%% tokens only.
|
|
||||||
*
|
|
||||||
* @param tok token with C-string
|
|
||||||
* @param index position of character
|
|
||||||
**/
|
|
||||||
static std::string getCharAt(const Token *tok, MathLib::bigint index);
|
|
||||||
|
|
||||||
const ValueType *valueType() const {
|
const ValueType *valueType() const {
|
||||||
return mImpl->mValueType;
|
return mImpl->mValueType;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5349,8 +5349,6 @@ bool Tokenizer::simplifyTokenList2()
|
||||||
tok->clearValueFlow();
|
tok->clearValueFlow();
|
||||||
}
|
}
|
||||||
|
|
||||||
simplifyCharAt();
|
|
||||||
|
|
||||||
// simplify references
|
// simplify references
|
||||||
simplifyReference();
|
simplifyReference();
|
||||||
|
|
||||||
|
@ -8993,21 +8991,6 @@ void Tokenizer::simplifyTypeIntrinsics()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tokenizer::simplifyCharAt()
|
|
||||||
{
|
|
||||||
// Replace "string"[0] with 's'
|
|
||||||
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
|
||||||
if (Token::Match(tok, "%str% [ %num% ]")) {
|
|
||||||
const MathLib::bigint index = MathLib::toLongNumber(tok->strAt(2));
|
|
||||||
// Check within range
|
|
||||||
if (index >= 0 && index <= Token::getStrLength(tok)) {
|
|
||||||
tok->str("'" + Token::getCharAt(tok, index) + "'");
|
|
||||||
tok->deleteNext(3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tokenizer::simplifyReference()
|
void Tokenizer::simplifyReference()
|
||||||
{
|
{
|
||||||
if (isC())
|
if (isC())
|
||||||
|
|
|
@ -458,8 +458,6 @@ public:
|
||||||
*/
|
*/
|
||||||
bool simplifyRedundantParentheses();
|
bool simplifyRedundantParentheses();
|
||||||
|
|
||||||
void simplifyCharAt();
|
|
||||||
|
|
||||||
/** Simplify references */
|
/** Simplify references */
|
||||||
void simplifyReference();
|
void simplifyReference();
|
||||||
|
|
||||||
|
|
|
@ -213,7 +213,6 @@ private:
|
||||||
TEST_CASE(undefinedSizeArray);
|
TEST_CASE(undefinedSizeArray);
|
||||||
|
|
||||||
TEST_CASE(simplifyArrayAddress); // Replace "&str[num]" => "(str + num)"
|
TEST_CASE(simplifyArrayAddress); // Replace "&str[num]" => "(str + num)"
|
||||||
TEST_CASE(simplifyCharAt);
|
|
||||||
TEST_CASE(simplifyOverride); // ticket #5069
|
TEST_CASE(simplifyOverride); // ticket #5069
|
||||||
TEST_CASE(simplifyNestedNamespace);
|
TEST_CASE(simplifyNestedNamespace);
|
||||||
TEST_CASE(simplifyNamespaceAliases1);
|
TEST_CASE(simplifyNamespaceAliases1);
|
||||||
|
@ -4850,18 +4849,6 @@ private:
|
||||||
" }", tok(code, true));
|
" }", tok(code, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
void simplifyCharAt() { // ticket #4481
|
|
||||||
ASSERT_EQUALS("'h' ;", tok("\"hello\"[0] ;"));
|
|
||||||
ASSERT_EQUALS("'\\n' ;", tok("\"\\n\"[0] ;"));
|
|
||||||
ASSERT_EQUALS("'\\0' ;", tok("\"hello\"[5] ;"));
|
|
||||||
ASSERT_EQUALS("'\\0' ;", tok("\"\"[0] ;"));
|
|
||||||
ASSERT_EQUALS("'\\0' ;", tok("\"\\0\"[0] ;"));
|
|
||||||
ASSERT_EQUALS("'\\n' ;", tok("\"hello\\nworld\"[5] ;"));
|
|
||||||
ASSERT_EQUALS("'w' ;", tok("\"hello world\"[6] ;"));
|
|
||||||
ASSERT_EQUALS("\"hello\" [ 7 ] ;", tok("\"hello\"[7] ;"));
|
|
||||||
ASSERT_EQUALS("\"hello\" [ -1 ] ;", tok("\"hello\"[-1] ;"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_4881() {
|
void test_4881() {
|
||||||
const char code[] = "int evallex() {\n"
|
const char code[] = "int evallex() {\n"
|
||||||
" int c, t;\n"
|
" int c, t;\n"
|
||||||
|
|
|
@ -62,7 +62,6 @@ private:
|
||||||
TEST_CASE(stringTypes);
|
TEST_CASE(stringTypes);
|
||||||
TEST_CASE(getStrLength);
|
TEST_CASE(getStrLength);
|
||||||
TEST_CASE(getStrSize);
|
TEST_CASE(getStrSize);
|
||||||
TEST_CASE(getCharAt);
|
|
||||||
TEST_CASE(strValue);
|
TEST_CASE(strValue);
|
||||||
TEST_CASE(concatStr);
|
TEST_CASE(concatStr);
|
||||||
|
|
||||||
|
@ -412,28 +411,6 @@ private:
|
||||||
ASSERT_EQUALS(sizeof("\\"), Token::getStrSize(&tok, &settings));
|
ASSERT_EQUALS(sizeof("\\"), Token::getStrSize(&tok, &settings));
|
||||||
}
|
}
|
||||||
|
|
||||||
void getCharAt() const {
|
|
||||||
Token tok;
|
|
||||||
|
|
||||||
tok.str("\"asdf\"");
|
|
||||||
ASSERT_EQUALS("a", Token::getCharAt(&tok, 0));
|
|
||||||
ASSERT_EQUALS("s", Token::getCharAt(&tok, 1));
|
|
||||||
|
|
||||||
tok.str("\"a\\ts\"");
|
|
||||||
ASSERT_EQUALS("\\t", Token::getCharAt(&tok, 1));
|
|
||||||
|
|
||||||
tok.str("\"\"");
|
|
||||||
ASSERT_EQUALS("\\0", Token::getCharAt(&tok, 0));
|
|
||||||
|
|
||||||
tok.str("L\"a\\ts\"");
|
|
||||||
ASSERT_EQUALS("a", Token::getCharAt(&tok, 0));
|
|
||||||
ASSERT_EQUALS("\\t", Token::getCharAt(&tok, 1));
|
|
||||||
|
|
||||||
tok.str("u\"a\\ts\"");
|
|
||||||
ASSERT_EQUALS("\\t", Token::getCharAt(&tok, 1));
|
|
||||||
ASSERT_EQUALS("s", Token::getCharAt(&tok, 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
void strValue() const {
|
void strValue() const {
|
||||||
Token tok;
|
Token tok;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue