[PATCH v2 6/7] ucrtbase: Handle the C99 'z' size_t specifier for integers
Martin Storsjo
martin at martin.st
Mon Nov 2 15:26:30 CST 2015
Signed-off-by: Martin Storsjo <martin at martin.st>
---
Rebased on top of the updated version of preceding patches.
---
dlls/msvcrt/printf.h | 4 ++++
dlls/msvcrt/tests/printf.c | 5 +++++
dlls/ucrtbase/tests/printf.c | 20 ++++++++++++++++++++
3 files changed, 29 insertions(+)
diff --git a/dlls/msvcrt/printf.h b/dlls/msvcrt/printf.h
index f68eaf6..ce7a70e 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 633f07b..30f9a97 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 ff6eb01..e9bb25c 100644
--- a/dlls/ucrtbase/tests/printf.c
+++ b/dlls/ucrtbase/tests/printf.c
@@ -423,6 +423,25 @@ static void test_legacy_three_digit_exp(void)
ok(!strcmp(buf, "1.230000E+123"), "buf = %s\n", buf);
}
+static void test_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 +453,5 @@ START_TEST(printf)
test_legacy_wide();
test_legacy_msvcrt();
test_legacy_three_digit_exp();
+ test_c99();
}
--
1.8.1.2
More information about the wine-patches
mailing list