summaryrefslogtreecommitdiff
path: root/src/helpers.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-09-22 09:20:58 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-25 06:53:34 -0400
commit31dc984812e538f3db37d7d8816db0fa649f4f27 (patch)
tree5060e7e510610cc4977144d81d253a8f0dc55810 /src/helpers.cpp
parentf04604a9784be6c32a7f8f42b9633872a03ce897 (diff)
prase int string helpers - untested
Diffstat (limited to 'src/helpers.cpp')
-rw-r--r--src/helpers.cpp115
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;
+}
+