diff --git a/storm/String.cpp b/storm/String.cpp index 4f670d9..e992095 100644 --- a/storm/String.cpp +++ b/storm/String.cpp @@ -304,6 +304,49 @@ void SStrLower(char* string) { } } +uint32_t SStrPack(char* dest, const char* source, uint32_t destsize) { + STORM_ASSERT(dest); + STORM_ASSERT(source); + + if (!destsize) { + return 0; + } + + char* i; + const char* v5; + char v6; + const char* j; + + for (i = dest; *i; i++) + ; + + if (destsize == STORM_MAX_STR) { + v6 = *source; + + for (j = source; *j; i++) { + j++; + *i = v6; + v6 = *j; + } + } else { + v5 = source; + + if (*source) { + while (i < &dest[destsize - 1]) { + *i++ = *v5++; + + if (!*v5) { + *i = '\0'; + return i - dest; + } + } + } + } + + *i = '\0'; + return i - dest; +} + const char* SStrStr(const char* string, const char* search) { STORM_ASSERT(string); STORM_ASSERT(search); diff --git a/storm/String.hpp b/storm/String.hpp index d278d51..8211b4a 100644 --- a/storm/String.hpp +++ b/storm/String.hpp @@ -25,6 +25,8 @@ size_t SStrLen(const char* string); void SStrLower(char* string); +uint32_t SStrPack(char* dest, const char* source, uint32_t destsize); + const char* SStrStr(const char* string, const char* search); float SStrToFloat(const char* string); diff --git a/test/String.cpp b/test/String.cpp index 2c958af..06d505c 100644 --- a/test/String.cpp +++ b/test/String.cpp @@ -181,6 +181,32 @@ TEST_CASE("SStrLower", "[string]") { } } +TEST_CASE("SStrPack", "[string]") { + SECTION("truncates dest correctly when first byte in source is null") { + char dest[10] = { 0 }; + auto source = "\0foobar"; + auto length = SStrPack(dest, source, 10); + REQUIRE(length == 0); + REQUIRE(!SStrCmp(dest, "", SStrLen(""))); + } + + SECTION("truncates dest correctly when middle byte in source is null") { + char dest[10] = { 0 }; + auto source = "foo\0bar"; + auto length = SStrPack(dest, source, 10); + REQUIRE(length == 3); + REQUIRE(!SStrCmp(dest, "foo", SStrLen("foo"))); + } + + SECTION("does not truncate dest when source has no early null byte") { + char dest[10] = { 0 }; + auto source = "foobar"; + auto length = SStrPack(dest, source, 10); + REQUIRE(length == 6); + REQUIRE(!SStrCmp(dest, "foobar", SStrLen("foobar"))); + } +} + TEST_CASE("SStrStr", "[string]") { SECTION("finds substring when it exists at end of string") { auto string = "foobar";