From 35c84bf76a4776a00d0bb782ceef6182170c5a7a Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 6 May 2021 11:06:45 +0200 Subject: [PATCH] lib/strutils: assume 64-bit time_t Signed-off-by: Karel Zak --- include/strutils.h | 3 +++ lib/strutils.c | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/include/strutils.h b/include/strutils.h index cb267e227..7969a84d0 100644 --- a/include/strutils.h +++ b/include/strutils.h @@ -8,6 +8,7 @@ #include #include #include +#include #include "c.h" @@ -31,12 +32,14 @@ extern uint64_t strtou64_or_err(const char *str, const char *errmesg); extern uint64_t strtox64_or_err(const char *str, const char *errmesg); extern double strtod_or_err(const char *str, const char *errmesg); +extern long double strtold_or_err(const char *str, const char *errmesg); extern long strtol_or_err(const char *str, const char *errmesg); extern unsigned long strtoul_or_err(const char *str, const char *errmesg); extern void strtotimeval_or_err(const char *str, struct timeval *tv, const char *errmesg); +extern time_t strtotime_or_err(const char *str, const char *errmesg); extern int isdigit_strend(const char *str, const char **end); #define isdigit_string(_s) isdigit_strend(_s, NULL) diff --git a/lib/strutils.c b/lib/strutils.c index bf60aed51..5b5e686aa 100644 --- a/lib/strutils.c +++ b/lib/strutils.c @@ -459,6 +459,27 @@ err: errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); } +long double strtold_or_err(const char *str, const char *errmesg) +{ + double num; + char *end = NULL; + + errno = 0; + if (str == NULL || *str == '\0') + goto err; + num = strtold(str, &end); + + if (errno || str == end || (end && *end)) + goto err; + + return num; +err: + if (errno == ERANGE) + err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); + + errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); +} + long strtol_or_err(const char *str, const char *errmesg) { long num; @@ -517,11 +538,19 @@ uintmax_t strtosize_or_err(const char *str, const char *errmesg) void strtotimeval_or_err(const char *str, struct timeval *tv, const char *errmesg) { - double user_input; + long double user_input; - user_input = strtod_or_err(str, errmesg); + user_input = strtold_or_err(str, errmesg); tv->tv_sec = (time_t) user_input; - tv->tv_usec = (long)((user_input - tv->tv_sec) * 1000000); + tv->tv_usec = (suseconds_t)((user_input - tv->tv_sec) * 1000000); +} + +time_t strtotime_or_err(const char *str, const char *errmesg) +{ + int64_t user_input; + + user_input = strtos64_or_err(str, errmesg); + return (time_t) user_input; } /*