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