diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-22 09:20:58 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-25 06:53:34 -0400 |
| commit | 31dc984812e538f3db37d7d8816db0fa649f4f27 (patch) | |
| tree | 5060e7e510610cc4977144d81d253a8f0dc55810 /src/helpers.cpp | |
| parent | f04604a9784be6c32a7f8f42b9633872a03ce897 (diff) | |
prase int string helpers - untested
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; +} + |
