summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 */