Fixed #772 (Preprocessor: #if(A) is not seen equal to #if A)
This commit is contained in:
parent
4387071eb1
commit
1a48f869c8
|
@ -324,7 +324,7 @@ std::string Preprocessor::read(std::istream &istr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return removeComments(code.str());
|
return removeParantheses(removeComments(code.str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -442,6 +442,38 @@ std::string Preprocessor::removeComments(const std::string &str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string Preprocessor::removeParantheses(const std::string &str)
|
||||||
|
{
|
||||||
|
if (str.find("\n#if") == std::string::npos)
|
||||||
|
return str;
|
||||||
|
|
||||||
|
std::istringstream istr(str.c_str());
|
||||||
|
std::ostringstream ret;
|
||||||
|
std::string line;
|
||||||
|
while (std::getline(istr, line))
|
||||||
|
{
|
||||||
|
if (line.substr(0, 3) == "#if")
|
||||||
|
{
|
||||||
|
while (line.find(" (") != std::string::npos)
|
||||||
|
line.erase(line.find(" ("), 1);
|
||||||
|
while (line.find("( ") != std::string::npos)
|
||||||
|
line.erase(line.find("( ") + 1, 1);
|
||||||
|
while (line.find(" )") != std::string::npos)
|
||||||
|
line.erase(line.find(" )"), 1);
|
||||||
|
while (line.find(") ") != std::string::npos)
|
||||||
|
line.erase(line.find(") ") + 1, 1);
|
||||||
|
if (line.substr(0, 4) == "#if(" && line.find(")") == line.length() - 1)
|
||||||
|
{
|
||||||
|
line[3] = ' ';
|
||||||
|
line.erase(line.length() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret << line << "\n";
|
||||||
|
}
|
||||||
|
return ret.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void _removeAsm(std::string &str, const std::string::size_type pos)
|
static void _removeAsm(std::string &str, const std::string::size_type pos)
|
||||||
{
|
{
|
||||||
|
|
|
@ -99,6 +99,14 @@ protected:
|
||||||
*/
|
*/
|
||||||
static std::string removeComments(const std::string &str);
|
static std::string removeComments(const std::string &str);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove redundant parantheses from preprocessor commands. This should only be called from read().
|
||||||
|
* @param str Code processed by read().
|
||||||
|
* @return code with reduced parantheses
|
||||||
|
* @throws std::runtime_error when code contains unhandled characters
|
||||||
|
*/
|
||||||
|
static std::string removeParantheses(const std::string &str);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the string between double quote characters or \< \> characters.
|
* Returns the string between double quote characters or \< \> characters.
|
||||||
* @param str e.g. \code#include "menu.h"\endcode or \code#include <menu.h>\endcode
|
* @param str e.g. \code#include "menu.h"\endcode or \code#include <menu.h>\endcode
|
||||||
|
|
|
@ -342,14 +342,15 @@ private:
|
||||||
|
|
||||||
void test6()
|
void test6()
|
||||||
{
|
{
|
||||||
const char filedata[] = "#if(AAA)\n"
|
const char filedata[] = "#if(A)\n"
|
||||||
"#if(AAA)\n";
|
"#if ( A ) \n"
|
||||||
|
"#if A\n";
|
||||||
|
|
||||||
std::istringstream istr(filedata);
|
std::istringstream istr(filedata);
|
||||||
const std::string actual(Preprocessor::read(istr));
|
const std::string actual(Preprocessor::read(istr));
|
||||||
|
|
||||||
// Compare results..
|
// Compare results..
|
||||||
ASSERT_EQUALS("#if (AAA)\n#if (AAA)\n", actual);
|
ASSERT_EQUALS("#if A\n#if A\n#if A\n", actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
void test7()
|
void test7()
|
||||||
|
|
Loading…
Reference in New Issue