From 2bc127bb4336d1de047cca57b07865ed1e53f967 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 23 Dec 2019 17:06:15 +0100 Subject: [PATCH] time/ISO8601: move code to ParseTimeOfDay() --- src/time/ISO8601.cxx | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/time/ISO8601.cxx b/src/time/ISO8601.cxx index 5cb4c486c..42bba021f 100644 --- a/src/time/ISO8601.cxx +++ b/src/time/ISO8601.cxx @@ -108,6 +108,30 @@ ParseTimeZoneOffset(const char *&s) return d; } +static const char * +ParseTimeOfDay(const char *s, struct tm &tm, + std::chrono::system_clock::duration &precision) noexcept +{ + const char *end; + + if ((end = strptime(s, "%T", &tm)) != nullptr) + precision = std::chrono::seconds(1); + else if ((end = strptime(s, "%H%M%S", &tm)) != nullptr) + /* no field separators */ + precision = std::chrono::seconds(1); + else if ((end = strptime(s, "%H%M", &tm)) != nullptr) + /* no field separators */ + precision = std::chrono::minutes(1); + else if ((end = strptime(s, "%H:%M", &tm)) != nullptr) + precision = std::chrono::minutes(1); + else if ((end = strptime(s, "%H", &tm)) != nullptr) + precision = std::chrono::hours(1); + else + return nullptr; + + return end; +} + std::pair ParseISO8601(const char *s) @@ -138,22 +162,9 @@ ParseISO8601(const char *s) if (*s == 'T') { ++s; - if ((end = strptime(s, "%T", &tm)) != nullptr) - precision = std::chrono::seconds(1); - else if ((end = strptime(s, "%H%M%S", &tm)) != nullptr) - /* no field separators */ - precision = std::chrono::seconds(1); - else if ((end = strptime(s, "%H%M", &tm)) != nullptr) - /* no field separators */ - precision = std::chrono::minutes(1); - else if ((end = strptime(s, "%H:%M", &tm)) != nullptr) - precision = std::chrono::minutes(1); - else if ((end = strptime(s, "%H", &tm)) != nullptr) - precision = std::chrono::hours(1); - else + s = ParseTimeOfDay(s, tm, precision); + if (s == nullptr) throw std::runtime_error("Failed to parse time of day"); - - s = end; } auto tp = TimeGm(tm);