122 lines
4.2 KiB
Diff
122 lines
4.2 KiB
Diff
From cd25866f6533923c208f52d58516f3725f69cefb Mon Sep 17 00:00:00 2001
|
|
From: Thiago Macieira <thiago.macieira@intel.com>
|
|
Date: Wed, 18 May 2016 13:38:55 -0700
|
|
Subject: [PATCH] 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>
|
|
---
|
|
src/corelib/tools/qtimezoneprivate_tz.cpp | 68 ++++++++++++++++++-------------
|
|
1 file changed, 40 insertions(+), 28 deletions(-)
|
|
|
|
diff --git a/src/corelib/tools/qtimezoneprivate_tz.cpp b/src/corelib/tools/qtimezoneprivate_tz.cpp
|
|
index cb9581a..bfa967e 100644
|
|
--- a/src/corelib/tools/qtimezoneprivate_tz.cpp
|
|
+++ b/src/corelib/tools/qtimezoneprivate_tz.cpp
|
|
@@ -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);
|