diff options
Diffstat (limited to 'src/helpers.cpp')
| -rw-r--r-- | src/helpers.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
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 <cerrno> +#include <cstdlib> +#include <climits> + +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; +} + |
