diff --git a/dlls/msvcrt/printf.h b/dlls/msvcrt/printf.h index f68eaf66cd1..ce7a70e7571 100644 --- a/dlls/msvcrt/printf.h +++ b/dlls/msvcrt/printf.h @@ -473,6 +473,10 @@ int FUNC_NAME(pf_printf)(FUNC_NAME(puts_clbk) pf_puts, void *puts_ctx, const API flags.IntegerNative = *p++; } else if(*p == 'w') flags.WideString = *p++; +#if _MSVCR_VER >= 140 + else if(*p == 'z') + flags.IntegerNative = *p++; +#endif else if((*p == 'F' || *p == 'N') && legacy_msvcrt_compat) p++; /* ignore */ else diff --git a/dlls/msvcrt/tests/printf.c b/dlls/msvcrt/tests/printf.c index c8797f3bda8..295c6dd3020 100644 --- a/dlls/msvcrt/tests/printf.c +++ b/dlls/msvcrt/tests/printf.c @@ -321,6 +321,11 @@ static void test_sprintf( void ) ok(!strcmp(buffer,"D"),"I64D failed: %s\n",buffer); ok( r==1, "return count wrong\n"); + format = "%zx"; + r = sprintf(buffer,format,1); + ok(!strcmp(buffer, "zx"), "Problem with \"z\" interpretation\n"); + ok( r==2, "return count wrong\n"); + format = "% d"; r = sprintf(buffer,format,1); ok(!strcmp(buffer, " 1"),"Problem with sign place-holder: '%s'\n",buffer); diff --git a/dlls/ucrtbase/tests/printf.c b/dlls/ucrtbase/tests/printf.c index ae12b60d385..6c719eaf4b4 100644 --- a/dlls/ucrtbase/tests/printf.c +++ b/dlls/ucrtbase/tests/printf.c @@ -423,6 +423,29 @@ static void test_printf_legacy_three_digit_exp(void) ok(!strcmp(buf, "1.230000E+123"), "buf = %s\n", buf); } +static void test_printf_c99(void) +{ + char buf[20]; + + /* The msvcrt compatibility flag doesn't affect whether 'z' is interpreted + * as size_t size for integers. */ + if (sizeof(void*) == 8) { + vsprintf_wrapper(0, buf, sizeof(buf), "%zx %d", + (size_t) 0x12345678123456, 1); + ok(!strcmp(buf, "12345678123456 1"), "buf = %s\n", buf); + vsprintf_wrapper(UCRTBASE_PRINTF_LEGACY_MSVCRT_COMPATIBILITY, + buf, sizeof(buf), "%zx %d", (size_t) 0x12345678123456, 1); + ok(!strcmp(buf, "12345678123456 1"), "buf = %s\n", buf); + } else { + vsprintf_wrapper(0, buf, sizeof(buf), "%zx %d", + (size_t) 0x123456, 1); + ok(!strcmp(buf, "123456 1"), "buf = %s\n", buf); + vsprintf_wrapper(UCRTBASE_PRINTF_LEGACY_MSVCRT_COMPATIBILITY, + buf, sizeof(buf), "%zx %d", (size_t) 0x123456, 1); + ok(!strcmp(buf, "123456 1"), "buf = %s\n", buf); + } +} + START_TEST(printf) { if (!init()) return; @@ -434,4 +457,5 @@ START_TEST(printf) test_printf_legacy_wide(); test_printf_legacy_msvcrt(); test_printf_legacy_three_digit_exp(); + test_printf_c99(); }