preprocessor: Remove comments
This commit is contained in:
parent
6390873a09
commit
96bea619bf
|
@ -41,19 +41,85 @@ static std::string getcode(const std::string &filedata, std::string cfg);
|
|||
*/
|
||||
void preprocess(std::istream &istr, std::map<std::string, std::string> &result)
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
std::string line;
|
||||
while ( getline(istr, line) )
|
||||
ostr << line << "\n";
|
||||
// Get filedata from stream.. remove all comments
|
||||
std::ostringstream code;
|
||||
for (char ch = (char)istr.get(); !istr.eof(); ch = (char)istr.get())
|
||||
{
|
||||
if ( ch == '/' )
|
||||
{
|
||||
char chNext = (char)istr.get();
|
||||
|
||||
if ( chNext == '/' )
|
||||
{
|
||||
while (!istr.eof() && ch!='\n')
|
||||
ch = (char)istr.get();
|
||||
code << "\n";
|
||||
}
|
||||
|
||||
else if ( chNext == '*' )
|
||||
{
|
||||
char chPrev = 0;
|
||||
while (!istr.eof() && (chPrev!='*' || ch!='/'))
|
||||
{
|
||||
chPrev = ch;
|
||||
ch = (char)istr.get();
|
||||
if (ch == '\n')
|
||||
code << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
code << std::string(1,ch) << std::string(1,chNext);
|
||||
}
|
||||
}
|
||||
|
||||
else if ( ch == '\"' )
|
||||
{
|
||||
do
|
||||
{
|
||||
code << std::string(1,ch);
|
||||
ch = (char)istr.get();
|
||||
if ( ch == '\\' )
|
||||
{
|
||||
code << "\\";
|
||||
ch = (char)istr.get();
|
||||
}
|
||||
} while ( !istr.eof() && ch != '\"' );
|
||||
code << std::string(1, ch);
|
||||
}
|
||||
|
||||
else if ( ch == '\'' )
|
||||
{
|
||||
do
|
||||
{
|
||||
code << std::string(1, ch);
|
||||
ch = (char)istr.get();
|
||||
if ( ch == '\\' )
|
||||
{
|
||||
code << "\\";
|
||||
ch = (char)istr.get();
|
||||
}
|
||||
} while ( !istr.eof() && ch != '\'' );
|
||||
code << std::string(1, ch);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
code << std::string(1, ch);
|
||||
}
|
||||
}
|
||||
|
||||
std::string codestr( code.str() );
|
||||
|
||||
// Get all possible configurations..
|
||||
std::list<std::string> cfgs = getcfgs( ostr.str() );
|
||||
std::list<std::string> cfgs = getcfgs( codestr );
|
||||
|
||||
// Extract the code for each possible configuration..
|
||||
result.clear();
|
||||
for ( std::list<std::string>::const_iterator it = cfgs.begin(); it != cfgs.end(); ++it )
|
||||
{
|
||||
result[ *it ] = getcode( ostr.str(), *it );
|
||||
result[ *it ] = getcode( codestr, *it );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -39,6 +39,8 @@ private:
|
|||
{
|
||||
TEST_CASE( test1 );
|
||||
TEST_CASE( test2 );
|
||||
|
||||
TEST_CASE( comments1 );
|
||||
}
|
||||
|
||||
void check(const char filedata[], const std::map<std::string,std::string> &expected)
|
||||
|
@ -54,9 +56,13 @@ private:
|
|||
if ( it2 == expected.end() )
|
||||
assertFail(__FILE__, __LINE__);
|
||||
else
|
||||
{
|
||||
std::string s1 = it->second;
|
||||
std::string s2 = it2->second;
|
||||
ASSERT_EQUALS( it->second, it2->second );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void test1()
|
||||
{
|
||||
|
@ -87,6 +93,19 @@ private:
|
|||
|
||||
check( filedata, expected );
|
||||
}
|
||||
|
||||
void comments1()
|
||||
{
|
||||
const char filedata[] = "/*\n"
|
||||
"#ifdef WIN32\n"
|
||||
"#endif\n"
|
||||
"*/\n";
|
||||
|
||||
std::map<std::string, std::string> expected;
|
||||
expected[""] = "\n\n\n\n";
|
||||
check( filedata, expected );
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
REGISTER_TEST( TestPreprocessor )
|
||||
|
|
Loading…
Reference in New Issue