From 866dd6ddbb06d9fd7ad88df42de7acbec2f3379d Mon Sep 17 00:00:00 2001 From: rjkiv <76180273+rjkiv@users.noreply.github.com> Date: Wed, 3 Sep 2025 14:21:33 -0700 Subject: [PATCH] implement _vswprintf_c_l --- dll/msvcrt.cpp | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/dll/msvcrt.cpp b/dll/msvcrt.cpp index 164da7b..9b0cede 100644 --- a/dll/msvcrt.cpp +++ b/dll/msvcrt.cpp @@ -1,5 +1,6 @@ #include "common.h" #include +#include #include #include #include @@ -442,11 +443,35 @@ namespace msvcrt { return wstrncmp(string1, string2, count); } - int WIN_ENTRY _vswprintf_c_l(uint16_t* buffer, size_t size, const uint16_t* format, va_list args) { + int WIN_ENTRY _vswprintf_c_l(uint16_t* buffer, size_t size, const uint16_t* format, ...) { + DEBUG_LOG("_vswprintf_c_l\n"); if (!buffer || !format || size == 0) return -1; - DEBUG_LOG("STUB: _vswprintf_c_l\n"); - return 0; + + std::string narrow_fmt = wideStringToString(format); + DEBUG_LOG("\tFmt: %s\n", narrow_fmt.c_str()); + + va_list args; + va_start(args, format); + int required = vsnprintf(nullptr, 0, narrow_fmt.c_str(), args); + va_end(args); + if (required < 0) { + buffer[0] = 0; + return -1; + } + + char buffer_narrow[required + 1]; + va_start(args, format); + vsnprintf(buffer_narrow, required + 1, narrow_fmt.c_str(), args); + va_end(args); + DEBUG_LOG("\tBuffer: %s\n", buffer_narrow); + + std::vector wide = stringToWideString(buffer_narrow); + size_t copy_len = std::min(wide.size(), size - 1); + std::memcpy(buffer, wide.data(), copy_len * sizeof(uint16_t)); + buffer[copy_len] = 0; + + return copy_len; // return vswprintf(buffer, size, format, args); this doesn't work because on this architecture, wchar_t is size 4, instead of size 2 }