From: Trung Nguyen <me@trungnt2910.com> Co-authored-by: Piotr Caban <piotr@codeweavers.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=59563 --- dlls/msvcrt/tests/printf.c | 19 +++++++++++++++++++ dlls/ucrtbase/tests/printf.c | 23 ++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/dlls/msvcrt/tests/printf.c b/dlls/msvcrt/tests/printf.c index c21b1285275..d401f449f84 100644 --- a/dlls/msvcrt/tests/printf.c +++ b/dlls/msvcrt/tests/printf.c @@ -33,6 +33,7 @@ #include "windef.h" #include "winbase.h" #include "winnls.h" +#include "winternl.h" #include "wine/test.h" @@ -170,6 +171,7 @@ static void test_sprintf( void ) { "% d", " 1", 0, INT_ARG, 1 }, { "%+ d", "+1", 0, INT_ARG, 1 }, { "%S", "wide", 0, PTR_ARG, 0, 0, 0, L"wide" }, + { "%Z", "ansi", 0, PTR_ARG, 0, 0, 0, &(ANSI_STRING){ 4, 4, (char *)"ansi" } }, { "%04c", "0001", 0, INT_ARG, '1' }, { "%-04c", "1 ", 0, INT_ARG, '1' }, { "%#012x", "0x0000000001", 0, INT_ARG, 1 }, @@ -194,6 +196,9 @@ static void test_sprintf( void ) { "%w-s", "-s", 0, PTR_ARG, 0, 0, 0, L"wide" }, { "%ls", "wide", 0, PTR_ARG, 0, 0, 0, L"wide" }, { "%Ls", "not wide", 0, PTR_ARG, 0, 0, 0, "not wide" }, + { "%wZ", "wide", 0, PTR_ARG, 0, 0, 0, &(UNICODE_STRING){ 8, 8, (wchar_t *)L"wide" } }, + { "%wZ", "wi", 0, PTR_ARG, 0, 0, 0, &(UNICODE_STRING){ 4, 8, (wchar_t *)L"wide" } }, + { "%hZ", "not wide", 0, PTR_ARG, 0, 0, 0, &(ANSI_STRING){ 8, 8, (char *)"not wide" } }, { "%b", "b", 0, NO_ARG }, { "%3c", " a", 0, INT_ARG, 'a' }, { "%3d", "1234", 0, INT_ARG, 1234 }, @@ -215,6 +220,10 @@ static void test_sprintf( void ) { "%o", "12", 0, INT_ARG, 10 }, { "%s", "(null)", 0, PTR_ARG, 0, 0, 0, NULL }, { "%s", "%%%%", 0, PTR_ARG, 0, 0, 0, "%%%%" }, + { "%Z", "(null)", 0, PTR_ARG, 0, 0, 0, NULL }, + { "%Z", "(null)", 0, PTR_ARG, 0, 0, 0, &(ANSI_STRING){ 0, 0, NULL } }, + { "%Z", "(null)", 0, PTR_ARG, 0, 0, 0, &(ANSI_STRING){ 1, 1, NULL } }, + { "%Z", "no", 0, PTR_ARG, 0, 0, 0, &(ANSI_STRING){ 2, 8, (char *)"not wide" } }, { "%u", "4294967295", 0, INT_ARG, -1 }, { "%w", "", 0, INT_ARG, -1 }, { "%h", "", 0, INT_ARG, -1 }, @@ -434,6 +443,11 @@ static void test_sprintf( void ) r = p_sprintf(buffer, "% *2d", 0, 7); ok(r==2, "r = %d\n", r); ok(!strcmp(buffer, " 7"), "failed: \"%s\"\n", buffer); + + errno = 0; + r = p_sprintf(buffer, "%wZ", &(UNICODE_STRING){ 5, 8, (wchar_t *)L"wide" }); + ok(r==-1, "r = %d\n", r); + ok(errno == EINVAL, "errno = %d\n", errno); } static void test_swprintf( void ) @@ -441,6 +455,7 @@ static void test_swprintf( void ) wchar_t buffer[100]; double pnumber = 789456123; const char string[] = "string"; + ANSI_STRING ansi_string = { 11, 11, (char *)"ansi string" }; swprintf(buffer, L"%+#23.15e", pnumber); ok(wcsstr(buffer, L"e+008") != 0, "Sprintf different\n"); @@ -450,6 +465,10 @@ static void test_swprintf( void ) ok(wcslen(buffer) == 6, "Problem with \"%%S\" interpretation\n"); swprintf(buffer, L"%hs", string); ok(!wcscmp(L"string", buffer), "swprintf failed with %%hs\n"); + swprintf(buffer, L"%Z", &ansi_string); + ok(!wcscmp(L"ansi string", buffer), "swprintf failed with %%Z\n"); + swprintf(buffer, L"%hZ", &ansi_string); + ok(!wcscmp(L"ansi string", buffer), "swprintf failed with %%hZ\n"); } static void test_snprintf (void) diff --git a/dlls/ucrtbase/tests/printf.c b/dlls/ucrtbase/tests/printf.c index 16dd4f3727b..5b841047f0b 100644 --- a/dlls/ucrtbase/tests/printf.c +++ b/dlls/ucrtbase/tests/printf.c @@ -29,6 +29,7 @@ #include "windef.h" #include "winbase.h" #include "winnls.h" +#include "winternl.h" #include "wine/test.h" @@ -533,14 +534,19 @@ static void test_printf_legacy_wide(void) { const wchar_t wide[] = {'A','B','C','D',0}; const char narrow[] = "abcd"; + const UNICODE_STRING wide_str = { 8, sizeof(wide), (wchar_t *)wide }; + const ANSI_STRING narrow_str = { 4, sizeof(narrow), (char *)narrow }; const char out[] = "abcd ABCD"; /* The legacy wide flag doesn't affect narrow printfs, so the same * format should behave the same both with and without the flag. */ const char narrow_fmt[] = "%s %ls"; + const char narrow_str_fmt[] = "%hZ %Z"; /* The standard behaviour is to use the same format as for the narrow * case, while the legacy case has got a different meaning for %s. */ const wchar_t std_wide_fmt[] = {'%','s',' ','%','l','s',0}; const wchar_t legacy_wide_fmt[] = {'%','h','s',' ','%','s',0}; + const wchar_t std_wide_str_fmt[] = {'%','h','Z',' ','%','Z',0}; + const wchar_t legacy_wide_str_fmt[] = {'%','Z',' ','%','l','Z',0}; char buffer[20]; wchar_t wbuffer[20]; @@ -549,10 +555,25 @@ static void test_printf_legacy_wide(void) vsprintf_wrapper(_CRT_INTERNAL_PRINTF_LEGACY_WIDE_SPECIFIERS, buffer, sizeof(buffer), narrow_fmt, narrow, wide); ok(!strcmp(buffer, out), "buffer wrong, got=%s\n", buffer); + vsprintf_wrapper(0, buffer, sizeof(buffer), narrow_str_fmt, &narrow_str, &wide_str); + ok(!strcmp(buffer, out), "buffer wrong, got=%s\n", buffer); + vsprintf_wrapper(_CRT_INTERNAL_PRINTF_LEGACY_WIDE_SPECIFIERS, buffer, + sizeof(buffer), narrow_str_fmt, &narrow_str, &wide_str); + ok(!strcmp(buffer, out), "buffer wrong, got=%s\n", buffer); + vswprintf_wrapper(0, wbuffer, sizeof(wbuffer), std_wide_fmt, narrow, wide); WideCharToMultiByte(CP_ACP, 0, wbuffer, -1, buffer, sizeof(buffer), NULL, NULL); ok(!strcmp(buffer, out), "buffer wrong, got=%s\n", buffer); - vswprintf_wrapper(_CRT_INTERNAL_PRINTF_LEGACY_WIDE_SPECIFIERS, wbuffer, sizeof(wbuffer), legacy_wide_fmt, narrow, wide); + vswprintf_wrapper(_CRT_INTERNAL_PRINTF_LEGACY_WIDE_SPECIFIERS, wbuffer, + sizeof(wbuffer), legacy_wide_fmt, narrow, wide); + WideCharToMultiByte(CP_ACP, 0, wbuffer, -1, buffer, sizeof(buffer), NULL, NULL); + ok(!strcmp(buffer, out), "buffer wrong, got=%s\n", buffer); + + vswprintf_wrapper(0, wbuffer, sizeof(wbuffer), std_wide_str_fmt, &narrow_str, &wide_str); + WideCharToMultiByte(CP_ACP, 0, wbuffer, -1, buffer, sizeof(buffer), NULL, NULL); + ok(!strcmp(buffer, out), "buffer wrong, got=%s\n", buffer); + vswprintf_wrapper(_CRT_INTERNAL_PRINTF_LEGACY_WIDE_SPECIFIERS, wbuffer, + sizeof(wbuffer), legacy_wide_str_fmt, &narrow_str, &wide_str); WideCharToMultiByte(CP_ACP, 0, wbuffer, -1, buffer, sizeof(buffer), NULL, NULL); ok(!strcmp(buffer, out), "buffer wrong, got=%s\n", buffer); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10460