summaryrefslogtreecommitdiff
path: root/src/helpers.cpp
diff options
context:
space:
mode:
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;
+}
+