bump simplecpp to rev d1c995c03515d289c7aa7246a74d666fd012c4eb
This commit is contained in:
parent
a4acfaa230
commit
b04f6fb359
|
@ -814,15 +814,17 @@ void simplecpp::TokenList::constFoldQuestionOp(Token **tok1) {
|
||||||
gotoTok1 = false;
|
gotoTok1 = false;
|
||||||
if (tok->str != "?")
|
if (tok->str != "?")
|
||||||
continue;
|
continue;
|
||||||
if (!tok->previous || !tok->previous->number)
|
if (!tok->previous || !tok->next || !tok->next->next)
|
||||||
|
throw std::runtime_error("invalid expression");
|
||||||
|
if (!tok->previous->number)
|
||||||
continue;
|
continue;
|
||||||
if (!tok->next)
|
if (tok->next->next->op != ':')
|
||||||
continue;
|
|
||||||
if (!tok->next->next || tok->next->next->op != ':')
|
|
||||||
continue;
|
continue;
|
||||||
Token * const condTok = tok->previous;
|
Token * const condTok = tok->previous;
|
||||||
Token * const trueTok = tok->next;
|
Token * const trueTok = tok->next;
|
||||||
Token * const falseTok = trueTok->next->next;
|
Token * const falseTok = trueTok->next->next;
|
||||||
|
if (!falseTok)
|
||||||
|
throw std::runtime_error("invalid expression");
|
||||||
if (condTok == *tok1)
|
if (condTok == *tok1)
|
||||||
*tok1 = (condTok->str != "0" ? trueTok : falseTok);
|
*tok1 = (condTok->str != "0" ? trueTok : falseTok);
|
||||||
deleteToken(condTok->next); // ?
|
deleteToken(condTok->next); // ?
|
||||||
|
@ -906,20 +908,23 @@ public:
|
||||||
throw std::runtime_error("bad macro syntax");
|
throw std::runtime_error("bad macro syntax");
|
||||||
if (tok->op != '#')
|
if (tok->op != '#')
|
||||||
throw std::runtime_error("bad macro syntax");
|
throw std::runtime_error("bad macro syntax");
|
||||||
|
const Token * const hashtok = tok;
|
||||||
tok = tok->next;
|
tok = tok->next;
|
||||||
if (!tok || tok->str != DEFINE)
|
if (!tok || tok->str != DEFINE)
|
||||||
throw std::runtime_error("bad macro syntax");
|
throw std::runtime_error("bad macro syntax");
|
||||||
tok = tok->next;
|
tok = tok->next;
|
||||||
if (!tok || !tok->name)
|
if (!tok || !tok->name || !sameline(hashtok,tok))
|
||||||
|
throw std::runtime_error("bad macro syntax");
|
||||||
|
if (!parseDefine(tok))
|
||||||
throw std::runtime_error("bad macro syntax");
|
throw std::runtime_error("bad macro syntax");
|
||||||
parseDefine(tok);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Macro(const std::string &name, const std::string &value, std::vector<std::string> &f) : nameToken(NULL), files(f), tokenListDefine(f) {
|
Macro(const std::string &name, const std::string &value, std::vector<std::string> &f) : nameToken(NULL), files(f), tokenListDefine(f) {
|
||||||
const std::string def(name + ' ' + value);
|
const std::string def(name + ' ' + value);
|
||||||
std::istringstream istr(def);
|
std::istringstream istr(def);
|
||||||
tokenListDefine.readfile(istr);
|
tokenListDefine.readfile(istr);
|
||||||
parseDefine(tokenListDefine.cfront());
|
if (!parseDefine(tokenListDefine.cfront()))
|
||||||
|
throw std::runtime_error("bad macro syntax");
|
||||||
}
|
}
|
||||||
|
|
||||||
Macro(const Macro ¯o) : nameToken(NULL), files(macro.files), tokenListDefine(macro.files) {
|
Macro(const Macro ¯o) : nameToken(NULL), files(macro.files), tokenListDefine(macro.files) {
|
||||||
|
@ -1080,20 +1085,20 @@ private:
|
||||||
return tok;
|
return tok;
|
||||||
}
|
}
|
||||||
|
|
||||||
void parseDefine(const Token *nametoken) {
|
bool parseDefine(const Token *nametoken) {
|
||||||
nameToken = nametoken;
|
nameToken = nametoken;
|
||||||
variadic = false;
|
variadic = false;
|
||||||
if (!nameToken) {
|
if (!nameToken) {
|
||||||
valueToken = endToken = NULL;
|
valueToken = endToken = NULL;
|
||||||
args.clear();
|
args.clear();
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// function like macro..
|
// function like macro..
|
||||||
if (functionLike()) {
|
if (functionLike()) {
|
||||||
args.clear();
|
args.clear();
|
||||||
const Token *argtok = nameToken->next->next;
|
const Token *argtok = nameToken->next->next;
|
||||||
while (argtok && argtok->op != ')') {
|
while (sameline(nametoken, argtok) && argtok->op != ')') {
|
||||||
if (argtok->op == '.' &&
|
if (argtok->op == '.' &&
|
||||||
argtok->next && argtok->next->op == '.' &&
|
argtok->next && argtok->next->op == '.' &&
|
||||||
argtok->next->next && argtok->next->next->op == '.' &&
|
argtok->next->next && argtok->next->next->op == '.' &&
|
||||||
|
@ -1108,6 +1113,9 @@ private:
|
||||||
args.push_back(argtok->str);
|
args.push_back(argtok->str);
|
||||||
argtok = argtok->next;
|
argtok = argtok->next;
|
||||||
}
|
}
|
||||||
|
if (!sameline(nametoken, argtok)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
valueToken = argtok ? argtok->next : NULL;
|
valueToken = argtok ? argtok->next : NULL;
|
||||||
} else {
|
} else {
|
||||||
args.clear();
|
args.clear();
|
||||||
|
@ -1119,6 +1127,7 @@ private:
|
||||||
endToken = valueToken;
|
endToken = valueToken;
|
||||||
while (sameline(endToken, nameToken))
|
while (sameline(endToken, nameToken))
|
||||||
endToken = endToken->next;
|
endToken = endToken->next;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int getArgNum(const TokenString &str) const {
|
unsigned int getArgNum(const TokenString &str) const {
|
||||||
|
@ -1895,7 +1904,7 @@ static bool preprocessToken(simplecpp::TokenList &output, const simplecpp::Token
|
||||||
return true;
|
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, 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);
|
||||||
sizeOfType.insert(std::pair<std::string, std::size_t>(std::string("char"), sizeof(char)));
|
sizeOfType.insert(std::pair<std::string, std::size_t>(std::string("char"), sizeof(char)));
|
||||||
|
@ -2003,6 +2012,14 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
|
||||||
it->second = macro;
|
it->second = macro;
|
||||||
}
|
}
|
||||||
} catch (const std::runtime_error &) {
|
} catch (const std::runtime_error &) {
|
||||||
|
simplecpp::Output err(files);
|
||||||
|
err.type = Output::SYNTAX_ERROR;
|
||||||
|
err.location = rawtok->location;
|
||||||
|
err.msg = "Failed to parse #define";
|
||||||
|
if (outputList)
|
||||||
|
outputList->push_back(err);
|
||||||
|
output.clear();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} else if (ifstates.top() == TRUE && rawtok->str == INCLUDE) {
|
} else if (ifstates.top() == TRUE && rawtok->str == INCLUDE) {
|
||||||
TokenList inc1(files);
|
TokenList inc1(files);
|
||||||
|
@ -2021,7 +2038,7 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
|
||||||
inc2.takeTokens(inc1);
|
inc2.takeTokens(inc1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inc2.empty()) {
|
if (inc2.empty() || inc2.cfront()->str.size() <= 2U) {
|
||||||
simplecpp::Output err(files);
|
simplecpp::Output err(files);
|
||||||
err.type = Output::SYNTAX_ERROR;
|
err.type = Output::SYNTAX_ERROR;
|
||||||
err.location = rawtok->location;
|
err.location = rawtok->location;
|
||||||
|
@ -2036,7 +2053,16 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
|
||||||
|
|
||||||
const bool systemheader = (inctok->op == '<');
|
const bool systemheader = (inctok->op == '<');
|
||||||
const std::string header(realFilename(inctok->str.substr(1U, inctok->str.size() - 2U)));
|
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);
|
std::string header2 = getFileName(filedata, rawtok->location.file(), header, dui, systemheader);
|
||||||
|
if (header2.empty()) {
|
||||||
|
// try to load file..
|
||||||
|
std::ifstream f;
|
||||||
|
header2 = openHeader(f, dui, rawtok->location.file(), header, systemheader);
|
||||||
|
if (f.is_open()) {
|
||||||
|
TokenList *tokens = new TokenList(f, files, header2, outputList);
|
||||||
|
filedata[header2] = tokens;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (header2.empty()) {
|
if (header2.empty()) {
|
||||||
simplecpp::Output output(files);
|
simplecpp::Output output(files);
|
||||||
output.type = Output::MISSING_HEADER;
|
output.type = Output::MISSING_HEADER;
|
||||||
|
@ -2089,14 +2115,24 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
|
||||||
const bool par = (tok && tok->op == '(');
|
const bool par = (tok && tok->op == '(');
|
||||||
if (par)
|
if (par)
|
||||||
tok = tok->next;
|
tok = tok->next;
|
||||||
if (!tok)
|
if (tok) {
|
||||||
break;
|
|
||||||
if (macros.find(tok->str) != macros.end())
|
if (macros.find(tok->str) != macros.end())
|
||||||
expr.push_back(new Token("1", tok->location));
|
expr.push_back(new Token("1", tok->location));
|
||||||
else
|
else
|
||||||
expr.push_back(new Token("0", tok->location));
|
expr.push_back(new Token("0", tok->location));
|
||||||
if (tok && par)
|
}
|
||||||
tok = tok->next;
|
if (par)
|
||||||
|
tok = tok ? tok->next : NULL;
|
||||||
|
if (!tok || !sameline(rawtok,tok) || (par && tok->op != ')')) {
|
||||||
|
Output out(rawtok->location.files);
|
||||||
|
out.type = Output::SYNTAX_ERROR;
|
||||||
|
out.location = rawtok->location;
|
||||||
|
out.msg = "failed to evaluate " + std::string(rawtok->str == IF ? "#if" : "#elif") + " condition";
|
||||||
|
if (outputList)
|
||||||
|
outputList->push_back(out);
|
||||||
|
output.clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -288,7 +288,7 @@ SIMPLECPP_LIB std::map<std::string, TokenList*> load(const TokenList &rawtokens,
|
||||||
* @param outputList output: list that will receive output messages
|
* @param outputList output: list that will receive output messages
|
||||||
* @param macroUsage output: macro usage
|
* @param macroUsage output: macro usage
|
||||||
*/
|
*/
|
||||||
SIMPLECPP_LIB void preprocess(TokenList &output, const TokenList &rawtokens, std::vector<std::string> &files, const std::map<std::string, TokenList*> &filedata, const DUI &dui, OutputList *outputList = 0, std::list<MacroUsage> *macroUsage = 0);
|
SIMPLECPP_LIB void preprocess(TokenList &output, const TokenList &rawtokens, std::vector<std::string> &files, std::map<std::string, TokenList*> &filedata, const DUI &dui, OutputList *outputList = 0, std::list<MacroUsage> *macroUsage = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deallocate data
|
* Deallocate data
|
||||||
|
|
|
@ -49,7 +49,7 @@ public:
|
||||||
simplecpp::OutputList outputList;
|
simplecpp::OutputList outputList;
|
||||||
std::vector<std::string> files;
|
std::vector<std::string> files;
|
||||||
const simplecpp::TokenList tokens1 = simplecpp::TokenList(istr, files, "file.cpp", &outputList);
|
const simplecpp::TokenList tokens1 = simplecpp::TokenList(istr, files, "file.cpp", &outputList);
|
||||||
const std::map<std::string, simplecpp::TokenList*> filedata;
|
std::map<std::string, simplecpp::TokenList*> filedata;
|
||||||
simplecpp::TokenList tokens2(files);
|
simplecpp::TokenList tokens2(files);
|
||||||
simplecpp::preprocess(tokens2, tokens1, files, filedata, simplecpp::DUI(), &outputList);
|
simplecpp::preprocess(tokens2, tokens1, files, filedata, simplecpp::DUI(), &outputList);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue