From 551dae405a3af7f81ac360ec5bb316fb9b7aeec8 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 15 May 2012 17:40:03 +0200 Subject: lib/strutils: create type specific strtoxx_or_err() We need [un]signed int ([u]int32_t) on many places. It's also more readable and robust to use uintXX_t types than for example "long long". Signed-off-by: Karel Zak --- lib/strutils.c | 95 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 74 insertions(+), 21 deletions(-) (limited to 'lib/strutils.c') diff --git a/lib/strutils.c b/lib/strutils.c index bdcdef342..6bdc01d38 100644 --- a/lib/strutils.c +++ b/lib/strutils.c @@ -167,18 +167,55 @@ char *strndup(const char *s, size_t n) } #endif -/* - * same as strtod(3) but exit on failure instead of returning crap - */ -double strtod_or_err(const char *str, const char *errmesg) +int16_t strtos16_or_err(const char *str, const char *errmesg) { - double num; + int32_t num = strtos32_or_err(str, errmesg); + + if (num < INT16_MIN || num > INT16_MAX) + errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); + + return num; +} + +uint16_t strtou16_or_err(const char *str, const char *errmesg) +{ + uint32_t num = strtou32_or_err(str, errmesg); + + if (num > UINT16_MAX) + errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); + + return num; +} + +int32_t strtos32_or_err(const char *str, const char *errmesg) +{ + int64_t num = strtos64_or_err(str, errmesg); + + if (num < INT32_MIN || num > INT32_MAX) + errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); + + return num; +} + +uint32_t strtou32_or_err(const char *str, const char *errmesg) +{ + uint64_t num = strtou64_or_err(str, errmesg); + + if (num > UINT32_MAX) + errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); + + return num; +} + +int64_t strtos64_or_err(const char *str, const char *errmesg) +{ + int64_t num; char *end = NULL; if (str == NULL || *str == '\0') goto err; errno = 0; - num = strtod(str, &end); + num = strtoimax(str, &end, 10); if (errno || str == end || (end && *end)) goto err; @@ -190,18 +227,16 @@ err: errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); } -/* - * same as strtol(3) but exit on failure instead of returning crap - */ -long strtol_or_err(const char *str, const char *errmesg) + +uint64_t strtou64_or_err(const char *str, const char *errmesg) { - long num; + uintmax_t num; char *end = NULL; if (str == NULL || *str == '\0') goto err; errno = 0; - num = strtol(str, &end, 10); + num = strtoumax(str, &end, 10); if (errno || str == end || (end && *end)) goto err; @@ -210,20 +245,20 @@ long strtol_or_err(const char *str, const char *errmesg) err: if (errno) err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); + errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); } -/* - * same as strtoll(3) but exit on failure instead of returning crap - */ -long long strtoll_or_err(const char *str, const char *errmesg) + + +double strtod_or_err(const char *str, const char *errmesg) { - long long num; + double num; char *end = NULL; if (str == NULL || *str == '\0') goto err; errno = 0; - num = strtoll(str, &end, 10); + num = strtod(str, &end); if (errno || str == end || (end && *end)) goto err; @@ -235,9 +270,27 @@ err: errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); } -/* - * same as strtoul(3) but exit on failure instead of returning crap - */ + +long strtol_or_err(const char *str, const char *errmesg) +{ + long num; + char *end = NULL; + + if (str == NULL || *str == '\0') + goto err; + errno = 0; + num = strtol(str, &end, 10); + + if (errno || str == end || (end && *end)) + goto err; + + return num; +err: + if (errno) + err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); + errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str); +} + unsigned long strtoul_or_err(const char *str, const char *errmesg) { unsigned long num; -- cgit v1.2.3-55-g7522