ISO8601d: Fixed parsing of day and month name

This commit is contained in:
Paul Beckingham
2015-10-10 22:48:47 -04:00
parent 5ef2d6f00d
commit 4882a50b1b

View File

@@ -512,15 +512,16 @@ bool ISO8601d::parse_formatted (Nibbler& n, const std::string& format)
case 'A': case 'A':
{ {
auto cursor = n.cursor (); std::string dayName;
wday = ISO8601d::dayOfWeek (n.str ().substr (cursor)); if (n.getUntil (format[f + 1], dayName))
if (wday == -1)
{ {
n.restore (); wday = ISO8601d::dayOfWeek (lowerCase (dayName));
return false; if (wday == -1)
{
n.restore ();
return false;
}
} }
n.skipN (ISO8601d::dayName (wday).size ());
} }
break; break;
@@ -540,15 +541,16 @@ bool ISO8601d::parse_formatted (Nibbler& n, const std::string& format)
case 'B': case 'B':
{ {
auto cursor = n.cursor (); std::string monthName;
month = ISO8601d::dayOfWeek (n.str ().substr (cursor)); if (n.getUntil (format[f + 1], monthName))
if (month == -1)
{ {
n.restore (); month = ISO8601d::monthOfYear (lowerCase (monthName));
return false; if (month == -1)
{
n.restore ();
return false;
}
} }
n.skipN (ISO8601d::monthName (month).size ());
} }
break; break;
@@ -1278,7 +1280,7 @@ std::string ISO8601d::dayName (int dow)
int ISO8601d::dayOfWeek (const std::string& input) int ISO8601d::dayOfWeek (const std::string& input)
{ {
if (ISO8601d::minimumMatchLength== 0) if (ISO8601d::minimumMatchLength== 0)
ISO8601d::minimumMatchLength= 3; ISO8601d::minimumMatchLength = 3;
if (closeEnough (STRING_DATE_SUNDAY, input, ISO8601d::minimumMatchLength)) return 0; if (closeEnough (STRING_DATE_SUNDAY, input, ISO8601d::minimumMatchLength)) return 0;
else if (closeEnough (STRING_DATE_MONDAY, input, ISO8601d::minimumMatchLength)) return 1; else if (closeEnough (STRING_DATE_MONDAY, input, ISO8601d::minimumMatchLength)) return 1;