From d606eb5ed907b393015737308bf39e1b5642e931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 3 Jul 2020 11:42:58 +0200 Subject: [PATCH] Bump simplecpp --- externals/simplecpp/simplecpp.cpp | 123 +++++++++++++++++------------- 1 file changed, 70 insertions(+), 53 deletions(-) diff --git a/externals/simplecpp/simplecpp.cpp b/externals/simplecpp/simplecpp.cpp index 6de395055..c78bc8746 100644 --- a/externals/simplecpp/simplecpp.cpp +++ b/externals/simplecpp/simplecpp.cpp @@ -1026,15 +1026,15 @@ void simplecpp::TokenList::constFoldBitwise(Token *tok) { Token * const tok1 = tok; for (const char *op = "&^|"; *op; op++) { - const std::string* altop; + const std::string* alternativeOp; if (*op == '&') - altop = &BITAND; + alternativeOp = &BITAND; else if (*op == '|') - altop = &BITOR; + alternativeOp = &BITOR; else - altop = &XOR; + alternativeOp = &XOR; for (tok = tok1; tok && tok->op != ')'; tok = tok->next) { - if (tok->op != *op && !isAlternativeBinaryOp(tok, *altop)) + if (tok->op != *op && !isAlternativeBinaryOp(tok, *alternativeOp)) continue; if (!tok->previous || !tok->previous->number) continue; @@ -1472,7 +1472,8 @@ namespace simplecpp { } const Token *appendTokens(TokenList *tokens, - const Token *lpar, + const Location &rawloc, + const Token * const lpar, const std::map ¯os, const std::set &expandedmacros, const std::vector ¶metertokens) const { @@ -1483,17 +1484,17 @@ namespace simplecpp { while (sameline(lpar, tok)) { if (tok->op == '#' && sameline(tok,tok->next) && tok->next->op == '#' && sameline(tok,tok->next->next)) { // A##B => AB - tok = expandHashHash(tokens, tok->location, tok, macros, expandedmacros, parametertokens); + tok = expandHashHash(tokens, rawloc, tok, macros, expandedmacros, parametertokens); } else if (tok->op == '#' && sameline(tok, tok->next) && tok->next->op != '#') { - tok = expandHash(tokens, tok->location, tok, macros, expandedmacros, parametertokens); + tok = expandHash(tokens, rawloc, tok, macros, expandedmacros, parametertokens); } else { - if (!expandArg(tokens, tok, tok->location, macros, expandedmacros, parametertokens)) { + if (!expandArg(tokens, tok, rawloc, macros, expandedmacros, parametertokens)) { bool expanded = false; const std::map::const_iterator it = macros.find(tok->str()); if (it != macros.end() && expandedmacros.find(tok->str()) == expandedmacros.end()) { const Macro &m = it->second; if (!m.functionLike()) { - m.expand(tokens, tok->location, tok, macros, expandedmacros); + m.expand(tokens, rawloc, tok, macros, expandedmacros); expanded = true; } } @@ -1511,6 +1512,8 @@ namespace simplecpp { tok = tok->next; } } + for (Token *tok2 = tokens->front(); tok2; tok2 = tok2->next) + tok2->location = lpar->location; return sameline(lpar,tok) ? tok : NULL; } @@ -1612,13 +1615,19 @@ namespace simplecpp { hashToken = hashToken->next; ++numberOfHash; } - if (numberOfHash == 4) { + if (numberOfHash == 4 && tok->next->location.col + 1 == tok->next->next->location.col) { // # ## # => ## output->push_back(newMacroToken("##", loc, isReplaced(expandedmacros))); tok = hashToken; continue; } + if (numberOfHash >= 2 && tok->location.col + 1 < tok->next->location.col) { + output->push_back(new Token(*tok)); + tok = tok->next; + continue; + } + tok = tok->next; if (tok == endToken) { output->push_back(new Token(*tok->previous)); @@ -1645,6 +1654,41 @@ namespace simplecpp { return functionLike() ? parametertokens2.back()->next : nameTokInst->next; } + const Token *recursiveExpandToken(TokenList *output, TokenList &temp, const Location &loc, const Token *tok, const std::map ¯os, const std::set &expandedmacros, const std::vector ¶metertokens) const { + if (!(temp.cback() && temp.cback()->name && tok->next && tok->next->op == '(')) { + output->takeTokens(temp); + return tok->next; + } + + if (!sameline(tok, tok->next)) { + output->takeTokens(temp); + return tok->next; + } + + const std::map::const_iterator it = macros.find(temp.cback()->str()); + if (it == macros.end() || expandedmacros.find(temp.cback()->str()) != expandedmacros.end()) { + output->takeTokens(temp); + return tok->next; + } + + const Macro &calledMacro = it->second; + if (!calledMacro.functionLike()) { + output->takeTokens(temp); + return tok->next; + } + + TokenList temp2(files); + temp2.push_back(new Token(temp.cback()->str(), tok->location)); + + const Token *tok2 = appendTokens(&temp2, loc, tok->next, macros, expandedmacros, parametertokens); + if (!tok2) + return tok->next; + output->takeTokens(temp); + output->deleteToken(output->back()); + calledMacro.expand(output, loc, temp2.cfront(), macros, expandedmacros); + return tok2->next; + } + const Token *expandToken(TokenList *output, const Location &loc, const Token *tok, const std::map ¯os, const std::set &expandedmacros, const std::vector ¶metertokens) const { // Not name.. if (!tok->name) { @@ -1655,63 +1699,36 @@ namespace simplecpp { // Macro parameter.. { TokenList temp(files); - if (expandArg(&temp, tok, loc, macros, expandedmacros, parametertokens)) { - if (!(temp.cback() && temp.cback()->name && tok->next && tok->next->op == '(')) { - output->takeTokens(temp); - return tok->next; - } - - if (!sameline(tok, tok->next)) { - output->takeTokens(temp); - return tok->next; - } - - const std::map::const_iterator it = macros.find(temp.cback()->str()); - if (it == macros.end() || expandedmacros.find(temp.cback()->str()) != expandedmacros.end()) { - output->takeTokens(temp); - return tok->next; - } - - const Macro &calledMacro = it->second; - if (!calledMacro.functionLike()) { - output->takeTokens(temp); - return tok->next; - } - - TokenList temp2(files); - temp2.push_back(new Token(temp.cback()->str(), tok->location)); - - const Token *tok2 = appendTokens(&temp2, tok->next, macros, expandedmacros, parametertokens); - if (!tok2) - return tok->next; - - output->takeTokens(temp); - output->deleteToken(output->back()); - calledMacro.expand(output, loc, temp2.cfront(), macros, expandedmacros); - - return tok2->next; - } + if (expandArg(&temp, tok, loc, macros, expandedmacros, parametertokens)) + return recursiveExpandToken(output, temp, loc, tok, macros, expandedmacros, parametertokens); } // Macro.. const std::map::const_iterator it = macros.find(tok->str()); if (it != macros.end() && expandedmacros.find(tok->str()) == expandedmacros.end()) { + std::set expandedmacros2(expandedmacros); + expandedmacros2.insert(tok->str()); + const Macro &calledMacro = it->second; - if (!calledMacro.functionLike()) - return calledMacro.expand(output, loc, tok, macros, expandedmacros); + if (!calledMacro.functionLike()) { + TokenList temp(files); + calledMacro.expand(&temp, loc, tok, macros, expandedmacros); + return recursiveExpandToken(output, temp, loc, tok, macros, expandedmacros2, parametertokens); + } if (!sameline(tok, tok->next) || tok->next->op != '(') { output->push_back(newMacroToken(tok->str(), loc, true)); return tok->next; } TokenList tokens(files); tokens.push_back(new Token(*tok)); - const Token *tok2 = appendTokens(&tokens, tok->next, macros, expandedmacros, parametertokens); + const Token *tok2 = appendTokens(&tokens, loc, tok->next, macros, expandedmacros, parametertokens); if (!tok2) { output->push_back(newMacroToken(tok->str(), loc, true)); return tok->next; } - calledMacro.expand(output, loc, tokens.cfront(), macros, expandedmacros); - return tok2->next; + TokenList temp(files); + calledMacro.expand(&temp, loc, tokens.cfront(), macros, expandedmacros); + return recursiveExpandToken(output, temp, loc, tok2, macros, expandedmacros2, parametertokens); } else if (tok->str() == DEFINED) { @@ -1879,7 +1896,7 @@ namespace simplecpp { if (tokensB.empty() && sameline(B,B->next) && B->next->op=='(') { const std::map::const_iterator it = macros.find(strAB); if (it != macros.end() && expandedmacros.find(strAB) == expandedmacros.end() && it->second.functionLike()) { - const Token *tok2 = appendTokens(&tokens, B->next, macros, expandedmacros, parametertokens); + const Token *tok2 = appendTokens(&tokens, loc, B->next, macros, expandedmacros, parametertokens); if (tok2) nextTok = tok2->next; }