I'd like to parse content like:
tag = value
tag2 = value2
tag3 = value3
with the relaxation of allowing values over multiple lines and disregarding comments of the next tag. A tag is identified by not starting with the comment identifier '#' and starting at a new line. So this:
tag = value
value continuation
tag2 = value2
value continuation2
# comment for tag3
tag3 = value3
should parse the mapping:
tag : "value\nvalue continuation"
tag2 : "value2\nvalue continuation2"
tag3 : "value3"
How can I achieve this in a clean way? My current code for parsing one-line pairs looks sth like this:
while( std::getline( istr, line ) )
{
++lineCount;
if( line[0] == '#' )
currentComment.push_back( line );
else if( isspace( line[0]) || line[0] == '\0' )
currentComment.clear( );
else
{
auto tag = Utils::string::splitString( line, '=' );
if( tag.size() != 2 || line[line.size() - 1] == '=')
{
std::cerr << "Wrong tag syntax in line #" << lineCount << std::endl;
return nullptr;
}
tagLines.push_back( line );
currentComment.clear( );
}
}
Note that I don't require the results being stored in the types of containers that are currently used. I can switch to anything that fits better unless I get sets of (comment, tagname, value).