From 7cc21d03309389586d57b2317dd135febe7828c1 Mon Sep 17 00:00:00 2001 From: Akihiro Sagawa Date: Wed, 19 Feb 2020 23:21:35 +0900 Subject: [PATCH] user32: Fix wsprintfA %C conversion. Signed-off-by: Akihiro Sagawa Signed-off-by: Alexandre Julliard --- dlls/user32/tests/wsprintf.c | 2 -- dlls/user32/wsprintf.c | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/dlls/user32/tests/wsprintf.c b/dlls/user32/tests/wsprintf.c index 84dc0eb39b9..79d2112cd2c 100644 --- a/dlls/user32/tests/wsprintf.c +++ b/dlls/user32/tests/wsprintf.c @@ -111,12 +111,10 @@ static void wsprintfATest(void) memset(buf, 0x11, sizeof(buf)); rc = wsprintfA(buf, testcase[i].fmt, testcase[i].input); - todo_wine_if( i == 7 ) ok(rc == testcase[i].rc, "%u: expected %d, got %d\n", i, testcase[i].rc, rc); - todo_wine_if( i == 7 || i == 8 || i == 9 ) ok(!strcmp(buf, testcase[i].str), "%u: expected %s, got %s\n", i, wine_dbgstr_a(testcase[i].str), wine_dbgstr_an(buf, rc)); diff --git a/dlls/user32/wsprintf.c b/dlls/user32/wsprintf.c index e5e6c10dbb5..b197b714f68 100644 --- a/dlls/user32/wsprintf.c +++ b/dlls/user32/wsprintf.c @@ -255,8 +255,11 @@ static UINT WPRINTF_GetLen( WPRINTF_FORMAT *format, WPRINTF_DATA *arg, switch(format->type) { case WPR_CHAR: - case WPR_WCHAR: return (format->precision = 1); + case WPR_WCHAR: + if (dst_is_wide) len = 1; + else len = WideCharToMultiByte( CP_ACP, 0, &arg->wchar_view, 1, NULL, 0, NULL, NULL ); + return (format->precision = len); case WPR_STRING: if (!arg->lpcstr_view) arg->lpcstr_view = null_stringA; if (dst_is_wide) @@ -387,7 +390,14 @@ static INT wvsnprintfA( LPSTR buffer, UINT maxlen, LPCSTR spec, __ms_va_list arg switch(format.type) { case WPR_WCHAR: - *p++ = argData.wchar_view; + { + CHAR mb[5]; + if (WideCharToMultiByte( CP_ACP, 0, &argData.wchar_view, 1, mb, sizeof(mb), NULL, NULL )) + { + memcpy( p, mb, len ); + p += len; + } + } break; case WPR_CHAR: *p++ = argData.char_view; -- 2.11.4.GIT