]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/strutils: create type specific strtoxx_or_err()
authorKarel Zak <kzak@redhat.com>
Tue, 15 May 2012 15:40:03 +0000 (17:40 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 15 May 2012 15:40:03 +0000 (17:40 +0200)
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>
include/strutils.h
lib/strutils.c

index 81556e0a0d4be2957c9d816f1f11b5853abfa4d2..57b13fddcdccac55fad9d1e7af3bb690685e3a60 100644 (file)
 
 
 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);
index bdcdef3426aa4a2536983037937e6837747af129..6bdc01d380777419ac54f7b4690fabb5e2461fdd 100644 (file)
@@ -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;