From 3d59699e1b1f3e1c1da6286ba590241fd2c594ff Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sat, 21 Nov 2020 13:14:15 -0600 Subject: [PATCH] feat(string): add SStrToInt --- storm/String.cpp | 24 ++++++++++++++++++++++++ storm/String.hpp | 2 ++ test/String.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/storm/String.cpp b/storm/String.cpp index 55bba63..cfaabb0 100644 --- a/storm/String.cpp +++ b/storm/String.cpp @@ -288,3 +288,27 @@ const char* SStrStr(const char* string, const char* search) { return substring; } + +int32_t SStrToInt(const char* string) { + STORM_ASSERT(string); + + int32_t result = 0; + bool negative = false; + + if (*string == '-') { + negative = true; + string++; + } + + uint32_t digit; + while ((digit = *string - '0') < 10) { + result = digit + (10 * result); + string++; + } + + if (negative) { + result = -result; + } + + return result; +} diff --git a/storm/String.hpp b/storm/String.hpp index 1d9f1c5..f692703 100644 --- a/storm/String.hpp +++ b/storm/String.hpp @@ -27,4 +27,6 @@ void SStrLower(char* string); const char* SStrStr(const char* string, const char* search); +int32_t SStrToInt(const char* string); + #endif diff --git a/test/String.cpp b/test/String.cpp index 068b079..953e173 100644 --- a/test/String.cpp +++ b/test/String.cpp @@ -217,3 +217,47 @@ TEST_CASE("SStrStr", "[string]") { REQUIRE(substring == nullptr); } } + +TEST_CASE("SStrToInt", "[string]") { + SECTION("converts empty string to int") { + auto string = ""; + auto result = SStrToInt(string); + REQUIRE(result == 0); + } + + SECTION("converts whitespace string to int") { + auto string = " "; + auto result = SStrToInt(string); + REQUIRE(result == 0); + } + + SECTION("converts string with positive number to int") { + auto string = "123"; + auto result = SStrToInt(string); + REQUIRE(result == 123); + } + + SECTION("converts string with negative number to int") { + auto string = "-123"; + auto result = SStrToInt(string); + REQUIRE(result == -123); + } + + SECTION("converts string with zero to int") { + auto string = "0"; + auto result = SStrToInt(string); + REQUIRE(result == 0); + } + + SECTION("converts string with leading zero to int") { + auto string = "01"; + auto result = SStrToInt(string); + REQUIRE(result == 1); + } + + SECTION("converts string with two whitespace-separated numbers to int") { + auto string = "123 456"; + auto result = SStrToInt(string); + REQUIRE(result == 123); + } +}