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 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/helpers.hpp | 15 ++++++++ 2 files changed, 130 insertions(+) create mode 100644 src/helpers.cpp create mode 100644 src/helpers.hpp (limited to 'src') 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; +} + diff --git a/src/helpers.hpp b/src/helpers.hpp new file mode 100644 index 0000000..a429416 --- /dev/null +++ b/src/helpers.hpp @@ -0,0 +1,15 @@ +#ifndef PKE_HELPERS_HPP +#define PKE_HELPERS_HPP + +#include + +enum STR2NUM_ERROR { SUCCESS, OVERFLOW, UNDERFLOW, INCONVERTIBLE }; + +STR2NUM_ERROR str2num(int64_t &i, char const *s, int base = 0); +STR2NUM_ERROR str2num(uint64_t &i, char const *s, int base = 0); +STR2NUM_ERROR str2num(int32_t &i, char const *s, int base = 0); +STR2NUM_ERROR str2num(uint32_t &i, char const *s, int base = 0); +STR2NUM_ERROR str2num(int16_t &i, char const *s, int base = 0); +STR2NUM_ERROR str2num(uint16_t &i, char const *s, int base = 0); + +#endif /* PKE_HELPERS_HPP */ -- cgit v1.2.3