in src/aws-cpp-sdk-core/source/utils/DateTimeCommon.cpp [425:606]
void Parse() override
{
size_t len = strlen(m_toParse);
//DOS check
if (len > MAX_LEN)
{
AWS_LOGSTREAM_WARN(CLASS_TAG, "Incoming String to parse too long with length: " << len)
m_error = true;
return;
}
size_t index = 0;
size_t stateStartIndex = 0;
int finalState = 8;
while(m_state <= finalState && !m_error && index < len)
{
char c = m_toParse[index];
switch (m_state)
{
case 0:
if(c == ',')
{
int weekNumber = GetWeekDayNumberFromStr(m_toParse, stateStartIndex, index + 1);
if (weekNumber > -1)
{
m_state = 1;
stateStartIndex = index + 1;
m_parsedTimestamp.tm_wday = weekNumber;
}
else
{
m_error = true;
}
}
else if(!isalpha(c))
{
m_error = true;
}
break;
case 1:
if (isspace(c))
{
m_state = 2;
stateStartIndex = index + 1;
}
else
{
m_error = true;
}
break;
case 2:
if (isdigit(c))
{
m_parsedTimestamp.tm_mday = m_parsedTimestamp.tm_mday * 10 + (c - '0');
}
else if(isspace(c))
{
m_state = 3;
stateStartIndex = index + 1;
}
else
{
m_error = true;
}
break;
case 3:
if (isspace(c))
{
int monthNumber = GetMonthNumberFromStr(m_toParse, stateStartIndex, index + 1);
if (monthNumber > -1)
{
m_state = 4;
stateStartIndex = index + 1;
m_parsedTimestamp.tm_mon = monthNumber;
}
else
{
m_error = true;
}
}
else if (!isalpha(c))
{
m_error = true;
}
break;
case 4:
if (isspace(c) && index - stateStartIndex == 4)
{
m_state = 5;
stateStartIndex = index + 1;
m_parsedTimestamp.tm_year -= 1900;
}
else if (isspace(c) && index - stateStartIndex == 2)
{
m_state = 5;
stateStartIndex = index + 1;
m_parsedTimestamp.tm_year += 2000 - 1900;
}
else if (isdigit(c))
{
m_parsedTimestamp.tm_year = m_parsedTimestamp.tm_year * 10 + (c - '0');
}
else
{
m_error = true;
}
break;
case 5:
if(c == ':' && index - stateStartIndex == 2)
{
m_state = 6;
stateStartIndex = index + 1;
}
else if (isdigit(c))
{
m_parsedTimestamp.tm_hour = m_parsedTimestamp.tm_hour * 10 + (c - '0');
}
else
{
m_error = true;
}
break;
case 6:
if (c == ':' && index - stateStartIndex == 2)
{
m_state = 7;
stateStartIndex = index + 1;
}
else if (isdigit(c))
{
m_parsedTimestamp.tm_min = m_parsedTimestamp.tm_min * 10 + (c - '0');
}
else
{
m_error = true;
}
break;
case 7:
if (isspace(c) && index - stateStartIndex == 2)
{
m_state = 8;
stateStartIndex = index + 1;
}
else if (isdigit(c))
{
m_parsedTimestamp.tm_sec = m_parsedTimestamp.tm_sec * 10 + (c - '0');
}
else
{
m_error = true;
}
break;
case 8:
if ((isalnum(c) || c == '+' || c == '-') && (index - stateStartIndex < 5))
{
m_tz[index - stateStartIndex] = c;
}
else
{
m_error = true;
}
break;
default:
m_error = true;
break;
}
index++;
}
if (m_tz[0] != 0)
{
m_utcAssumed = IsUTCTimeZoneDesignator(m_tz);
}
m_error = (m_error || m_state != finalState);
}