From 5ec28d3aacafce4a717c5bc2bacefaa54ef36842 Mon Sep 17 00:00:00 2001 From: Adam Heinermann Date: Fri, 14 Nov 2025 23:46:15 -0800 Subject: [PATCH] feat(string): add SStrChrBidir --- storm/String.cpp | 13 ++++++ storm/String.hpp | 2 + test/String.cpp | 76 ++++++++++++++++++++++++++++++++++++ test/stormdll/storm.def | 2 +- test/stormdll/stormstubs.cpp | 1 + 5 files changed, 93 insertions(+), 1 deletion(-) diff --git a/storm/String.cpp b/storm/String.cpp index d25b7e0..4402451 100644 --- a/storm/String.cpp +++ b/storm/String.cpp @@ -260,6 +260,19 @@ const char* STORMAPI SStrChr(const char* string, char search) { return string; } +const char* STORMAPI SStrChrBidir(const char* string, char search, int32_t reverse) { + STORM_VALIDATE_BEGIN; + STORM_VALIDATE(string); + STORM_VALIDATE_END; + + if (reverse) { + return SStrChrR(string, search); + } + else { + return SStrChr(string, search); + } +} + char* STORMAPI SStrChrR(char* string, char search) { STORM_VALIDATE_BEGIN; STORM_VALIDATE(string); diff --git a/storm/String.hpp b/storm/String.hpp index 5a6f837..9792afb 100644 --- a/storm/String.hpp +++ b/storm/String.hpp @@ -14,6 +14,8 @@ char* STORMAPI SStrChr(char* string, char search); const char* STORMAPI SStrChr(const char* string, char search); +const char* STORMAPI SStrChrBidir(const char* string, char search, int32_t reverse); + char* STORMAPI SStrChrR(char* string, char search); const char* STORMAPI SStrChrR(const char* string, char search); diff --git a/test/String.cpp b/test/String.cpp index f13b1e3..dbab386 100644 --- a/test/String.cpp +++ b/test/String.cpp @@ -122,6 +122,82 @@ TEST_CASE("SStrChrR const", "[string]") { } } +TEST_CASE("SStrChrBidir", "[string]") { + SECTION("forwards") { + const char* string = "foobar"; + + SECTION("finds first character when it exists at start of string") { + const char* result = SStrChrBidir(string, 'f', 0); + REQUIRE(result == string); + } + + SECTION("finds first character when it exists in middle of string") { + const char* result = SStrChrBidir(string, 'b', 0); + REQUIRE(result == string + 3); + } + + SECTION("finds first character when it exists at end of string") { + const char* result = SStrChrBidir(string, 'r', 0); + REQUIRE(result == string + 5); + } + + SECTION("returns nullptr when character does not exist in string") { + const char* result = SStrChrBidir(string, 'z', 0); + REQUIRE(result == nullptr); + } + + SECTION("returns nullptr when string is empty") { + const char* result = SStrChrBidir("", 'z', 0); + REQUIRE(result == nullptr); + } + + SECTION("returns nullptr when character is 0") { + const char* result = SStrChrBidir(string, '\0', 0); + REQUIRE(result == nullptr); + } + } + + SECTION("reversed") { + const char* string = "ffoobbaarr"; + + SECTION("finds last character when it exists at start of string") { + const char* result = SStrChrBidir(string, 'f', 1); + REQUIRE(result == string + 1); + } + + SECTION("finds last character when it exists in middle of string") { + const char* result = SStrChrBidir(string, 'b', 1); + REQUIRE(result == string + 5); + } + + SECTION("finds last character when it exists at end of string") { + const char* result = SStrChrBidir(string, 'r', 1); + REQUIRE(result == string + 9); + } + + SECTION("finds last character when it exists at start and end of string") { + const char* string = "ffoobbaarrff"; + const char* result = SStrChrBidir(string, 'f', 1); + REQUIRE(result == string + 11); + } + + SECTION("returns nullptr when character does not exist in string") { + const char* result = SStrChrBidir(string, 'z', 1); + REQUIRE(result == nullptr); + } + + SECTION("returns nullptr when string is empty") { + const char* result = SStrChrBidir("", 'z', 1); + REQUIRE(result == nullptr); + } + + SECTION("returns nullptr when character is 0") { + const char* result = SStrChrBidir(string, '\0', 1); + REQUIRE(result == nullptr); + } + } +} + #if !defined(WHOA_TEST_STORMDLL) TEST_CASE("SStrChrR", "[string]") { char string[] = "ffoobbaarr"; diff --git a/test/stormdll/storm.def b/test/stormdll/storm.def index a539988..2502209 100644 --- a/test/stormdll/storm.def +++ b/test/stormdll/storm.def @@ -322,7 +322,7 @@ EXPORTS SStrHash @502 NONAME SStrPack @503 NONAME SStrTokenize @504 NONAME - ;SStrChrBidir @505 NONAME + SStrChrBidir @505 NONAME SStrLen @506 NONAME SStrDupA @507 NONAME SStrCmp @508 NONAME diff --git a/test/stormdll/stormstubs.cpp b/test/stormdll/stormstubs.cpp index 6e20edd..4da5064 100644 --- a/test/stormdll/stormstubs.cpp +++ b/test/stormdll/stormstubs.cpp @@ -90,6 +90,7 @@ void STORMAPI SRgnOffseti(HSRGN, int32_t, int32_t) {} char* STORMAPI SStrChr(char*, char) { return 0; } const char* STORMAPI SStrChr(const char*, char) { return 0; } +const char* STORMAPI SStrChrBidir(const char*, char, int32_t) { return 0; } char* STORMAPI SStrChrR(char*, char) { return 0; } const char* STORMAPI SStrChrR(const char*, char) { return 0; } int32_t STORMAPI SStrCmp(const char*, const char*, size_t) { return 0; }