From a57de0efc19ac813aa7c3fff753b0acf3eb0eacc Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 12 Sep 2023 14:14:50 +0200 Subject: [PATCH] include/strutils: add ul_strtold() Signed-off-by: Karel Zak --- include/strutils.h | 1 + lib/strutils.c | 23 +++++++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/strutils.h b/include/strutils.h index 7b44b4e00b..e9f8a0ce04 100644 --- a/include/strutils.h +++ b/include/strutils.h @@ -27,6 +27,7 @@ extern int ul_strtos64(const char *str, int64_t *num, int base); extern int ul_strtou64(const char *str, uint64_t *num, int base); extern int ul_strtos32(const char *str, int32_t *num, int base); extern int ul_strtou32(const char *str, uint32_t *num, int base); +extern int ul_strtold(const char *str, long double *num); extern int64_t str2num_or_err(const char *str, int base, const char *errmesg, int64_t low, int64_t up); extern uint64_t str2unum_or_err(const char *str, int base, const char *errmesg, uint64_t up); diff --git a/lib/strutils.c b/lib/strutils.c index ccf71b987f..422f8e5807 100644 --- a/lib/strutils.c +++ b/lib/strutils.c @@ -456,21 +456,28 @@ err: errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); } -long double strtold_or_err(const char *str, const char *errmesg) +int ul_strtold(const char *str, long double *num) { - double num; char *end = NULL; errno = 0; if (str == NULL || *str == '\0') - goto err; - num = strtold(str, &end); + return -(errno = EINVAL); + *num = strtold(str, &end); - if (errno || str == end || (end && *end)) - goto err; + if (errno != 0) + return -errno; + if (str == end || (end && *end)) + return -(errno = EINVAL); + return 0; +} - return num; -err: +long double strtold_or_err(const char *str, const char *errmesg) +{ + long double num = 0; + + if (ul_strtold(str, &num) == 0) + return num; if (errno == ERANGE) err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); -- 2.47.3