From 609e47faba825505cf9fa572591d551fabce1959 Mon Sep 17 00:00:00 2001 From: Andrew Bettison Date: Wed, 16 Oct 2013 11:16:04 +1030 Subject: [PATCH] Add str_to_int() and str_to_uint() --- str.c | 43 +++++++++++++++++++++++++++++++++++++++++-- str.h | 2 ++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/str.c b/str.c index f1e7ef3d..11a69c38 100644 --- a/str.c +++ b/str.c @@ -28,6 +28,7 @@ #include #include #include +#include const char hexdigit[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; @@ -227,13 +228,50 @@ char *str_str(char *haystack, const char *needle, int haystack_len) return NULL; } +int str_to_int(const char *str, int base, int *result, const char **afterp) +{ + if (isspace(*str)) + return 0; + const char *end = str; + errno = 0; + long value = strtol(str, (char**)&end, base); + if (errno == ERANGE || end == str || value > INT_MAX || value < INT_MIN) + return 0; + if (afterp) + *afterp = end; + else if (*end) + return 0; + if (result) + *result = value; + return 1; +} + +int str_to_uint(const char *str, int base, unsigned *result, const char **afterp) +{ + if (isspace(*str)) + return 0; + const char *end = str; + errno = 0; + unsigned long value = strtoul(str, (char**)&end, base); + if (errno == ERANGE || end == str || value > UINT_MAX) + return 0; + if (afterp) + *afterp = end; + else if (*end) + return 0; + if (result) + *result = value; + return 1; +} + int str_to_int64(const char *str, int base, int64_t *result, const char **afterp) { if (isspace(*str)) return 0; const char *end = str; + errno = 0; long long value = strtoll(str, (char**)&end, base); - if (end == str) + if (errno == ERANGE || end == str) return 0; if (afterp) *afterp = end; @@ -249,8 +287,9 @@ int str_to_uint64(const char *str, int base, uint64_t *result, const char **afte if (isspace(*str)) return 0; const char *end = str; + errno = 0; unsigned long long value = strtoull(str, (char**)&end, base); - if (end == str) + if (errno == ERANGE || end == str) return 0; if (afterp) *afterp = end; diff --git a/str.h b/str.h index 811ffc52..555897ac 100644 --- a/str.h +++ b/str.h @@ -206,6 +206,8 @@ char *str_str(char *haystack, const char *needle, int haystack_len); * * @author Andrew Bettison */ +int str_to_int(const char *str, int base, int *result, const char **afterp); +int str_to_uint(const char *str, int base, unsigned *result, const char **afterp); int str_to_int64(const char *str, int base, int64_t *result, const char **afterp); int str_to_uint64(const char *str, int base, uint64_t *result, const char **afterp);