]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib,strutils: add strtoux[16|32|64]_or_err functions
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Wed, 12 Oct 2016 12:00:44 +0000 (14:00 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 9 Nov 2016 09:02:32 +0000 (10:02 +0100)
Add helper functions which allow to parse hexadecimal numbers.
Based on a patch from Clemens von Mann.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
include/strutils.h
lib/strutils.c

index 51d9c9ff3553d4bf407fe5ac9862d72e5fb76789..aa31fc984c7520ffe1604242d4c950a86c3056d1 100644 (file)
@@ -21,12 +21,15 @@ 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 uint16_t strtox16_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 uint32_t strtox32_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 uint64_t strtox64_or_err(const char *str, const char *errmesg);
 
 extern double strtod_or_err(const char *str, const char *errmesg);
 
index d3b998f023bfed3d031165eaa684572186fb23ca..8a52be048210f4d723accd7722c79da4c5ffb1a1 100644 (file)
@@ -264,6 +264,9 @@ char *strndup(const char *s, size_t n)
 }
 #endif
 
+static uint32_t _strtou32_or_err(const char *str, const char *errmesg, int base);
+static uint64_t _strtou64_or_err(const char *str, const char *errmesg, int base);
+
 int16_t strtos16_or_err(const char *str, const char *errmesg)
 {
        int32_t num = strtos32_or_err(str, errmesg);
@@ -275,9 +278,9 @@ int16_t strtos16_or_err(const char *str, const char *errmesg)
        return num;
 }
 
-uint16_t strtou16_or_err(const char *str, const char *errmesg)
+static uint16_t _strtou16_or_err(const char *str, const char *errmesg, int base)
 {
-       uint32_t num = strtou32_or_err(str, errmesg);
+       uint32_t num = _strtou32_or_err(str, errmesg, base);
 
        if (num > UINT16_MAX) {
                errno = ERANGE;
@@ -286,6 +289,16 @@ uint16_t strtou16_or_err(const char *str, const char *errmesg)
        return num;
 }
 
+uint16_t strtou16_or_err(const char *str, const char *errmesg)
+{
+       return _strtou16_or_err(str, errmesg, 10);
+}
+
+uint16_t strtox16_or_err(const char *str, const char *errmesg)
+{
+       return _strtou16_or_err(str, errmesg, 16);
+}
+
 int32_t strtos32_or_err(const char *str, const char *errmesg)
 {
        int64_t num = strtos64_or_err(str, errmesg);
@@ -297,9 +310,9 @@ int32_t strtos32_or_err(const char *str, const char *errmesg)
        return num;
 }
 
-uint32_t strtou32_or_err(const char *str, const char *errmesg)
+static uint32_t _strtou32_or_err(const char *str, const char *errmesg, int base)
 {
-       uint64_t num = strtou64_or_err(str, errmesg);
+       uint64_t num = _strtou64_or_err(str, errmesg, base);
 
        if (num > UINT32_MAX) {
                errno = ERANGE;
@@ -308,6 +321,16 @@ uint32_t strtou32_or_err(const char *str, const char *errmesg)
        return num;
 }
 
+uint32_t strtou32_or_err(const char *str, const char *errmesg)
+{
+       return _strtou32_or_err(str, errmesg, 10);
+}
+
+uint32_t strtox32_or_err(const char *str, const char *errmesg)
+{
+       return _strtou32_or_err(str, errmesg, 16);
+}
+
 int64_t strtos64_or_err(const char *str, const char *errmesg)
 {
        int64_t num;
@@ -329,7 +352,7 @@ err:
        errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
 }
 
-uint64_t strtou64_or_err(const char *str, const char *errmesg)
+static uint64_t _strtou64_or_err(const char *str, const char *errmesg, int base)
 {
        uintmax_t num;
        char *end = NULL;
@@ -337,7 +360,7 @@ uint64_t strtou64_or_err(const char *str, const char *errmesg)
        errno = 0;
        if (str == NULL || *str == '\0')
                goto err;
-       num = strtoumax(str, &end, 10);
+       num = strtoumax(str, &end, base);
 
        if (errno || str == end || (end && *end))
                goto err;
@@ -350,6 +373,15 @@ err:
        errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
 }
 
+uint64_t strtou64_or_err(const char *str, const char *errmesg)
+{
+       return _strtou64_or_err(str, errmesg, 10);
+}
+
+uint64_t strtox64_or_err(const char *str, const char *errmesg)
+{
+       return _strtou64_or_err(str, errmesg, 16);
+}
 
 double strtod_or_err(const char *str, const char *errmesg)
 {