summaryrefslogtreecommitdiffstats
path: root/src/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.c')
-rw-r--r--src/utils.c28
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;
+}