diff --git a/storm/String.cpp b/storm/String.cpp index 43a6b1a..f99c39e 100644 --- a/storm/String.cpp +++ b/storm/String.cpp @@ -1,5 +1,6 @@ #include "storm/String.hpp" #include "storm/Error.hpp" +#include "storm/Memory.hpp" #include "storm/string/bjhash.hpp" #include #include @@ -171,6 +172,14 @@ size_t SStrCopy(char* dest, const char* source, size_t destsize) { return static_cast(destbuf - dest); } +char* SStrDupA(const char* string, const char* filename, uint32_t linenumber) { + size_t len = SStrLen(string) + 1; + char* dup = static_cast(SMemAlloc(len, filename, linenumber, 0x0)); + memcpy(dup, string, len); + + return dup; +} + uint32_t SStrHashHT(const char* string) { char normalized[0x400]; char* buf = normalized; diff --git a/storm/String.hpp b/storm/String.hpp index 6b27ddb..aa9b1cc 100644 --- a/storm/String.hpp +++ b/storm/String.hpp @@ -13,6 +13,8 @@ int32_t SStrCmpI(const char* string1, const char* string2, size_t maxchars); size_t SStrCopy(char* dest, const char* source, size_t destsize); +char* SStrDupA(const char* string, const char* filename, uint32_t linenumber); + uint32_t SStrHashHT(const char* string); size_t SStrLen(const char* string); diff --git a/test/String.cpp b/test/String.cpp index 97238fc..70ce93c 100644 --- a/test/String.cpp +++ b/test/String.cpp @@ -1,4 +1,5 @@ #include "storm/String.hpp" +#include "storm/Memory.hpp" #include "test/Test.hpp" TEST_CASE("SStrCmp", "[string]") { @@ -37,6 +38,19 @@ TEST_CASE("SStrCmpI", "[string]") { } } +TEST_CASE("SStrDupA", "[string]") { + SECTION("duplicates string correctly") { + auto string1 = "foo bar"; + auto string2 = SStrDupA(string1, __FILE__, __LINE__); + auto compare = SStrCmp(string1, string2, STORM_MAX_STR); + auto newPtr = string1 != string2; + SMemFree(string2); + + REQUIRE(compare == 0); + REQUIRE(newPtr == true); + } +} + TEST_CASE("SStrHashHT", "[string]") { SECTION("hashes simple string correctly") { auto hash = SStrHashHT("foo");