From 235ddc0990b242a0fee8850bee3ea2d7c2e54811 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 25 Jul 2018 08:29:34 +0200 Subject: [PATCH] util/TimeISO8601: new utility library --- Makefile.am | 1 + src/SongFilter.cxx | 4 +-- src/TimePrint.cxx | 16 +++-------- src/util/TimeISO8601.cxx | 61 ++++++++++++++++++++++++++++++++++++++++ src/util/TimeISO8601.hxx | 55 ++++++++++++++++++++++++++++++++++++ 5 files changed, 123 insertions(+), 14 deletions(-) create mode 100644 src/util/TimeISO8601.cxx create mode 100644 src/util/TimeISO8601.hxx diff --git a/Makefile.am b/Makefile.am index b819688c9..85560db24 100644 --- a/Makefile.am +++ b/Makefile.am @@ -518,6 +518,7 @@ libutil_a_SOURCES = \ src/util/TemplateString.hxx \ src/util/TimeParser.cxx src/util/TimeParser.hxx \ src/util/TimeConvert.cxx src/util/TimeConvert.hxx \ + src/util/TimeISO8601.cxx src/util/TimeISO8601.hxx \ src/util/UriUtil.cxx src/util/UriUtil.hxx \ src/util/Manual.hxx \ src/util/StaticFifoBuffer.hxx \ diff --git a/src/SongFilter.cxx b/src/SongFilter.cxx index b20d99a91..58c2c15b2 100644 --- a/src/SongFilter.cxx +++ b/src/SongFilter.cxx @@ -31,7 +31,7 @@ #include "util/StringStrip.hxx" #include "util/StringView.hxx" #include "util/ASCII.hxx" -#include "util/TimeParser.hxx" +#include "util/TimeISO8601.hxx" #include "util/UriUtil.hxx" #include "lib/icu/CaseFold.hxx" @@ -219,7 +219,7 @@ ParseTimeStamp(const char *s) return std::chrono::system_clock::from_time_t((time_t)value); /* try ISO 8601 */ - return ParseTimePoint(s, "%FT%TZ"); + return ParseISO8601(s); } static constexpr bool diff --git a/src/TimePrint.cxx b/src/TimePrint.cxx index 646954224..88e515fd1 100644 --- a/src/TimePrint.cxx +++ b/src/TimePrint.cxx @@ -20,27 +20,19 @@ #include "config.h" #include "TimePrint.hxx" #include "client/Response.hxx" -#include "util/TimeConvert.hxx" +#include "util/TimeISO8601.hxx" void time_print(Response &r, const char *name, std::chrono::system_clock::time_point t) { - struct tm tm; + StringBuffer<64> s; try { - tm = GmTime(t); + s = FormatISO8601(t); } catch (...) { return; } - char buffer[32]; - strftime(buffer, sizeof(buffer), -#ifdef _WIN32 - "%Y-%m-%dT%H:%M:%SZ", -#else - "%FT%TZ", -#endif - &tm); - r.Format("%s: %s\n", name, buffer); + r.Format("%s: %s\n", name, s.c_str()); } diff --git a/src/util/TimeISO8601.cxx b/src/util/TimeISO8601.cxx new file mode 100644 index 000000000..0a9480c85 --- /dev/null +++ b/src/util/TimeISO8601.cxx @@ -0,0 +1,61 @@ +/* + * Copyright 2007-2017 Content Management AG + * All rights reserved. + * + * author: Max Kellermann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "TimeISO8601.hxx" +#include "TimeConvert.hxx" +#include "TimeParser.hxx" + +StringBuffer<64> +FormatISO8601(const struct tm &tm) noexcept +{ + StringBuffer<64> buffer; + strftime(buffer.data(), buffer.capacity(), +#ifdef _WIN32 + "%Y-%m-%dT%H:%M:%SZ", +#else + "%FT%TZ", +#endif + &tm); + return buffer; +} + +StringBuffer<64> +FormatISO8601(std::chrono::system_clock::time_point tp) +{ + return FormatISO8601(GmTime(tp)); +} + +std::chrono::system_clock::time_point +ParseISO8601(const char *s) +{ + return ParseTimePoint(s, "%FT%TZ"); +} diff --git a/src/util/TimeISO8601.hxx b/src/util/TimeISO8601.hxx new file mode 100644 index 000000000..81e5593d3 --- /dev/null +++ b/src/util/TimeISO8601.hxx @@ -0,0 +1,55 @@ +/* + * Copyright 2007-2017 Content Management AG + * All rights reserved. + * + * author: Max Kellermann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TIME_ISO8601_HXX +#define TIME_ISO8601_HXX + +#include "StringBuffer.hxx" +#include "Compiler.h" + +#include +#include + +struct tm; + +gcc_pure +StringBuffer<64> +FormatISO8601(const struct tm &tm) noexcept; + +gcc_pure +StringBuffer<64> +FormatISO8601(std::chrono::system_clock::time_point tp); + +std::chrono::system_clock::time_point +ParseISO8601(const char *s); + +#endif