From 29e1b81ce4bad922c523fcfdfda99c58aafa1af2 Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Sat, 18 Aug 2012 18:11:39 +0200 Subject: [PATCH] utils_time: Added cdtime_to_iso8601() function. This function formats a cdtime_t value in ISO 8601 format (and ensures that the string is null terminated). --- src/utils_time.c | 30 ++++++++++++++++++++++++++++++ src/utils_time.h | 6 ++++++ 2 files changed, 36 insertions(+) diff --git a/src/utils_time.c b/src/utils_time.c index aac6135e..f30dc0fa 100644 --- a/src/utils_time.c +++ b/src/utils_time.c @@ -61,4 +61,34 @@ cdtime_t cdtime (void) /* {{{ */ } /* }}} cdtime_t cdtime */ #endif +size_t cdtime_to_iso8601 (char *s, size_t max, cdtime_t t) /* {{{ */ +{ + struct timespec t_spec; + struct tm t_tm; + + size_t len; + + CDTIME_T_TO_TIMESPEC (t, &t_spec); + NORMALIZE_TIMESPEC (t_spec); + + if (localtime_r ((time_t *)&t_spec.tv_sec, &t_tm) == NULL) { + char errbuf[1024]; + ERROR ("cdtime_to_iso8601: localtime_r failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + return (0); + } + + len = strftime (s, max, "%Y-%m-%dT%H:%M:%S", &t_tm); + if (len == 0) + return 0; + + if (max - len > 2) { + int n = snprintf (s + len, max - len, ".%09i", (int)t_spec.tv_nsec); + len += (n < max - len) ? n : max - len; + } + + s[max - 1] = '\0'; + return len; +} /* }}} size_t cdtime_to_iso8601 */ + /* vim: set sw=2 sts=2 et fdm=marker : */ diff --git a/src/utils_time.h b/src/utils_time.h index 0fd809ac..0081957d 100644 --- a/src/utils_time.h +++ b/src/utils_time.h @@ -66,5 +66,11 @@ cdtime_t cdtime (void); +/* format a cdtime_t value in ISO 8601 format: + * returns the number of characters written to the string (not including the + * terminating null byte or 0 on error; the function ensures that the string + * is null terminated */ +size_t cdtime_to_iso8601 (char *s, size_t max, cdtime_t t); + #endif /* UTILS_TIME_H */ /* vim: set sw=2 sts=2 et : */ -- 2.30.2