cppparser: Fix string handling in expansion of macro arguments

See #1638
This commit is contained in:
rdb 2024-03-28 10:07:12 +01:00
parent e63ba11af2
commit 014fd97fef

View File

@ -2546,26 +2546,39 @@ extract_manifest_args_inline(const string &name, int num_args,
} else { } else {
// Skip paren. // Skip paren.
p++; p++;
// Skip whitespace after paren. int paren_level = 1;
while (p < expr.size() && isspace(expr[p])) {
p++;
}
size_t q = p; size_t q = p;
while (p < expr.size() && expr[p] != ')') { while (p < expr.size()) {
if (expr[p] == ',') { if (expr[p] == ',' && paren_level == 1) {
args.push_back(trim_blanks(expr.substr(q, p - q))); args.push_back(trim_blanks(expr.substr(q, p - q)));
q = p+1; q = p+1;
} else if (expr[p] == '(') { } else if (expr[p] == '"' || expr[p] == '\'') {
// Nested parens. // Quoted string or character.
int paren_level = 1; int quote_mark = expr[p];
while (p+1 < expr.size() && paren_level > 0) { p++;
while (p < expr.size() && expr[p] != quote_mark && expr[p] != '\n') {
if (expr[p] == '\\') {
p++; p++;
if (expr[p] == '(') {
paren_level++;
} else if (expr[p] == ')') {
paren_level--;
} }
if (p < expr.size()) {
p++;
}
}
} else if (expr[p] == '(') {
++paren_level;
} else if (expr[p] == ')') {
--paren_level;
if (paren_level == 0) {
break;
}
} else if (isspace(expr[p])) {
// Skip whitespace at the beginning.
if (q == p) {
q++;
} }
} }
p++; p++;