[PATCH] ucrtbase: Add __stdio_common_vsprintf_p.
Alex Henrie
alexhenrie24 at gmail.com
Thu Oct 12 23:01:07 CDT 2017
Fixes https://bugs.winehq.org/show_bug.cgi?id=43810
To simplify implementation, I created a helper function
MSVCRT_vsprintf_p_l_opt similar to MSVCRT_vswprintf_p_l_opt.
Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
.../api-ms-win-crt-stdio-l1-1-0.spec | 2 +-
dlls/msvcrt/wcs.c | 35 ++++++++++++++++------
dlls/ucrtbase/ucrtbase.spec | 2 +-
3 files changed, 28 insertions(+), 11 deletions(-)
diff --git a/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec b/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec
index 98bb853a22..4921883e05 100644
--- a/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec
@@ -12,7 +12,7 @@
@ cdecl __stdio_common_vsnprintf_s(int64 ptr long long str ptr ptr) ucrtbase.__stdio_common_vsnprintf_s
@ cdecl __stdio_common_vsnwprintf_s(int64 ptr long long wstr ptr ptr) ucrtbase.__stdio_common_vsnwprintf_s
@ cdecl __stdio_common_vsprintf(int64 ptr long str ptr ptr) ucrtbase.__stdio_common_vsprintf
-@ stub __stdio_common_vsprintf_p
+@ cdecl __stdio_common_vsprintf_p(int64 ptr long str ptr ptr) ucrtbase.__stdio_common_vsprintf_p
@ cdecl __stdio_common_vsprintf_s(int64 ptr long str ptr ptr) ucrtbase.__stdio_common_vsprintf_s
@ cdecl __stdio_common_vsscanf(int64 ptr long str ptr ptr) ucrtbase.__stdio_common_vsscanf
@ cdecl __stdio_common_vswprintf(int64 ptr long wstr ptr ptr) ucrtbase.__stdio_common_vswprintf
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index cd87f211cb..4b1e6109cc 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -1447,11 +1447,8 @@ int CDECL MSVCRT_vswprintf_s_l(MSVCRT_wchar_t* str, MSVCRT_size_t numberOfElemen
format, locale, args );
}
-/*********************************************************************
- * _vsprintf_p_l (MSVCRT.@)
- */
-int CDECL MSVCRT_vsprintf_p_l(char *buffer, MSVCRT_size_t length, const char *format,
- MSVCRT__locale_t locale, __ms_va_list args)
+static int MSVCRT_vsprintf_p_l_opt(char *buffer, MSVCRT_size_t length, const char *format,
+ MSVCRT__locale_t locale, DWORD options, __ms_va_list args)
{
static const char nullbyte = '\0';
printf_arg args_ctx[MSVCRT__ARGMAX+1];
@@ -1466,24 +1463,44 @@ int CDECL MSVCRT_vsprintf_p_l(char *buffer, MSVCRT_size_t length, const char *fo
*MSVCRT__errno() = MSVCRT_EINVAL;
return ret;
} else if(ret == 0)
- ret = pf_printf_a(puts_clbk_str_a, &puts_ctx, format, locale, MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER,
- arg_clbk_valist, NULL, &args);
+ ret = pf_printf_a(puts_clbk_str_a, &puts_ctx, format, locale,
+ MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER | options, arg_clbk_valist, NULL, &args);
else
ret = pf_printf_a(puts_clbk_str_a, &puts_ctx, format, locale,
- MSVCRT_PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER,
+ MSVCRT_PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER | options,
arg_clbk_positional, args_ctx, NULL);
puts_clbk_str_a(&puts_ctx, 1, &nullbyte);
return ret;
}
+/*********************************************************************
+ * _vsprintf_p_l (MSVCRT.@)
+ */
+int CDECL MSVCRT_vsprintf_p_l(char *buffer, MSVCRT_size_t length, const char *format,
+ MSVCRT__locale_t locale, __ms_va_list args)
+{
+ return MSVCRT_vsprintf_p_l_opt(buffer, length, format, locale, 0, args);
+}
+
/*********************************************************************
* _vsprintf_p (MSVCRT.@)
*/
int CDECL MSVCRT_vsprintf_p(char *buffer, MSVCRT_size_t length,
const char *format, __ms_va_list args)
{
- return MSVCRT_vsprintf_p_l(buffer, length, format, NULL, args);
+ return MSVCRT_vsprintf_p_l_opt(buffer, length, format, NULL, 0, args);
+}
+
+/*********************************************************************
+ * __stdio_common_vsprintf_p (UCRTBASE.@)
+ */
+int CDECL MSVCRT__stdio_common_vsprintf_p(unsigned __int64 options, char *buffer, MSVCRT_size_t length,
+ const char *format, MSVCRT__locale_t locale, __ms_va_list args)
+{
+ if (options & ~UCRTBASE_PRINTF_MASK)
+ FIXME("options %s not handled\n", wine_dbgstr_longlong(options));
+ return MSVCRT_vsprintf_p_l_opt(buffer, length, format, locale, options & UCRTBASE_PRINTF_MASK, args);
}
/*********************************************************************
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index 2b0f6fa573..5495746827 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -157,7 +157,7 @@
@ cdecl __stdio_common_vsnprintf_s(int64 ptr long long str ptr ptr) MSVCRT__stdio_common_vsnprintf_s
@ cdecl __stdio_common_vsnwprintf_s(int64 ptr long long wstr ptr ptr) MSVCRT__stdio_common_vsnwprintf_s
@ cdecl __stdio_common_vsprintf(int64 ptr long str ptr ptr) MSVCRT__stdio_common_vsprintf
-@ stub __stdio_common_vsprintf_p
+@ cdecl __stdio_common_vsprintf_p(int64 ptr long str ptr ptr) MSVCRT__stdio_common_vsprintf_p
@ cdecl __stdio_common_vsprintf_s(int64 ptr long str ptr ptr) MSVCRT__stdio_common_vsprintf_s
@ cdecl __stdio_common_vsscanf(int64 ptr long str ptr ptr) MSVCRT__stdio_common_vsscanf
@ cdecl __stdio_common_vswprintf(int64 ptr long wstr ptr ptr) MSVCRT__stdio_common_vswprintf
--
2.14.2
More information about the wine-patches
mailing list