diff options
author | Masy98 <masy@antheruscraft.de> | 2014-08-30 21:31:51 +0200 |
---|---|---|
committer | Masy98 <masy@antheruscraft.de> | 2014-08-30 21:31:51 +0200 |
commit | 2d5a38bd61aa9436f2944f26344b14f92e30f025 (patch) | |
tree | d1caaf6446574ffdf676c272e39404ed8184a33b /src/StringUtils.h | |
parent | Fixed slab name (diff) | |
parent | cChunk: Fixed the Coords param. (diff) | |
download | cuberite-2d5a38bd61aa9436f2944f26344b14f92e30f025.tar cuberite-2d5a38bd61aa9436f2944f26344b14f92e30f025.tar.gz cuberite-2d5a38bd61aa9436f2944f26344b14f92e30f025.tar.bz2 cuberite-2d5a38bd61aa9436f2944f26344b14f92e30f025.tar.lz cuberite-2d5a38bd61aa9436f2944f26344b14f92e30f025.tar.xz cuberite-2d5a38bd61aa9436f2944f26344b14f92e30f025.tar.zst cuberite-2d5a38bd61aa9436f2944f26344b14f92e30f025.zip |
Diffstat (limited to 'src/StringUtils.h')
-rw-r--r-- | src/StringUtils.h | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/StringUtils.h b/src/StringUtils.h index 3d4379352..72a90a8c2 100644 --- a/src/StringUtils.h +++ b/src/StringUtils.h @@ -9,6 +9,7 @@ #pragma once #include <string> +#include <limits> @@ -98,6 +99,68 @@ extern int GetBEInt(const char * a_Mem); /// Writes four bytes to the specified memory location so that they interpret as BigEndian int extern void SetBEInt(char * a_Mem, Int32 a_Value); +/// Parses any integer type. Checks bounds and returns errors out of band. +template <class T> +bool StringToInteger(const AString & a_str, T & a_Num) +{ + size_t i = 0; + bool positive = true; + T result = 0; + if (a_str[0] == '+') + { + i++; + } + else if (a_str[0] == '-') + { + i++; + positive = false; + } + if (positive) + { + for (size_t size = a_str.size(); i < size; i++) + { + if ((a_str[i] < '0') || (a_str[i] > '9')) + { + return false; + } + if (std::numeric_limits<T>::max() / 10 < result) + { + return false; + } + result *= 10; + T digit = a_str[i] - '0'; + if (std::numeric_limits<T>::max() - digit < result) + { + return false; + } + result += digit; + } + } + else + { + for (size_t size = a_str.size(); i < size; i++) + { + if ((a_str[i] < '0') || (a_str[i] > '9')) + { + return false; + } + if (std::numeric_limits<T>::min() / 10 > result) + { + return false; + } + result *= 10; + T digit = a_str[i] - '0'; + if (std::numeric_limits<T>::min() + digit > result) + { + return false; + } + result -= digit; + } + } + a_Num = result; + return true; +} + // If you have any other string helper functions, declare them here |