bump simplecpp

This commit is contained in:
Daniel Marjamäki 2019-05-01 20:35:52 +02:00
parent 76cc8ccde2
commit 383e1b7cd1
2 changed files with 28 additions and 22 deletions

View File

@ -446,16 +446,23 @@ void simplecpp::TokenList::readfile(std::istream &istr, const std::string &filen
location.fileIndex = fileIndex(cback()->str().substr(1U, cback()->str().size() - 2U)); location.fileIndex = fileIndex(cback()->str().substr(1U, cback()->str().size() - 2U));
location.line = 1U; location.line = 1U;
} else if (lastline == "# line %num%") { } else if (lastline == "# line %num%") {
loc.push(location); const Location loc1 = location;
location.line = std::atol(cback()->str().c_str()); location.line = std::atol(cback()->str().c_str());
if (location.line < loc1.line)
location.line = loc1.line;
} else if (lastline == "# line %num% %str%") { } else if (lastline == "# line %num% %str%") {
loc.push(location); const Location loc1 = location;
location.fileIndex = fileIndex(cback()->str().substr(1U, cback()->str().size() - 2U)); location.fileIndex = fileIndex(cback()->str().substr(1U, cback()->str().size() - 2U));
location.line = std::atol(cback()->previous->str().c_str()); location.line = std::atol(cback()->previous->str().c_str());
if (loc1.fileIndex == location.fileIndex && location.line < loc1.line)
location.line = loc1.line;
} else if (lastline == "# %num% %str%") { } else if (lastline == "# %num% %str%") {
const Location loc1 = location;
loc.push(location); loc.push(location);
location.fileIndex = fileIndex(cback()->str().substr(1U, cback()->str().size() - 2U)); location.fileIndex = fileIndex(cback()->str().substr(1U, cback()->str().size() - 2U));
location.line = std::atol(cback()->previous->str().c_str()); location.line = std::atol(cback()->previous->str().c_str());
if (loc1.fileIndex == location.fileIndex && location.line < loc1.line)
location.line = loc1.line;
} }
// #endfile // #endfile
else if (lastline == "# endfile" && !loc.empty()) { else if (lastline == "# endfile" && !loc.empty()) {
@ -548,7 +555,8 @@ void simplecpp::TokenList::readfile(std::istream &istr, const std::string &filen
else if (ch == '\"' || ch == '\'') { else if (ch == '\"' || ch == '\'') {
std::string prefix; std::string prefix;
if (cback() && cback()->name && isStringLiteralPrefix(cback()->str()) && if (cback() && cback()->name && isStringLiteralPrefix(cback()->str()) &&
((cback()->location.col + cback()->str().size()) == location.col)) { ((cback()->location.col + cback()->str().size()) == location.col) &&
(cback()->location.line == location.line)) {
prefix = cback()->str(); prefix = cback()->str();
} }
// C++11 raw string literal // C++11 raw string literal
@ -1116,9 +1124,9 @@ std::string simplecpp::TokenList::lastLine(int maxsize) const
if (tok->comment) if (tok->comment)
continue; continue;
if (!ret.empty()) if (!ret.empty())
ret = ' ' + ret; ret.insert(0, 1, ' ');
ret = (tok->str()[0] == '\"' ? std::string("%str%") ret.insert(0, tok->str()[0] == '\"' ? std::string("%str%")
: tok->number ? std::string("%num%") : tok->str()) + ret; : tok->number ? std::string("%num%") : tok->str());
if (++count > maxsize) if (++count > maxsize)
return ""; return "";
} }
@ -2016,7 +2024,7 @@ static std::string realFilename(const std::string &f)
continue; continue;
} }
bool isDriveSpecification = bool isDriveSpecification =
(pos == 2 && subpath.size() == 2 && std::isalpha(subpath[0]) && subpath[1] == ':'); (pos == 2 && subpath.size() == 2 && std::isalpha(subpath[0]) && subpath[1] == ':');
// Append real filename (proper case) // Append real filename (proper case)
@ -2282,23 +2290,21 @@ static std::string _openHeader(std::ifstream &f, const std::string &path)
#endif #endif
} }
static std::string openHeader(std::ifstream &f, const simplecpp::DUI &dui, const std::string &sourcefile, const std::string &header, bool systemheader) static std::string openHeader(std::ifstream &f, const simplecpp::DUI &dui, const std::string &sourcefile, const std::string &header)
{ {
if (isAbsolutePath(header)) { if (isAbsolutePath(header)) {
return _openHeader(f, header); return _openHeader(f, header);
} }
if (!systemheader) { if (sourcefile.find_first_of("\\/") != std::string::npos) {
if (sourcefile.find_first_of("\\/") != std::string::npos) { const std::string s = sourcefile.substr(0, sourcefile.find_last_of("\\/") + 1U) + header;
const std::string s = sourcefile.substr(0, sourcefile.find_last_of("\\/") + 1U) + header; const std::string simplePath = _openHeader(f, s);
std::string simplePath = _openHeader(f, s); if (!simplePath.empty())
if (!simplePath.empty()) return simplePath;
return simplePath; } else {
} else { const std::string simplePath = _openHeader(f, header);
std::string simplePath = _openHeader(f, header); if (!simplePath.empty())
if (!simplePath.empty()) return simplePath;
return simplePath;
}
} }
for (std::list<std::string>::const_iterator it = dui.includePaths.begin(); it != dui.includePaths.end(); ++it) { for (std::list<std::string>::const_iterator it = dui.includePaths.begin(); it != dui.includePaths.end(); ++it) {
@ -2407,7 +2413,7 @@ std::map<std::string, simplecpp::TokenList*> simplecpp::load(const simplecpp::To
continue; continue;
std::ifstream f; std::ifstream f;
const std::string header2 = openHeader(f,dui,sourcefile,header,systemheader); const std::string header2 = openHeader(f,dui,sourcefile,header);
if (!f.is_open()) if (!f.is_open())
continue; continue;
@ -2628,7 +2634,7 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
if (header2.empty()) { if (header2.empty()) {
// try to load file.. // try to load file..
std::ifstream f; std::ifstream f;
header2 = openHeader(f, dui, rawtok->location.file(), header, systemheader); header2 = openHeader(f, dui, rawtok->location.file(), header);
if (f.is_open()) { if (f.is_open()) {
TokenList *tokens = new TokenList(f, files, header2, outputList); TokenList *tokens = new TokenList(f, files, header2, outputList);
filedata[header2] = tokens; filedata[header2] = tokens;

View File

@ -108,7 +108,7 @@ namespace simplecpp {
void flags() { void flags() {
name = (std::isalpha((unsigned char)string[0]) || string[0] == '_' || string[0] == '$'); name = (std::isalpha((unsigned char)string[0]) || string[0] == '_' || string[0] == '$');
comment = (string.compare(0, 2, "//") == 0 || string.compare(0, 2, "/*") == 0); comment = string.size() > 1U && string[0] == '/' && (string[1] == '/' || string[1] == '*');
number = std::isdigit((unsigned char)string[0]) || (string.size() > 1U && string[0] == '-' && std::isdigit((unsigned char)string[1])); number = std::isdigit((unsigned char)string[0]) || (string.size() > 1U && string[0] == '-' && std::isdigit((unsigned char)string[1]));
op = (string.size() == 1U) ? string[0] : '\0'; op = (string.size() == 1U) ? string[0] : '\0';
} }