summaryrefslogtreecommitdiffstats
path: root/lib/strutils.c
diff options
context:
space:
mode:
authorKarel Zak2012-05-15 17:40:03 +0200
committerKarel Zak2012-05-15 17:40:03 +0200
commit551dae405a3af7f81ac360ec5bb316fb9b7aeec8 (patch)
treefb6cd7687b3aa0a8bbee886f359e4edeeea65e17 /lib/strutils.c
parentinclude/ttyutils: more robust get_terminal_width() (diff)
downloadkernel-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>
Diffstat (limited to 'lib/strutils.c')
-rw-r--r--lib/strutils.c95
1 files changed, 74 insertions, 21 deletions
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;