From 31dc984812e538f3db37d7d8816db0fa649f4f27 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Fri, 22 Sep 2023 09:20:58 -0400 Subject: prase int string helpers - untested --- src/helpers.cpp | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/helpers.cpp (limited to 'src/helpers.cpp') diff --git a/src/helpers.cpp b/src/helpers.cpp new file mode 100644 index 0000000..796aa2e --- /dev/null +++ b/src/helpers.cpp @@ -0,0 +1,115 @@ + +#include "helpers.hpp" + +#include +#include +#include + +STR2NUM_ERROR str2num(int64_t &i, char const *s, int base) { + char *end; + long long l; + errno = 0; + l = strtoll(s, &end, base); + if (errno == ERANGE && l == LLONG_MAX) { + return OVERFLOW; + } + if (errno == ERANGE && l == LLONG_MIN) { + return UNDERFLOW; + } + if (*s == '\0' || *end != '\0') { + return INCONVERTIBLE; + } + i = l; + return SUCCESS; +} + +STR2NUM_ERROR str2num(uint64_t &i, char const *s, int base) { + char *end; + long long l; + errno = 0; + l = strtoull(s, &end, base); + if (errno == ERANGE && l == LLONG_MAX) { + return OVERFLOW; + } + if (errno == ERANGE && l == LLONG_MIN) { + return UNDERFLOW; + } + if (*s == '\0' || *end != '\0') { + return INCONVERTIBLE; + } + i = l; + return SUCCESS; +} + +STR2NUM_ERROR str2num(int32_t &i, char const *s, int base) { + char *end; + long l; + errno = 0; + l = strtol(s, &end, base); + if (errno == ERANGE && l == LONG_MAX) { + return OVERFLOW; + } + if (errno == ERANGE && l == LONG_MIN) { + return UNDERFLOW; + } + if (*s == '\0' || *end != '\0') { + return INCONVERTIBLE; + } + i = l; + return SUCCESS; +} + +STR2NUM_ERROR str2num(uint32_t &i, char const *s, int base) { + char *end; + long l; + errno = 0; + l = strtoul(s, &end, base); + if (errno == ERANGE && l == LONG_MAX) { + return OVERFLOW; + } + if (errno == ERANGE && l == LONG_MIN) { + return UNDERFLOW; + } + if (*s == '\0' || *end != '\0') { + return INCONVERTIBLE; + } + i = l; + return SUCCESS; +} + +STR2NUM_ERROR str2num(int16_t &i, char const *s, int base) { + char *end; + long l; + errno = 0; + l = strtol(s, &end, base); + if (errno == ERANGE && l == LONG_MAX) { + return OVERFLOW; + } + if (errno == ERANGE && l == LONG_MIN) { + return UNDERFLOW; + } + if (*s == '\0' || *end != '\0') { + return INCONVERTIBLE; + } + i = l; + return SUCCESS; +} + +STR2NUM_ERROR str2num(uint16_t &i, char const *s, int base) { + char *end; + long l; + errno = 0; + l = strtoul(s, &end, base); + if (errno == ERANGE && l == LONG_MAX) { + return OVERFLOW; + } + if (errno == ERANGE && l == LONG_MIN) { + return UNDERFLOW; + } + if (*s == '\0' || *end != '\0') { + return INCONVERTIBLE; + } + i = l; + return SUCCESS; +} + -- cgit v1.2.3