Use the code we already have for parsing the transition time too

It's there and it's more efficient anyway.

Change-Id: Ie9fd7afe060b4e4a8052fffd144fc40647430268
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Brett Stottlemyer <bstottle@ford.com>
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
bb10
Thiago Macieira 2016-05-18 13:38:55 -07:00
parent e9041c7fc1
commit cd25866f65
1 changed files with 40 additions and 28 deletions

View File

@ -372,37 +372,21 @@ static QDate calculatePosixDate(const QByteArray &dateRule, int year)
}
}
static QTime parsePosixTime(const QByteArray &timeRule)
// returns the time in seconds, INT_MIN if we failed to parse
static int parsePosixTime(const char *begin, const char *end)
{
// Format "HH:mm:ss", put check parts count just in case
QList<QByteArray> parts = timeRule.split(':');
int count = parts.count();
if (count == 3)
return QTime(parts.at(0).toInt(), parts.at(1).toInt(), parts.at(2).toInt());
else if (count == 2)
return QTime(parts.at(0).toInt(), parts.at(1).toInt(), 0);
else if (count == 1)
return QTime(parts.at(0).toInt(), 0, 0);
return QTime(2, 0, 0);
}
static int parsePosixOffset(const char *begin, const char *end)
{
// Format "[+|-]hh[:mm[:ss]]"
// Format "hh[:mm[:ss]]"
int hour, min = 0, sec = 0;
// note that the sign is inverted because POSIX counts in hours West of GMT
bool negate = true;
if (*begin == '+') {
++begin;
} else if (*begin == '-') {
negate = false;
++begin;
}
// Note that the calls to qstrtoll do *not* check the end pointer, which
// means they proceed until they find a non-digit. We check that we're
// still in range at the end, but we may have read from past end. It's the
// caller's responsibility to ensure that begin is part of a
// null-terminated string.
bool ok = false;
hour = qstrtoll(begin, &begin, 10, &ok);
if (!ok)
if (!ok || hour < 0)
return INT_MIN;
if (begin < end && *begin == ':') {
// minutes
@ -424,7 +408,35 @@ static int parsePosixOffset(const char *begin, const char *end)
if (begin != end)
return INT_MIN;
int value = (hour * 60 + min) * 60 + sec;
return (hour * 60 + min) * 60 + sec;
}
static QTime parsePosixTransitionTime(const QByteArray &timeRule)
{
// Format "hh[:mm[:ss]]"
int value = parsePosixTime(timeRule.constBegin(), timeRule.constEnd());
if (value == INT_MIN) {
// if we failed to parse, return 02:00
return QTime(2, 0, 0);
}
return QTime::fromMSecsSinceStartOfDay(value * 1000);
}
static int parsePosixOffset(const char *begin, const char *end)
{
// Format "[+|-]hh[:mm[:ss]]"
// note that the sign is inverted because POSIX counts in hours West of GMT
bool negate = true;
if (*begin == '+') {
++begin;
} else if (*begin == '-') {
negate = false;
++begin;
}
int value = parsePosixTime(begin, end);
if (value == INT_MIN)
return value;
return negate ? -value : value;
}
@ -534,7 +546,7 @@ static QVector<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArra
QByteArray dstDateRule = dstParts.at(0);
QTime dstTime;
if (dstParts.count() > 1)
dstTime = parsePosixTime(dstParts.at(1));
dstTime = parsePosixTransitionTime(dstParts.at(1));
else
dstTime = QTime(2, 0, 0);
@ -543,7 +555,7 @@ static QVector<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArra
QByteArray stdDateRule = stdParts.at(0);
QTime stdTime;
if (stdParts.count() > 1)
stdTime = parsePosixTime(stdParts.at(1));
stdTime = parsePosixTransitionTime(stdParts.at(1));
else
stdTime = QTime(2, 0, 0);