bump simplecpp

This commit is contained in:
Daniel Marjamäki 2016-08-11 19:00:35 +02:00
parent 8253a18646
commit d220573fa5
1 changed files with 33 additions and 12 deletions

View File

@ -213,6 +213,11 @@ std::string simplecpp::TokenList::stringify() const {
std::ostringstream ret; std::ostringstream ret;
Location loc(files); Location loc(files);
for (const Token *tok = cfront(); tok; tok = tok->next) { for (const Token *tok = cfront(); tok; tok = tok->next) {
if (tok->location.line < loc.line || tok->location.fileIndex != loc.fileIndex) {
ret << "\n#line " << tok->location.line << " \"" << tok->location.file() << "\"\n";
loc = tok->location;
}
while (tok->location.line > loc.line) { while (tok->location.line > loc.line) {
ret << '\n'; ret << '\n';
loc.line++; loc.line++;
@ -315,6 +320,19 @@ bool isNameChar(unsigned char ch) {
return std::isalnum(ch) || ch == '_' || ch == '$'; return std::isalnum(ch) || ch == '_' || ch == '$';
} }
static std::string escapeString(const std::string &str) {
std::ostringstream ostr;
ostr << '\"';
for (std::size_t i = 1U; i < str.size() - 1; ++i) {
char c = str[i];
if (c == '\\' || c == '\"' || c == '\'')
ostr << '\\';
ostr << c;
}
ostr << '\"';
return ostr.str();
}
void simplecpp::TokenList::readfile(std::istream &istr, const std::string &filename, OutputList *outputList) void simplecpp::TokenList::readfile(std::istream &istr, const std::string &filename, OutputList *outputList)
{ {
std::stack<simplecpp::Location> loc; std::stack<simplecpp::Location> loc;
@ -444,7 +462,7 @@ void simplecpp::TokenList::readfile(std::istream &istr, const std::string &filen
// TODO report // TODO report
return; return;
currentToken.erase(currentToken.size() - endOfRawString.size(), endOfRawString.size() - 1U); currentToken.erase(currentToken.size() - endOfRawString.size(), endOfRawString.size() - 1U);
back()->setstr(currentToken); back()->setstr(escapeString(currentToken));
location.col += currentToken.size() + 2U + 2 * delim.size(); location.col += currentToken.size() + 2U + 2 * delim.size();
continue; continue;
} }
@ -536,6 +554,11 @@ void simplecpp::TokenList::combineOperators() {
if (tok->op == '\0' || !tok->next || tok->next->op == '\0') if (tok->op == '\0' || !tok->next || tok->next->op == '\0')
continue; continue;
if (!sameline(tok,tok->next))
continue;
if (tok->location.col + 1U != tok->next->location.col)
continue;
if (tok->next->op == '=' && tok->isOneOf("=!<>+-*/%&|^")) { if (tok->next->op == '=' && tok->isOneOf("=!<>+-*/%&|^")) {
tok->setstr(tok->str + "="); tok->setstr(tok->str + "=");
deleteToken(tok->next); deleteToken(tok->next);
@ -1382,15 +1405,11 @@ private:
TokenList tokenListHash(files); TokenList tokenListHash(files);
tok = expandToken(&tokenListHash, loc, tok->next, macros, expandedmacros, parametertokens); tok = expandToken(&tokenListHash, loc, tok->next, macros, expandedmacros, parametertokens);
std::ostringstream ostr; std::ostringstream ostr;
for (const Token *hashtok = tokenListHash.cfront(); hashtok; hashtok = hashtok->next) { ostr << '\"';
for (unsigned int i = 0; i < hashtok->str.size(); i++) { for (const Token *hashtok = tokenListHash.cfront(); hashtok; hashtok = hashtok->next)
unsigned char c = hashtok->str[i]; ostr << hashtok->str;
if (c == '\"' || c == '\\' || c == '\'') ostr << '\"';
ostr << '\\'; output->push_back(newMacroToken(escapeString(ostr.str()), loc, isReplaced(expandedmacros)));
ostr << c;
}
}
output->push_back(newMacroToken('\"' + ostr.str() + '\"', loc, isReplaced(expandedmacros)));
return tok; return tok;
} }
@ -1807,8 +1826,10 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
err.msg = '#' + rawtok->str + ' ' + err.msg; err.msg = '#' + rawtok->str + ' ' + err.msg;
outputList->push_back(err); outputList->push_back(err);
} }
output.clear(); if (rawtok->str == ERROR) {
return; output.clear();
return;
}
} }
if (rawtok->str == DEFINE) { if (rawtok->str == DEFINE) {