bump simplecpp to rev b50ced8ac14f8debab9e85e78036f881ff2b3965
This commit is contained in:
parent
28f1222dc2
commit
b97bdb5300
|
@ -342,6 +342,16 @@ static std::string escapeString(const std::string &str) {
|
||||||
return ostr.str();
|
return ostr.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void portabilityBackslash(simplecpp::OutputList *outputList, const std::vector<std::string> &files, const simplecpp::Location &location) {
|
||||||
|
if (!outputList)
|
||||||
|
return;
|
||||||
|
simplecpp::Output err(files);
|
||||||
|
err.type = simplecpp::Output::PORTABILITY_BACKSLASH;
|
||||||
|
err.location = location;
|
||||||
|
err.msg = "Combination 'backslash space newline' is not portable.";
|
||||||
|
outputList->push_back(err);
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
@ -363,6 +373,8 @@ void simplecpp::TokenList::readfile(std::istream &istr, const std::string &filen
|
||||||
|
|
||||||
if (ch == '\n') {
|
if (ch == '\n') {
|
||||||
if (cback() && cback()->op == '\\') {
|
if (cback() && cback()->op == '\\') {
|
||||||
|
if (location.col > cback()->location.col + 1U)
|
||||||
|
portabilityBackslash(outputList, files, cback()->location);
|
||||||
++multiline;
|
++multiline;
|
||||||
deleteToken(back());
|
deleteToken(back());
|
||||||
} else {
|
} else {
|
||||||
|
@ -415,6 +427,9 @@ void simplecpp::TokenList::readfile(std::istream &istr, const std::string &filen
|
||||||
currentToken += ch;
|
currentToken += ch;
|
||||||
ch = readChar(istr, bom);
|
ch = readChar(istr, bom);
|
||||||
}
|
}
|
||||||
|
const std::string::size_type pos = currentToken.find_last_not_of(" \t");
|
||||||
|
if (pos < currentToken.size() - 1U && currentToken[pos] == '\\')
|
||||||
|
portabilityBackslash(outputList, files, location);
|
||||||
if (currentToken[currentToken.size() - 1U] == '\\') {
|
if (currentToken[currentToken.size() - 1U] == '\\') {
|
||||||
++multiline;
|
++multiline;
|
||||||
currentToken.erase(currentToken.size() - 1U);
|
currentToken.erase(currentToken.size() - 1U);
|
||||||
|
@ -1464,7 +1479,7 @@ private:
|
||||||
Token *A = output->back();
|
Token *A = output->back();
|
||||||
if (!A)
|
if (!A)
|
||||||
throw invalidHashHash(tok->location, name());
|
throw invalidHashHash(tok->location, name());
|
||||||
if (!sameline(tok, tok->next))
|
if (!sameline(tok, tok->next) || !sameline(tok, tok->next->next))
|
||||||
throw invalidHashHash(tok->location, name());
|
throw invalidHashHash(tok->location, name());
|
||||||
|
|
||||||
Token *B = tok->next->next;
|
Token *B = tok->next->next;
|
||||||
|
@ -1820,6 +1835,31 @@ std::map<std::string, simplecpp::TokenList*> simplecpp::load(const simplecpp::To
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool preprocessToken(simplecpp::TokenList &output, const simplecpp::Token **tok1, std::map<std::string, simplecpp::Macro> ¯os, std::vector<std::string> &files, simplecpp::OutputList *outputList) {
|
||||||
|
const simplecpp::Token *tok = *tok1;
|
||||||
|
const std::map<std::string,simplecpp::Macro>::const_iterator it = macros.find(tok->str);
|
||||||
|
if (it != macros.end()) {
|
||||||
|
simplecpp::TokenList value(files);
|
||||||
|
try {
|
||||||
|
*tok1 = it->second.expand(&value, tok, macros, files);
|
||||||
|
} catch (simplecpp::Macro::Error &err) {
|
||||||
|
simplecpp::Output out(files);
|
||||||
|
out.type = simplecpp::Output::SYNTAX_ERROR;
|
||||||
|
out.location = err.location;
|
||||||
|
out.msg = "failed to expand \'" + tok->str + "\', " + err.what;
|
||||||
|
if (outputList)
|
||||||
|
outputList->push_back(out);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
output.takeTokens(value);
|
||||||
|
} else {
|
||||||
|
if (!tok->comment)
|
||||||
|
output.push_back(new simplecpp::Token(*tok));
|
||||||
|
*tok1 = tok->next;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenList &rawtokens, std::vector<std::string> &files, const std::map<std::string, simplecpp::TokenList *> &filedata, const simplecpp::DUI &dui, simplecpp::OutputList *outputList, std::list<simplecpp::MacroUsage> *macroUsage)
|
void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenList &rawtokens, std::vector<std::string> &files, const std::map<std::string, simplecpp::TokenList *> &filedata, const simplecpp::DUI &dui, simplecpp::OutputList *outputList, std::list<simplecpp::MacroUsage> *macroUsage)
|
||||||
{
|
{
|
||||||
std::map<std::string, std::size_t> sizeOfType(rawtokens.sizeOfType);
|
std::map<std::string, std::size_t> sizeOfType(rawtokens.sizeOfType);
|
||||||
|
@ -1930,8 +1970,37 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
|
||||||
} catch (const std::runtime_error &) {
|
} catch (const std::runtime_error &) {
|
||||||
}
|
}
|
||||||
} else if (ifstates.top() == TRUE && rawtok->str == INCLUDE) {
|
} else if (ifstates.top() == TRUE && rawtok->str == INCLUDE) {
|
||||||
const bool systemheader = (rawtok->next->str[0] == '<');
|
TokenList inc1(files);
|
||||||
const std::string header(realFilename(rawtok->next->str.substr(1U, rawtok->next->str.size() - 2U)));
|
for (const Token *inctok = rawtok->next; sameline(rawtok,inctok); inctok = inctok->next) {
|
||||||
|
if (!inctok->comment)
|
||||||
|
inc1.push_back(new Token(*inctok));
|
||||||
|
}
|
||||||
|
TokenList inc2(files);
|
||||||
|
if (!inc1.empty() && inc1.cfront()->name) {
|
||||||
|
const Token *inctok = inc1.cfront();
|
||||||
|
if (!preprocessToken(inc2, &inctok, macros, files, outputList)) {
|
||||||
|
output.clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
inc2.takeTokens(inc1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inc2.empty()) {
|
||||||
|
simplecpp::Output err(files);
|
||||||
|
err.type = Output::SYNTAX_ERROR;
|
||||||
|
err.location = rawtok->location;
|
||||||
|
err.msg = "No header in #include";
|
||||||
|
if (outputList)
|
||||||
|
outputList->push_back(err);
|
||||||
|
output.clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Token *inctok = inc2.cfront();
|
||||||
|
|
||||||
|
const bool systemheader = (inctok->op == '<');
|
||||||
|
const std::string header(realFilename(inctok->str.substr(1U, inctok->str.size() - 2U)));
|
||||||
const std::string header2 = getFileName(filedata, rawtok->location.file(), header, dui, systemheader);
|
const std::string header2 = getFileName(filedata, rawtok->location.file(), header, dui, systemheader);
|
||||||
if (header2.empty()) {
|
if (header2.empty()) {
|
||||||
simplecpp::Output output(files);
|
simplecpp::Output output(files);
|
||||||
|
@ -1996,24 +2065,10 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<std::string,Macro>::const_iterator it = macros.find(tok->str);
|
const Token *tmp = tok;
|
||||||
if (it != macros.end()) {
|
if (!preprocessToken(expr, &tmp, macros, files, outputList)) {
|
||||||
TokenList value(files);
|
output.clear();
|
||||||
try {
|
return;
|
||||||
it->second.expand(&value, tok, macros, files);
|
|
||||||
} catch (Macro::Error &err) {
|
|
||||||
Output out(rawtok->location.files);
|
|
||||||
out.type = Output::SYNTAX_ERROR;
|
|
||||||
out.location = err.location;
|
|
||||||
out.msg = "failed to expand \'" + tok->str + "\', " + err.what;
|
|
||||||
if (outputList)
|
|
||||||
outputList->push_back(out);
|
|
||||||
output.clear();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
expr.takeTokens(value);
|
|
||||||
} else {
|
|
||||||
expr.push_back(new Token(*tok));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -2081,28 +2136,9 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
|
||||||
const Location loc(rawtok->location);
|
const Location loc(rawtok->location);
|
||||||
TokenList tokens(files);
|
TokenList tokens(files);
|
||||||
|
|
||||||
if (macros.find(rawtok->str) != macros.end()) {
|
if (!preprocessToken(tokens, &rawtok, macros, files, outputList)) {
|
||||||
std::map<TokenString,Macro>::const_iterator macro = macros.find(rawtok->str);
|
output.clear();
|
||||||
if (macro != macros.end()) {
|
return;
|
||||||
try {
|
|
||||||
rawtok = macro->second.expand(&tokens, rawtok, macros, files);
|
|
||||||
} catch (const simplecpp::Macro::Error &err) {
|
|
||||||
Output out(err.location.files);
|
|
||||||
out.type = Output::SYNTAX_ERROR;
|
|
||||||
out.location = err.location;
|
|
||||||
out.msg = err.what;
|
|
||||||
if (outputList)
|
|
||||||
outputList->push_back(out);
|
|
||||||
output.clear();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else {
|
|
||||||
if (!rawtok->comment)
|
|
||||||
tokens.push_back(new Token(*rawtok));
|
|
||||||
rawtok = rawtok->next;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hash || hashhash) {
|
if (hash || hashhash) {
|
||||||
|
|
|
@ -158,7 +158,8 @@ struct SIMPLECPP_LIB Output {
|
||||||
WARNING, /* #warning */
|
WARNING, /* #warning */
|
||||||
MISSING_HEADER,
|
MISSING_HEADER,
|
||||||
INCLUDE_NESTED_TOO_DEEPLY,
|
INCLUDE_NESTED_TOO_DEEPLY,
|
||||||
SYNTAX_ERROR
|
SYNTAX_ERROR,
|
||||||
|
PORTABILITY_BACKSLASH
|
||||||
} type;
|
} type;
|
||||||
Location location;
|
Location location;
|
||||||
std::string msg;
|
std::string msg;
|
||||||
|
|
|
@ -496,6 +496,7 @@ static bool hasErrors(const simplecpp::OutputList &outputList)
|
||||||
return true;
|
return true;
|
||||||
case simplecpp::Output::WARNING:
|
case simplecpp::Output::WARNING:
|
||||||
case simplecpp::Output::MISSING_HEADER:
|
case simplecpp::Output::MISSING_HEADER:
|
||||||
|
case simplecpp::Output::PORTABILITY_BACKSLASH:
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -664,6 +665,7 @@ void Preprocessor::reportOutput(const simplecpp::OutputList &outputList, bool sh
|
||||||
error(it->location.file(), it->location.line, it->msg);
|
error(it->location.file(), it->location.line, it->msg);
|
||||||
break;
|
break;
|
||||||
case simplecpp::Output::WARNING:
|
case simplecpp::Output::WARNING:
|
||||||
|
case simplecpp::Output::PORTABILITY_BACKSLASH:
|
||||||
break;
|
break;
|
||||||
case simplecpp::Output::MISSING_HEADER: {
|
case simplecpp::Output::MISSING_HEADER: {
|
||||||
const std::string::size_type pos1 = it->msg.find_first_of("<\"");
|
const std::string::size_type pos1 = it->msg.find_first_of("<\"");
|
||||||
|
|
|
@ -1510,7 +1510,7 @@ private:
|
||||||
// Compare results..
|
// Compare results..
|
||||||
ASSERT_EQUALS(1, static_cast<unsigned int>(actual.size()));
|
ASSERT_EQUALS(1, static_cast<unsigned int>(actual.size()));
|
||||||
ASSERT_EQUALS("", actual[""]);
|
ASSERT_EQUALS("", actual[""]);
|
||||||
ASSERT_EQUALS("[file.c:6]: (error) Wrong number of parameters for macro 'BC'.\n", errout.str());
|
ASSERT_EQUALS("[file.c:6]: (error) failed to expand 'BC', Wrong number of parameters for macro 'BC'.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void newline_in_macro() {
|
void newline_in_macro() {
|
||||||
|
|
Loading…
Reference in New Issue