diff options
author | Karel Zak | 2012-05-15 17:40:03 +0200 |
---|---|---|
committer | Karel Zak | 2012-05-15 17:40:03 +0200 |
commit | 551dae405a3af7f81ac360ec5bb316fb9b7aeec8 (patch) | |
tree | fb6cd7687b3aa0a8bbee886f359e4edeeea65e17 | |
parent | include/ttyutils: more robust get_terminal_width() (diff) | |
download | kernel-qcow2-util-linux-551dae405a3af7f81ac360ec5bb316fb9b7aeec8.tar.gz kernel-qcow2-util-linux-551dae405a3af7f81ac360ec5bb316fb9b7aeec8.tar.xz kernel-qcow2-util-linux-551dae405a3af7f81ac360ec5bb316fb9b7aeec8.zip |
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 <kzak@redhat.com>
-rw-r--r-- | include/strutils.h | 14 | ||||
-rw-r--r-- | lib/strutils.c | 95 |
2 files changed, 86 insertions, 23 deletions
diff --git a/include/strutils.h b/include/strutils.h index 81556e0a0..57b13fddc 100644 --- a/include/strutils.h +++ b/include/strutils.h @@ -12,11 +12,21 @@ extern int strtosize(const char *str, uintmax_t *res); +extern uintmax_t strtosize_or_err(const char *str, const char *errmesg); + +extern int16_t strtos16_or_err(const char *str, const char *errmesg); +extern uint16_t strtou16_or_err(const char *str, const char *errmesg); + +extern int32_t strtos32_or_err(const char *str, const char *errmesg); +extern uint32_t strtou32_or_err(const char *str, const char *errmesg); + +extern int64_t strtos64_or_err(const char *str, const char *errmesg); +extern uint64_t strtou64_or_err(const char *str, const char *errmesg); + extern double strtod_or_err(const char *str, const char *errmesg); + extern long strtol_or_err(const char *str, const char *errmesg); -extern long long strtoll_or_err(const char *str, const char *errmesg); extern unsigned long strtoul_or_err(const char *str, const char *errmesg); -extern uintmax_t strtosize_or_err(const char *str, const char *errmesg); #ifndef HAVE_STRNLEN extern size_t strnlen(const char *s, size_t maxlen); 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; |