From 2bc127bb4336d1de047cca57b07865ed1e53f967 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
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<std::chrono::system_clock::time_point,
 	  std::chrono::system_clock::duration>
 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);