diff --git a/storm/String.cpp b/storm/String.cpp index 6afd66e..0cf003e 100644 --- a/storm/String.cpp +++ b/storm/String.cpp @@ -466,33 +466,36 @@ size_t SStrVPrintf(char* dest, size_t maxchars, const char* format, va_list argl return ISStrVPrintf(dest, maxchars, format, arglist); } +char* SStrStr(char* string, const char* search) { + STORM_VALIDATE_BEGIN; + STORM_VALIDATE(string); + STORM_VALIDATE(search); + STORM_VALIDATE_END; + + size_t searchLength = SStrLen(search); + + for (; *string; string++) { + if (!SStrCmp(string, search, searchLength)) { + return string; + } + } + return nullptr; +} + const char* SStrStr(const char* string, const char* search) { STORM_VALIDATE_BEGIN; STORM_VALIDATE(string); STORM_VALIDATE(search); STORM_VALIDATE_END; - if (!*string) { - return nullptr; - } + size_t searchLength = SStrLen(search); - auto searchEnd = search; - while (*searchEnd) { - searchEnd++; - } - size_t searchLength = searchEnd - search; - - auto substring = string; - - while (SStrCmp(substring, search, searchLength)) { - substring++; - - if (!*substring) { - return nullptr; + for (; *string; string++) { + if (!SStrCmp(string, search, searchLength)) { + return string; } } - - return substring; + return nullptr; } void SStrTokenize(const char** string, char* buffer, size_t bufferchars, const char* whitespace, int32_t* quoted) { diff --git a/storm/String.hpp b/storm/String.hpp index 8078095..d489607 100644 --- a/storm/String.hpp +++ b/storm/String.hpp @@ -36,6 +36,8 @@ size_t SStrPrintf(char* dest, size_t maxchars, const char* format, ...); size_t SStrVPrintf(char* dest, size_t maxchars, const char* format, va_list arglist); +char* SStrStr(char* string, const char* search); + const char* SStrStr(const char* string, const char* search); void SStrTokenize(const char** string, char* buffer, size_t bufferchars, const char* whitespace, int32_t* quoted); diff --git a/test/String.cpp b/test/String.cpp index 5a508b0..16c8b7e 100644 --- a/test/String.cpp +++ b/test/String.cpp @@ -436,32 +436,64 @@ TEST_CASE("SStrVPrintf", "[string]") { } TEST_CASE("SStrStr", "[string]") { - auto string = "foobar"; + char* string = "foobar"; + + static_assert(std::is_same::value, "Expect result to be char*"); SECTION("finds substring when it exists at end of string") { - auto search = "bar"; - auto substring = SStrStr(string, search); + char* substring = SStrStr(string, "bar"); REQUIRE(substring == string + 3); } SECTION("finds substring when it exists at start of string") { - auto search = "foo"; - auto substring = SStrStr(string, search); + char* substring = SStrStr(string, "foo"); REQUIRE(substring == string); } SECTION("finds substring when search is empty") { - auto substring = SStrStr(string, ""); + char* substring = SStrStr(string, ""); REQUIRE(substring == string); } SECTION("returns nullptr when search does not exist in string") { - auto substring = SStrStr(string, "xyzzy"); + char* substring = SStrStr(string, "xyzzy"); REQUIRE(substring == nullptr); } SECTION("returns nullptr when given empty string") { - auto substring = SStrStr("", "bar"); + char* string = ""; + char* substring = SStrStr(string, "bar"); + REQUIRE(substring == nullptr); + } +} + +TEST_CASE("SStrStr const", "[string]") { + const char* string = "foobar"; + + static_assert(std::is_same::value, "Expect result to be const char*"); + + SECTION("finds substring when it exists at end of string") { + const char* substring = SStrStr(string, "bar"); + REQUIRE(substring == string + 3); + } + + SECTION("finds substring when it exists at start of string") { + const char* substring = SStrStr(string, "foo"); + REQUIRE(substring == string); + } + + SECTION("finds substring when search is empty") { + const char* substring = SStrStr(string, ""); + REQUIRE(substring == string); + } + + SECTION("returns nullptr when search does not exist in string") { + const char* substring = SStrStr(string, "xyzzy"); + REQUIRE(substring == nullptr); + } + + SECTION("returns nullptr when given empty string") { + const char* substring = SStrStr("", "bar"); REQUIRE(substring == nullptr); } }