Module: wine Branch: master Commit: b7ea63118ae1036b2a28ccbfafb43295362dd92e URL: http://source.winehq.org/git/wine.git/?a=commit;h=b7ea63118ae1036b2a28ccbfaf...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Sep 5 19:32:53 2011 +0200
msvcrt: Fix _vswprintf* arguments.
---
dlls/msvcrt/msvcrt.spec | 8 ++-- dlls/msvcrt/tests/printf.c | 123 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 2186904..b293e5e 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -1047,10 +1047,10 @@ @ cdecl _vsprintf_p(ptr long str ptr) MSVCRT_vsprintf_p @ cdecl _vsprintf_p_l(ptr long str ptr ptr) MSVCRT_vsprintf_p_l # stub _vsprintf_s_l(ptr long str ptr ptr) -@ cdecl _vswprintf(ptr long wstr ptr) MSVCRT_vswprintf -@ cdecl _vswprintf_c(ptr long wstr ptr) MSVCRT_vswprintf -@ cdecl _vswprintf_c_l(ptr long wstr ptr ptr) MSVCRT_vswprintf_l -@ cdecl _vswprintf_l(ptr long wstr ptr ptr) MSVCRT_vswprintf_l +@ cdecl _vswprintf(ptr wstr ptr) MSVCRT_vswprintf +@ cdecl _vswprintf_c(ptr long wstr ptr) MSVCRT_vsnwprintf +@ cdecl _vswprintf_c_l(ptr long wstr ptr ptr) MSVCRT_vsnwprintf_l +@ cdecl _vswprintf_l(ptr wstr ptr ptr) MSVCRT_vswprintf_l @ cdecl _vswprintf_p_l(ptr long wstr ptr ptr) MSVCRT_vswprintf_p_l @ cdecl _vswprintf_s_l(ptr long wstr ptr ptr) MSVCRT_vswprintf_s_l # stub _vwprintf_l(wstr ptr ptr) diff --git a/dlls/msvcrt/tests/printf.c b/dlls/msvcrt/tests/printf.c index eb34ad8..978b512 100644 --- a/dlls/msvcrt/tests/printf.c +++ b/dlls/msvcrt/tests/printf.c @@ -45,6 +45,16 @@ static int (__cdecl *p__fcvt_s)(char *buffer, size_t length, double number, int ndigits, int *decpt, int *sign); static unsigned int (__cdecl *p__get_output_format)(void); static int (__cdecl *p__vsprintf_p)(char*, size_t, const char*, __ms_va_list); +static int (__cdecl *p_vswprintf)(wchar_t *str, const wchar_t *format, __ms_va_list valist); +static int (__cdecl *p__vswprintf)(wchar_t *str, const wchar_t *format, __ms_va_list valist); +static int (__cdecl *p__vswprintf_l)(wchar_t *str, const wchar_t *format, + void *locale, __ms_va_list valist); +static int (__cdecl *p__vswprintf_c)(wchar_t *str, size_t size, const wchar_t *format, + __ms_va_list valist); +static int (__cdecl *p__vswprintf_c_l)(wchar_t *str, size_t size, const wchar_t *format, + void *locale, __ms_va_list valist); +static int (__cdecl *p__vswprintf_p_l)(wchar_t *str, size_t size, const wchar_t *format, + void *locale, __ms_va_list valist);
static void init( void ) { @@ -57,6 +67,12 @@ static void init( void ) p__fcvt_s = (void *)GetProcAddress(hmod, "_fcvt_s"); p__get_output_format = (void *)GetProcAddress(hmod, "_get_output_format"); p__vsprintf_p = (void*)GetProcAddress(hmod, "_vsprintf_p"); + p_vswprintf = (void*)GetProcAddress(hmod, "vswprintf"); + p__vswprintf = (void*)GetProcAddress(hmod, "_vswprintf"); + p__vswprintf_l = (void*)GetProcAddress(hmod, "_vswprintf_l"); + p__vswprintf_c = (void*)GetProcAddress(hmod, "_vswprintf_c"); + p__vswprintf_c_l = (void*)GetProcAddress(hmod, "_vswprintf_c_l"); + p__vswprintf_p_l = (void*)GetProcAddress(hmod, "_vswprintf_p_l"); }
static void test_sprintf( void ) @@ -943,6 +959,112 @@ static void test_vsnwprintf(void) ok( !strcmp(buf, "onetwothree"), "got %s expected 'onetwothree'\n", buf ); }
+static int __cdecl vswprintf_wrapper(wchar_t *str, const wchar_t *format, ...) +{ + int ret; + __ms_va_list valist; + __ms_va_start(valist, format); + ret = p_vswprintf(str, format, valist); + __ms_va_end(valist); + return ret; +} + +static int __cdecl _vswprintf_wrapper(wchar_t *str, const wchar_t *format, ...) +{ + int ret; + __ms_va_list valist; + __ms_va_start(valist, format); + ret = p__vswprintf(str, format, valist); + __ms_va_end(valist); + return ret; +} + +static int __cdecl _vswprintf_l_wrapper(wchar_t *str, const wchar_t *format, void *locale, ...) +{ + int ret; + __ms_va_list valist; + __ms_va_start(valist, locale); + ret = p__vswprintf_l(str, format, locale, valist); + __ms_va_end(valist); + return ret; +} + +static int __cdecl _vswprintf_c_wrapper(wchar_t *str, size_t size, const wchar_t *format, ...) +{ + int ret; + __ms_va_list valist; + __ms_va_start(valist, format); + ret = p__vswprintf_c(str, size, format, valist); + __ms_va_end(valist); + return ret; +} + +static int __cdecl _vswprintf_c_l_wrapper(wchar_t *str, size_t size, const wchar_t *format, void *locale, ...) +{ + int ret; + __ms_va_list valist; + __ms_va_start(valist, locale); + ret = p__vswprintf_c_l(str, size, format, locale, valist); + __ms_va_end(valist); + return ret; +} + +static int __cdecl _vswprintf_p_l_wrapper(wchar_t *str, size_t size, const wchar_t *format, void *locale, ...) +{ + int ret; + __ms_va_list valist; + __ms_va_start(valist, locale); + ret = p__vswprintf_p_l(str, size, format, locale, valist); + __ms_va_end(valist); + return ret; +} + +static void test_vswprintf(void) +{ + const wchar_t format[] = {'%','s',' ','%','d',0}; + const wchar_t number[] = {'n','u','m','b','e','r',0}; + const wchar_t out[] = {'n','u','m','b','e','r',' ','1','2','3',0}; + wchar_t buf[20]; + + int ret; + + if (!p_vswprintf || !p__vswprintf || !p__vswprintf_l ||!p__vswprintf_c + || !p__vswprintf_c_l || !p__vswprintf_p_l) + { + win_skip("_vswprintf or vswprintf not available\n"); + return; + } + + ret = vswprintf_wrapper(buf, format, number, 123); + ok(ret == 10, "got %d, expected 10\n", ret); + ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf)); + + memset(buf, 0, sizeof(buf)); + ret = _vswprintf_wrapper(buf, format, number, 123); + ok(ret == 10, "got %d, expected 10\n", ret); + ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf)); + + memset(buf, 0, sizeof(buf)); + ret = _vswprintf_l_wrapper(buf, format, NULL, number, 123); + ok(ret == 10, "got %d, expected 10\n", ret); + ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf)); + + memset(buf, 0, sizeof(buf)); + ret = _vswprintf_c_wrapper(buf, 20, format, number, 123); + ok(ret == 10, "got %d, expected 10\n", ret); + ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf)); + + memset(buf, 0, sizeof(buf)); + ret = _vswprintf_c_l_wrapper(buf, 20, format, NULL, number, 123); + ok(ret == 10, "got %d, expected 10\n", ret); + ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf)); + + memset(buf, 0, sizeof(buf)); + ret = _vswprintf_p_l_wrapper(buf, 20, format, NULL, number, 123); + ok(ret == 10, "got %d, expected 10\n", ret); + ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf)); +} + static int __cdecl _vscprintf_wrapper(const char *format, ...) { int ret; @@ -1120,6 +1242,7 @@ START_TEST(printf) test_vsnwprintf(); test_vscprintf(); test_vscwprintf(); + test_vswprintf(); test_vsnwprintf_s(); test_vsprintf_p(); test__get_output_format();