fix whitespace parsing

pull/244/head
Jeff Becker 5 years ago
parent fe1245d82e
commit 3b76182ee6
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -37,6 +37,12 @@ namespace llarp
m_Data.clear();
}
static bool
whitespace(char ch)
{
return std::isspace(static_cast<unsigned char>(ch)) != 0;
}
bool
ConfigParser::Parse()
{
@ -49,7 +55,7 @@ namespace llarp
auto beg = itr;
while(itr != m_Data.end() && *itr != '\n' && *itr != '\r')
++itr;
lines.emplace_back(std::addressof(*beg), (itr - beg));
lines.emplace_back(std::addressof(*beg), std::distance(beg, itr));
if(itr == m_Data.end())
break;
++itr;
@ -82,10 +88,10 @@ namespace llarp
// clamp whitespaces
++sectOpenPos;
while(std::isspace(realLine[sectOpenPos]) && sectOpenPos != sectClosPos)
while(whitespace(realLine[sectOpenPos]) && sectOpenPos != sectClosPos)
++sectOpenPos;
--sectClosPos;
while(std::isspace(realLine[sectClosPos]) && sectClosPos != sectOpenPos)
while(whitespace(realLine[sectClosPos]) && sectClosPos != sectOpenPos)
--sectClosPos;
// set section name
sectName = realLine.substr(sectOpenPos, sectClosPos);
@ -98,18 +104,18 @@ namespace llarp
String_t::size_type v_start = kvDelim + 1;
String_t::size_type v_end = realLine.size() - 1;
// clamp whitespaces
while(std::isspace(realLine[k_start]) && k_start != kvDelim)
while(whitespace(realLine[k_start]) && k_start != kvDelim)
++k_start;
while(std::isspace(realLine[k_end]) && k_end != k_start)
while(whitespace(realLine[k_end]) && k_end != k_start)
--k_end;
while(std::isspace(realLine[v_start]) && v_start != v_end)
while(whitespace(realLine[v_start]) && v_start != v_end)
++v_start;
while(std::isspace(realLine[v_end]))
while(whitespace(realLine[v_end]))
--v_end;
// sect.k = v
String_t k = realLine.substr(k_start, k_end);
String_t v = realLine.substr(v_start, v_end);
String_t k = realLine.substr(k_start, k_end - k_start);
String_t v = realLine.substr(v_start, 1 + (v_end - v_start));
Section_t& sect = m_Config[sectName];
sect.emplace(k, v);
}

@ -25,7 +25,7 @@ TEST_F(TestINIParser, TestParseOneSection)
sect = section;
return true;
};
ASSERT_TRUE(parser.LoadString("[test]\nkey=val"));
ASSERT_TRUE(parser.LoadString("[test]\nkey=val \n"));
ASSERT_TRUE(parser.VisitSection("test", assertVisit));
auto itr = sect.find("notfound");
ASSERT_EQ(itr, sect.end());

Loading…
Cancel
Save