summaryrefslogtreecommitdiff
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
parentf04604a9784be6c32a7f8f42b9633872a03ce897 (diff)
prase int string helpers - untested
-rw-r--r--CMakeLists.txt2
-rw-r--r--src/helpers.cpp115
-rw-r--r--src/helpers.hpp15
3 files changed, 132 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0c651c2..57eccfb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -24,6 +24,8 @@ set(PKE_SOURCE_FILES
src/event.cpp
src/game.hpp
src/game.cpp
+ src/helpers.hpp
+ src/helpers.cpp
src/memory.hpp
src/memory.cpp
src/memory-allocator.hpp
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;
+}
+
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 <cstdint>
+
+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 */