From e411282b807978e8e9ef871d5770a0b4bd81161f Mon Sep 17 00:00:00 2001 From: journaltraces Date: Thu, 8 Oct 2026 22:25:17 +0300 Subject: [PATCH] feat(libc): implement stpcpy PICO-8 for PS5 (PPSA99808) imports stpcpy from libSceLibcInternal, one of the absent imports #1578 lists for it. POSIX defines it as strcpy that returns a pointer to the terminating null of the copy. --- core/libs/prx/libc/src/StringExtensions.cpp | 6 ++++++ core/libs/tests/GuestStrings.cpp | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/core/libs/prx/libc/src/StringExtensions.cpp b/core/libs/prx/libc/src/StringExtensions.cpp index a9a759763..b541d1d9e 100644 --- a/core/libs/prx/libc/src/StringExtensions.cpp +++ b/core/libs/prx/libc/src/StringExtensions.cpp @@ -54,6 +54,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 019e4425c..fa215fb5e 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*); @@ -132,6 +133,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);