Huw Davies : ucrtbase: Add support for natural string widths.

Alexandre Julliard julliard at winehq.org
Tue Aug 9 11:11:04 CDT 2016


Module: wine
Branch: master
Commit: 10eb6fa7180e4d762bb55603a987ee142021aa0f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=10eb6fa7180e4d762bb55603a987ee142021aa0f

Author: Huw Davies <huw at codeweavers.com>
Date:   Mon Aug  8 13:43:04 2016 +0100

ucrtbase: Add support for natural string widths.

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/printf.h         | 11 +++++++----
 dlls/ucrtbase/tests/printf.c | 19 +++++++++++++++++++
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/dlls/msvcrt/printf.h b/dlls/msvcrt/printf.h
index ce7a70e..6c9eeeb 100644
--- a/dlls/msvcrt/printf.h
+++ b/dlls/msvcrt/printf.h
@@ -35,7 +35,7 @@ typedef struct FUNC_NAME(pf_flags_t)
     APICHAR Sign, LeftAlign, Alternate, PadZero;
     int FieldLength, Precision;
     APICHAR IntegerLength, IntegerDouble, IntegerNative;
-    APICHAR WideString;
+    APICHAR WideString, NaturalString;
     APICHAR Format;
 } FUNC_NAME(pf_flags);
 
@@ -208,7 +208,8 @@ static inline int FUNC_NAME(pf_output_format_str)(FUNC_NAME(puts_clbk) pf_puts,
 static inline int FUNC_NAME(pf_handle_string)(FUNC_NAME(puts_clbk) pf_puts, void *puts_ctx,
         const void *str, int len, FUNC_NAME(pf_flags) *flags, MSVCRT_pthreadlocinfo locinfo, BOOL legacy_wide)
 {
-    BOOL complement_is_narrow = legacy_wide ? (sizeof(APICHAR)==sizeof(MSVCRT_wchar_t)) : FALSE;
+    BOOL api_is_wide = sizeof(APICHAR) == sizeof(MSVCRT_wchar_t);
+    BOOL complement_is_narrow = legacy_wide ? api_is_wide : FALSE;
 #ifdef PRINTF_WIDE
     static const MSVCRT_wchar_t nullW[] = {'(','n','u','l','l',')',0};
 
@@ -219,9 +220,9 @@ static inline int FUNC_NAME(pf_handle_string)(FUNC_NAME(puts_clbk) pf_puts, void
         return FUNC_NAME(pf_output_format_str)(pf_puts, puts_ctx, "(null)", 6, flags, locinfo);
 #endif
 
-    if(flags->WideString || flags->IntegerLength=='l')
+    if((flags->NaturalString && api_is_wide) || flags->WideString || flags->IntegerLength=='l')
         return FUNC_NAME(pf_output_format_wstr)(pf_puts, puts_ctx, str, len, flags, locinfo);
-    if(flags->IntegerLength == 'h')
+    if((flags->NaturalString && !api_is_wide) || flags->IntegerLength == 'h')
         return FUNC_NAME(pf_output_format_str)(pf_puts, puts_ctx, str, len, flags, locinfo);
 
     if((flags->Format=='S' || flags->Format=='C') == complement_is_narrow)
@@ -476,6 +477,8 @@ int FUNC_NAME(pf_printf)(FUNC_NAME(puts_clbk) pf_puts, void *puts_ctx, const API
 #if _MSVCR_VER >= 140
             else if(*p == 'z')
                 flags.IntegerNative = *p++;
+            else if(*p == 'T')
+                flags.NaturalString = *p++;
 #endif
             else if((*p == 'F' || *p == 'N') && legacy_msvcrt_compat)
                 p++; /* ignore */
diff --git a/dlls/ucrtbase/tests/printf.c b/dlls/ucrtbase/tests/printf.c
index 973217e..ae5ce8a 100644
--- a/dlls/ucrtbase/tests/printf.c
+++ b/dlls/ucrtbase/tests/printf.c
@@ -660,6 +660,24 @@ static void test_printf_c99(void)
     }
 }
 
+static void test_printf_natural_string(void)
+{
+    const wchar_t wide[] = {'A','B','C','D',0};
+    const char narrow[] = "abcd";
+    const char narrow_fmt[] = "%s %Ts";
+    const char narrow_out[] = "abcd abcd";
+    const wchar_t wide_fmt[] = {'%','s',' ','%','T','s',0};
+    const wchar_t wide_out[] = {'a','b','c','d',' ','A','B','C','D',0};
+    char buffer[20];
+    wchar_t wbuffer[20];
+
+    vsprintf_wrapper(0, buffer, sizeof(buffer), narrow_fmt, narrow, narrow);
+    ok(!strcmp(buffer, narrow_out), "buffer wrong, got=%s\n", buffer);
+
+    vswprintf_wrapper(0, wbuffer, sizeof(wbuffer), wide_fmt, narrow, wide);
+    ok(!lstrcmpW(wbuffer, wide_out), "buffer wrong, got=%s\n", wine_dbgstr_w(wbuffer));
+}
+
 START_TEST(printf)
 {
     if (!init()) return;
@@ -674,4 +692,5 @@ START_TEST(printf)
     test_printf_legacy_msvcrt();
     test_printf_legacy_three_digit_exp();
     test_printf_c99();
+    test_printf_natural_string();
 }




More information about the wine-cvs mailing list