ENH: stringOps removeComments and inplaceRemoveComments

- useful for manual handling of string with comments
This commit is contained in:
Mark Olesen
2019-09-24 08:25:32 +02:00
committed by Andrew Heather
parent 603849383d
commit 13967565a6
3 changed files with 136 additions and 2 deletions

View File

@ -44,6 +44,20 @@ Description
using namespace Foam; using namespace Foam;
void testCommentStripping(const std::string& s)
{
Info<< "input" << nl
<< "========" << nl
<< s << nl
<< "========" << nl;
Info<< "output" << nl
<< "========" << nl
<< stringOps::removeComments(s) << nl
<< "========" << nl << nl;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program: // Main program:
@ -158,6 +172,35 @@ int main(int argc, char *argv[])
Info<<"trimRight: " << stringOps::trimRight(test) << endl; Info<<"trimRight: " << stringOps::trimRight(test) << endl;
Info<<"trim: " << stringOps::trim(test) << endl; Info<<"trim: " << stringOps::trim(test) << endl;
// Test comment stripping
{
Info<< nl << "Test comment stripping" << nl;
testCommentStripping
(
"/String without comments/"
);
testCommentStripping
(
"Removed some/* C-comments */ / C comments"
);
testCommentStripping
(
"Removed some//C++ comments\n / C++ comments"
);
testCommentStripping
(
"Partly degenerate C comment </*/ C-comment..."
);
testCommentStripping
(
"Truncated C comment </* C-comment..."
);
testCommentStripping
(
"Truncated C++ comment <// C++ comment..."
);
}
if (false) if (false)
{ {
Info<<"test move construct - string size:" << test.size() << nl; Info<<"test move construct - string size:" << test.size() << nl;

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2017-2018 OpenCFD Ltd. \\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
| Copyright (C) 2011-2016 OpenFOAM Foundation | Copyright (C) 2011-2016 OpenFOAM Foundation
@ -1104,6 +1104,90 @@ void Foam::stringOps::inplaceTrim(std::string& s)
} }
Foam::string Foam::stringOps::removeComments(const string& original)
{
string s(original);
inplaceRemoveComments(s);
return s;
}
void Foam::stringOps::inplaceRemoveComments(std::string& s)
{
const auto len = s.length();
if (len < 2)
{
return;
}
std::string::size_type n = 0;
for (std::string::size_type i = 0; i < len; ++i)
{
char c = s[i];
if (n != i)
{
s[n] = c;
}
++n;
// The start of a C/C++ comment?
if (c == '/')
{
++i;
if (i == len)
{
// No further characters
break;
}
c = s[i];
if (c == '/')
{
// C++ comment - search for end-of-line
--n;
i = s.find('\n', ++i);
if (i == std::string::npos)
{
// Trucated - done
break;
}
}
else if (c == '*')
{
// C comment - search for '*/'
--n;
i = s.find("*/", ++i, 2);
if (i == std::string::npos)
{
// Trucated - done
break;
}
++i;
}
else
{
// Not a C/C++ comment
if (n != i)
{
s[n] = c;
}
++n;
}
}
}
s.resize(n);
}
Foam::string Foam::stringOps::lower(const string& original) Foam::string Foam::stringOps::lower(const string& original)
{ {
string s(original); string s(original);

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd. \\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
| Copyright (C) 2011-2012 OpenFOAM Foundation | Copyright (C) 2011-2012 OpenFOAM Foundation
@ -351,6 +351,13 @@ namespace stringOps
void inplaceTrim(std::string& s); void inplaceTrim(std::string& s);
//- Return string with C/C++ comments removed
string removeComments(const string& original);
//- Remove C/C++ comments inplace
void inplaceRemoveComments(std::string& s);
//- Return string transformed with std::tolower on each character //- Return string transformed with std::tolower on each character
string lower(const string& original); string lower(const string& original);