diff --git a/core/libs/prx/libc/src/StringExtensions.cpp b/core/libs/prx/libc/src/StringExtensions.cpp index c15d39ef7..197546517 100644 --- a/core/libs/prx/libc/src/StringExtensions.cpp +++ b/core/libs/prx/libc/src/StringExtensions.cpp @@ -55,6 +55,12 @@ std::size_t APS5_VABI strlcat_nid_postfix(char* destination, const char* source, return destinationLength + sourceLength; } +char* APS5_VABI stpcpy_nid_postfix(char* destination, const char* source) { + const auto length = std::strlen(source); + std::memcpy(destination, source, length + 1); + return destination + length; +} + char* APS5_VABI strtok_r_nid_postfix(char* text, const char* delimiters, char** state) { if (text == nullptr) text = *state; if (text == nullptr) return nullptr; diff --git a/core/libs/tests/GuestStrings.cpp b/core/libs/tests/GuestStrings.cpp index a2f688d7d..37bb9d2e5 100644 --- a/core/libs/tests/GuestStrings.cpp +++ b/core/libs/tests/GuestStrings.cpp @@ -13,6 +13,7 @@ char* APS5_VABI strncat_nid_postfix(char*, const char*, std::size_t); char* APS5_VABI strpbrk_nid_postfix(const char*, const char*); std::size_t APS5_VABI strcspn_nid_postfix(const char*, const char*); std::size_t APS5_VABI strlcat_nid_postfix(char*, const char*, std::size_t); +char* APS5_VABI stpcpy_nid_postfix(char*, const char*); char* APS5_VABI strtok_r_nid_postfix(char*, const char*, char**); char* APS5_VABI strtok_nid_postfix(char*, const char*); char* APS5_VABI strcasestr_nid_postfix(const char*, const char*); @@ -133,6 +134,12 @@ int main() { Require(strlcat_nid_postfix(buffer, "xyz", 0) == 3); buffer[0] = '\0'; Require(strlcat_nid_postfix(buffer, "x", 1) == 1 && buffer[0] == '\0'); + char chained[8] = "zzzzzzz"; + char* end = stpcpy_nid_postfix(chained, "ab"); + Require(end == chained + 2 && *end == '\0' && chained[3] == 'z'); + end = stpcpy_nid_postfix(end, "cd"); + Require(end == chained + 4 && std::strcmp(chained, "abcd") == 0); + Require(stpcpy_nid_postfix(end, "") == end && chained[5] == 'z'); Require(strncat_nid_postfix(buffer, "xyz", 2) == buffer); Require(std::strcmp(buffer, "xy") == 0); Require(strpbrk_nid_postfix(buffer, "ay") == buffer + 1);