diff options
Diffstat (limited to 'src/utils.c')
-rw-r--r-- | src/utils.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/utils.c b/src/utils.c index d49a9ac..2607fc6 100644 --- a/src/utils.c +++ b/src/utils.c @@ -7,7 +7,12 @@ * (at your option) any later version. */ + #include <ctype.h> +#include <errno.h> +#include <assert.h> +#include <limits.h> +#include <stdlib.h> #include "utils.h" void str_toupper(char *str) @@ -29,3 +34,26 @@ void str_tolower(char *str) c++; } } + +int safe_strtoull(const char *str, uint64_t *out_value, int base, uint64_t max) +{ + char *endptr = NULL; + uint64_t result; + errno = 0; + + assert(str != NULL && out_value != NULL); + + if (str[0] == '-') + return -1; + + result = strtoull(str, &endptr, base); + + if (endptr == str || + *endptr != '\0' || + (errno == ERANGE && result == ULLONG_MAX) || + result > max) + return -1; + + *out_value = result; + return 0; +} |