feat(str): add non-const SStrStr

This commit is contained in:
Adam Heinermann 2025-08-31 17:13:10 -07:00 committed by fallenoak
parent 4b1904ad4e
commit 59ce7f6f61
3 changed files with 63 additions and 26 deletions

View file

@ -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) {
size_t searchLength = SStrLen(search);
for (; *string; string++) {
if (!SStrCmp(string, search, searchLength)) {
return string;
}
}
return nullptr;
}
auto searchEnd = search;
while (*searchEnd) {
searchEnd++;
}
size_t searchLength = searchEnd - search;
auto substring = string;
while (SStrCmp(substring, search, searchLength)) {
substring++;
if (!*substring) {
return nullptr;
}
}
return substring;
}
void SStrTokenize(const char** string, char* buffer, size_t bufferchars, const char* whitespace, int32_t* quoted) {

View file

@ -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);

View file

@ -436,32 +436,64 @@ TEST_CASE("SStrVPrintf", "[string]") {
}
TEST_CASE("SStrStr", "[string]") {
auto string = "foobar";
char* string = "foobar";
static_assert(std::is_same<decltype(SStrStr(string, "")), char*>::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<decltype(SStrStr(string, "")), const char*>::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);
}
}