feat(string): add SStrPack

This commit is contained in:
fallenoak 2020-11-21 15:03:44 -06:00
parent 48797d7d3e
commit bc499d065c
No known key found for this signature in database
GPG key ID: 7628F8E61AEA070D
3 changed files with 71 additions and 0 deletions

View file

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

View file

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

View file

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