From e19e9145ddef4a8d664e60295a978921f2d301a0 Mon Sep 17 00:00:00 2001 From: "m.peau" Date: Mon, 12 Oct 2026 09:42:28 +0200 Subject: [PATCH] fix(libc): truncate strxfrm like FreeBSD's C locale Co-Authored-By: Claude Opus 5.5 (1M context) --- core/libs/prx/libc/src/Strings.cpp | 2 +- core/libs/tests/GuestStrings.cpp | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/core/libs/prx/libc/src/Strings.cpp b/core/libs/prx/libc/src/Strings.cpp index 564458ace..a30a58782 100644 --- a/core/libs/prx/libc/src/Strings.cpp +++ b/core/libs/prx/libc/src/Strings.cpp @@ -497,7 +497,7 @@ size_t APS5_VABI wcsxfrm_nid_postfix(char16_t* destination, const char16_t* sour } size_t APS5_VABI strxfrm_nid_postfix(char* destination, const char* source, size_t count) { - return std::strxfrm(destination, source, count); + return strlcpy_nid_postfix(destination, source, count); } char* APS5_VABI strtok_s_nid_postfix(char* str, const char* delim, char** context) { diff --git a/core/libs/tests/GuestStrings.cpp b/core/libs/tests/GuestStrings.cpp index 4ae9225c7..f9f8a489f 100644 --- a/core/libs/tests/GuestStrings.cpp +++ b/core/libs/tests/GuestStrings.cpp @@ -29,6 +29,7 @@ int APS5_VABI memcpy_s_nid_postfix(void*, std::size_t, const void*, std::size_t) int APS5_VABI memmove_s_nid_postfix(void*, std::size_t, const void*, std::size_t); int APS5_VABI memset_s_nid_postfix(void*, std::size_t, int, std::size_t); char* APS5_VABI strnstr_nid_postfix(const char*, const char*, std::size_t); +std::size_t APS5_VABI strxfrm_nid_postfix(char*, const char*, std::size_t); int APS5_VABI snprintf_s_nid_postfix(char*, std::size_t, const char*, ...); int APS5_VABI sscanf_s_nid_postfix(const char*, const char*, ...); int APS5_VABI __inet_aton_nid_postfix(const char*, void*); @@ -234,6 +235,20 @@ int main() { Require(stpcpy_nid_postfix(end, "") == end && chained[5] == 'z'); Require(strncat_nid_postfix(buffer, "xyz", 2) == buffer); Require(std::strcmp(buffer, "xy") == 0); + char transformed[8] = "zzzzzzz"; + Require(strxfrm_nid_postfix(transformed, "abc", sizeof(transformed)) == 3); + Require(std::strcmp(transformed, "abc") == 0 && transformed[4] == 'z'); + std::memset(transformed, 'z', sizeof(transformed)); + Require(strxfrm_nid_postfix(transformed, "abcdefgh", 4) == 8); + Require(std::strcmp(transformed, "abc") == 0 && transformed[4] == 'z'); + std::memset(transformed, 'z', sizeof(transformed)); + Require(strxfrm_nid_postfix(transformed, "abcdefg", sizeof(transformed)) == 7 && std::strcmp(transformed, "abcdefg") == 0); + std::memset(transformed, 'z', sizeof(transformed)); + Require(strxfrm_nid_postfix(transformed, "abcdefgh", sizeof(transformed)) == 8 && std::strcmp(transformed, "abcdefg") == 0); + std::memset(transformed, 'z', sizeof(transformed)); + Require(strxfrm_nid_postfix(transformed, "", sizeof(transformed)) == 0 && transformed[0] == '\0' && transformed[1] == 'z'); + Require(strxfrm_nid_postfix(transformed, "abc", 1) == 3 && transformed[0] == '\0' && transformed[1] == 'z'); + Require(strxfrm_nid_postfix(nullptr, "abc", 0) == 3); Require(strpbrk_nid_postfix(buffer, "ay") == buffer + 1); Require(strpbrk_nid_postfix(buffer, "") == nullptr); Require(strcspn_nid_postfix(buffer, "y") == 1);