From 0dafa3a70a9244b92ad9f537d60ccb00f4f29399 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sat, 21 Nov 2020 12:11:01 -0600 Subject: [PATCH] feat(string): add SStrChr --- storm/String.cpp | 18 ++++++++++++++++++ storm/String.hpp | 2 ++ test/String.cpp | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/storm/String.cpp b/storm/String.cpp index 3ec6f7c..d014cf8 100644 --- a/storm/String.cpp +++ b/storm/String.cpp @@ -132,6 +132,24 @@ void GetNextTextUpper(uint32_t* orig, const char** string, uint32_t* upper) { } } +const char* SStrChr(const char* string, char search) { + STORM_ASSERT(string); + + if (!*string) { + return nullptr; + } + + while (*string != search) { + string++; + + if (!*string) { + return nullptr; + } + } + + return string; +} + int32_t SStrCmp(const char* string1, const char* string2, size_t maxchars) { return strncmp(string1, string2, maxchars); } diff --git a/storm/String.hpp b/storm/String.hpp index c58d5db..7cc0268 100644 --- a/storm/String.hpp +++ b/storm/String.hpp @@ -7,6 +7,8 @@ #define STORM_MAX_PATH 260 #define STORM_MAX_STR 0x7FFFFFFF +const char* SStrChr(const char* string, char search); + int32_t SStrCmp(const char* string1, const char* string2, size_t maxchars); int32_t SStrCmpI(const char* string1, const char* string2, size_t maxchars); diff --git a/test/String.cpp b/test/String.cpp index dcc02af..0a7ad15 100644 --- a/test/String.cpp +++ b/test/String.cpp @@ -2,6 +2,43 @@ #include "storm/Memory.hpp" #include "test/Test.hpp" +TEST_CASE("SStrChr", "[string]") { + SECTION("finds first character when it exists at start of string") { + auto string = "foobar"; + auto search = 'f'; + auto result = SStrChr(string, search); + REQUIRE(result == string); + } + + SECTION("finds first character when it exists in middle of string") { + auto string = "foobar"; + auto search = 'b'; + auto result = SStrChr(string, search); + REQUIRE(result == string + 3); + } + + SECTION("finds first character when it exists at end of string") { + auto string = "foobar"; + auto search = 'r'; + auto result = SStrChr(string, search); + REQUIRE(result == string + 5); + } + + SECTION("returns nullptr when character does not exist in string") { + auto string = "foobar"; + auto search = 'z'; + auto result = SStrChr(string, search); + REQUIRE(result == nullptr); + } + + SECTION("returns nullptr when string is empty") { + auto string = ""; + auto search = 'z'; + auto result = SStrChr(string, search); + REQUIRE(result == nullptr); + } +} + TEST_CASE("SStrCmp", "[string]") { SECTION("compares two strings that exactly match correctly") { auto compare = SStrCmp("foo", "foo", STORM_MAX_STR);