From 3e24b01fe1e8249143021200b4542bcfa2497671 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sat, 21 Nov 2020 21:02:01 -0600 Subject: [PATCH] feat(string): add SStrPrintf --- storm/String.cpp | 35 +++++++++++++++++++++++++++++++++++ storm/String.hpp | 2 ++ test/String.cpp | 18 ++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/storm/String.cpp b/storm/String.cpp index aeb8913..179da04 100644 --- a/storm/String.cpp +++ b/storm/String.cpp @@ -4,6 +4,8 @@ #include "storm/string/bjhash.hpp" #include #include +#include +#include #include #include @@ -167,6 +169,29 @@ void InitializeFloatDigits() { } } +size_t ISStrVPrintf(const char* format, va_list va, char* dest, size_t maxchars) { + if (!maxchars) { + return 0; + } + + size_t result; + + if (maxchars == STORM_MAX_STR) { + // TODO conditional vsoprintf; + result = vsprintf(dest, format, va); + } else { + // TODO conditional vsnoprintf; + result = vsnprintf(dest, maxchars, format, va); + + if (result >= maxchars) { + result = maxchars - 1; + dest[result] = '\0'; + } + } + + return result; +} + void SStrInitialize() { if (!s_initialized) { InitializeFloatDigits(); @@ -347,6 +372,16 @@ uint32_t SStrPack(char* dest, const char* source, uint32_t destsize) { return i - dest; } +size_t SStrPrintf(char* dest, size_t maxchars, const char* format, ...) { + va_list va; + va_start(va, format); + + STORM_ASSERT(dest); + STORM_ASSERT(format); + + return ISStrVPrintf(format, va, dest, maxchars); +} + 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 0299f40..98d9a72 100644 --- a/storm/String.hpp +++ b/storm/String.hpp @@ -27,6 +27,8 @@ void SStrLower(char* string); uint32_t SStrPack(char* dest, const char* source, uint32_t destsize); +size_t SStrPrintf(char* dest, size_t maxchars, const char* format, ...); + 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 3f9f7d6..f59c153 100644 --- a/test/String.cpp +++ b/test/String.cpp @@ -207,6 +207,24 @@ TEST_CASE("SStrPack", "[string]") { } } +TEST_CASE("SStrPrintf", "[string]") { + SECTION("fills dest with formatted string") { + char dest[100] = { 0 }; + auto format = "%s - %s"; + auto length = SStrPrintf(dest, 100, format, "foo", "bar"); + REQUIRE(length == 9); + REQUIRE(!SStrCmp(dest, "foo - bar", SStrLen("foo - bar"))); + } + + SECTION("fills dest with empty string") { + char dest[100] = { 0 }; + auto format = ""; + auto length = SStrPrintf(dest, 100, format); + REQUIRE(length == 0); + REQUIRE(!SStrCmp(dest, "", SStrLen(""))); + } +} + TEST_CASE("SStrStr", "[string]") { SECTION("finds substring when it exists at end of string") { auto string = "foobar";