[v2 PATCH] msvcrt: Add vf[w]printf_p & vf[w]printf_p_l.
Gijs Vermeulen
gijsvrm at gmail.com
Fri Oct 13 13:23:29 CDT 2017
v2: Move support for MSVCRT_PRINTF_POSITIONAL_PARAMS to helper. (Thanks Piotr!)
Signed-off-by: Gijs Vermeulen <gijsvrm at gmail.com>
---
dlls/msvcr100/msvcr100.spec | 8 ++---
dlls/msvcr110/msvcr110.spec | 8 ++---
dlls/msvcr120/msvcr120.spec | 8 ++---
dlls/msvcr120_app/msvcr120_app.spec | 8 ++---
dlls/msvcr80/msvcr80.spec | 8 ++---
dlls/msvcr90/msvcr90.spec | 8 ++---
dlls/msvcrt/file.c | 68 +++++++++++++++++++++++++++++++++++--
dlls/msvcrt/msvcrt.h | 3 ++
dlls/msvcrt/msvcrt.spec | 8 ++---
dlls/msvcrt/printf.h | 2 +-
dlls/msvcrt/wcs.c | 2 +-
11 files changed, 99 insertions(+), 32 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index f963c3bb64..f015fa1aa0 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1434,12 +1434,12 @@
@ stub _vcwprintf_s
@ stub _vcwprintf_s_l
@ cdecl _vfprintf_l(ptr str ptr ptr) MSVCRT__vfprintf_l
-@ stub _vfprintf_p
-@ stub _vfprintf_p_l
+@ cdecl _vfprintf_p(ptr str ptr) MSVCRT__vfprintf_p
+@ cdecl _vfprintf_p_l(ptr str ptr ptr) MSVCRT__vfprintf_p_l
@ cdecl _vfprintf_s_l(ptr str ptr ptr) MSVCRT__vfprintf_s_l
@ cdecl _vfwprintf_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_l
-@ stub _vfwprintf_p
-@ stub _vfwprintf_p_l
+@ cdecl _vfwprintf_p(ptr wstr ptr) MSVCRT__vfwprintf_p
+@ cdecl _vfwprintf_p_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_p_l
@ cdecl _vfwprintf_s_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_s_l
@ stub _vprintf_l
@ stub _vprintf_p
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index 721886e96c..fbbef72d16 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1791,12 +1791,12 @@
@ stub _vcwprintf_s
@ stub _vcwprintf_s_l
@ cdecl _vfprintf_l(ptr str ptr ptr) MSVCRT__vfprintf_l
-@ stub _vfprintf_p
-@ stub _vfprintf_p_l
+@ cdecl _vfprintf_p(ptr str ptr) MSVCRT__vfprintf_p
+@ cdecl _vfprintf_p_l(ptr str ptr ptr) MSVCRT__vfprintf_p_l
@ cdecl _vfprintf_s_l(ptr str ptr ptr) MSVCRT__vfprintf_s_l
@ cdecl _vfwprintf_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_l
-@ stub _vfwprintf_p
-@ stub _vfwprintf_p_l
+@ cdecl _vfwprintf_p(ptr wstr ptr) MSVCRT__vfwprintf_p
+@ cdecl _vfwprintf_p_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_p_l
@ cdecl _vfwprintf_s_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_s_l
@ stub _vprintf_l
@ stub _vprintf_p
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index 24161447c2..cf9f42fb03 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -1809,12 +1809,12 @@
@ stub _vcwprintf_s
@ stub _vcwprintf_s_l
@ cdecl _vfprintf_l(ptr str ptr ptr) MSVCRT__vfprintf_l
-@ stub _vfprintf_p
-@ stub _vfprintf_p_l
+@ cdecl _vfprintf_p(ptr str ptr) MSVCRT__vfprintf_p
+@ cdecl _vfprintf_p_l(ptr str ptr ptr) MSVCRT__vfprintf_p_l
@ cdecl _vfprintf_s_l(ptr str ptr ptr) MSVCRT__vfprintf_s_l
@ cdecl _vfwprintf_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_l
-@ stub _vfwprintf_p
-@ stub _vfwprintf_p_l
+@ cdecl _vfwprintf_p(ptr wstr ptr) MSVCRT__vfwprintf_p
+@ cdecl _vfwprintf_p_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_p_l
@ cdecl _vfwprintf_s_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_s_l
@ stub _vprintf_l
@ stub _vprintf_p
diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec
index fc7f72ca14..08455dbed1 100644
--- a/dlls/msvcr120_app/msvcr120_app.spec
+++ b/dlls/msvcr120_app/msvcr120_app.spec
@@ -1503,12 +1503,12 @@
@ cdecl _utime64(str ptr) msvcr120._utime64
@ cdecl _vacopy(ptr ptr) msvcr120._vacopy
@ cdecl _vfprintf_l(ptr str ptr ptr) msvcr120._vfprintf_l
-@ stub _vfprintf_p
-@ stub _vfprintf_p_l
+@ cdecl _vfprintf_p(ptr str ptr) msvcr120._vfprintf_p
+@ cdecl _vfprintf_p_l(ptr str ptr ptr) msvcr120._vfprintf_p_l
@ cdecl _vfprintf_s_l(ptr str ptr ptr) msvcr120._vfprintf_s_l
@ cdecl _vfwprintf_l(ptr wstr ptr ptr) msvcr120._vfwprintf_l
-@ stub _vfwprintf_p
-@ stub _vfwprintf_p_l
+@ cdecl _vfwprintf_p(ptr wstr ptr) msvcr120._vfwprintf_p
+@ cdecl _vfwprintf_p_l(ptr wstr ptr ptr) msvcr120._vfwprintf_p_l
@ cdecl _vfwprintf_s_l(ptr wstr ptr ptr) msvcr120._vfwprintf_s_l
@ stub _vprintf_l
@ stub _vprintf_p
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 1f87e2a215..6737467940 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -1113,12 +1113,12 @@
@ stub _vcwprintf_s
@ stub _vcwprintf_s_l
@ cdecl _vfprintf_l(ptr str ptr ptr) MSVCRT__vfprintf_l
-@ stub _vfprintf_p
-@ stub _vfprintf_p_l
+@ cdecl _vfprintf_p(ptr str ptr) MSVCRT__vfprintf_p
+@ cdecl _vfprintf_p_l(ptr str ptr ptr) MSVCRT__vfprintf_p_l
@ cdecl _vfprintf_s_l(ptr str ptr ptr) MSVCRT__vfprintf_s_l
@ cdecl _vfwprintf_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_l
-@ stub _vfwprintf_p
-@ stub _vfwprintf_p_l
+@ cdecl _vfwprintf_p(ptr wstr ptr) MSVCRT__vfwprintf_p
+@ cdecl _vfwprintf_p_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_p_l
@ cdecl _vfwprintf_s_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_s_l
@ stub _vprintf_l
@ stub _vprintf_p
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index f63f979675..c6f4a0b01e 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -1089,12 +1089,12 @@
@ stub _vcwprintf_s
@ stub _vcwprintf_s_l
@ cdecl _vfprintf_l(ptr str ptr ptr) MSVCRT__vfprintf_l
-@ stub _vfprintf_p
-@ stub _vfprintf_p_l
+@ cdecl _vfprintf_p(ptr str ptr) MSVCRT__vfprintf_p
+@ cdecl _vfprintf_p_l(ptr str ptr ptr) MSVCRT__vfprintf_p_l
@ cdecl _vfprintf_s_l(ptr str ptr ptr) MSVCRT__vfprintf_s_l
@ cdecl _vfwprintf_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_l
-@ stub _vfwprintf_p
-@ stub _vfwprintf_p_l
+@ cdecl _vfwprintf_p(ptr wstr ptr) MSVCRT__vfwprintf_p
+@ cdecl _vfwprintf_p_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_p_l
@ cdecl _vfwprintf_s_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_s_l
@ stub _vprintf_l
@ stub _vprintf_p
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 0746cf2772..c4167ab356 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -5051,15 +5051,29 @@ static int puts_clbk_file_w(void *file, int len, const MSVCRT_wchar_t *str)
static int vfprintf_helper(DWORD options, MSVCRT_FILE* file, const char *format,
MSVCRT__locale_t locale, __ms_va_list valist)
{
+ printf_arg args_ctx[MSVCRT__ARGMAX+1];
BOOL tmp_buf;
int ret;
if(!MSVCRT_CHECK_PMT( file != NULL )) return -1;
if(!MSVCRT_CHECK_PMT( format != NULL )) return -1;
+ if(options & MSVCRT_PRINTF_POSITIONAL_PARAMS) {
+ memset(args_ctx, 0, sizeof(args_ctx));
+ ret = create_positional_ctx_a(args_ctx, format, valist);
+ if(ret < 0) {
+ MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0);
+ *MSVCRT__errno() = MSVCRT_EINVAL;
+ return ret;
+ } else if(!ret)
+ options &= ~MSVCRT_PRINTF_POSITIONAL_PARAMS;
+ }
+
MSVCRT__lock_file(file);
tmp_buf = add_std_buffer(file);
- ret = pf_printf_a(puts_clbk_file_a, file, format, locale, options, arg_clbk_valist, NULL, &valist);
+ ret = pf_printf_a(puts_clbk_file_a, file, format, locale, options,
+ options & MSVCRT_PRINTF_POSITIONAL_PARAMS ? arg_clbk_positional : arg_clbk_valist,
+ options & MSVCRT_PRINTF_POSITIONAL_PARAMS ? args_ctx : NULL, &valist);
if(tmp_buf) remove_std_buffer(file);
MSVCRT__unlock_file(file);
@@ -5069,15 +5083,29 @@ static int vfprintf_helper(DWORD options, MSVCRT_FILE* file, const char *format,
static int vfwprintf_helper(DWORD options, MSVCRT_FILE* file, const MSVCRT_wchar_t *format,
MSVCRT__locale_t locale, __ms_va_list valist)
{
+ printf_arg args_ctx[MSVCRT__ARGMAX+1];
BOOL tmp_buf;
int ret;
if(!MSVCRT_CHECK_PMT( file != NULL )) return -1;
if(!MSVCRT_CHECK_PMT( format != NULL )) return -1;
+ if(options & MSVCRT_PRINTF_POSITIONAL_PARAMS) {
+ memset(args_ctx, 0, sizeof(args_ctx));
+ ret = create_positional_ctx_w(args_ctx, format, valist);
+ if(ret < 0) {
+ MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0);
+ *MSVCRT__errno() = MSVCRT_EINVAL;
+ return ret;
+ } else if(!ret)
+ options &= ~MSVCRT_PRINTF_POSITIONAL_PARAMS;
+ }
+
MSVCRT__lock_file(file);
tmp_buf = add_std_buffer(file);
- ret = pf_printf_w(puts_clbk_file_w, file, format, locale, options, arg_clbk_valist, NULL, &valist);
+ ret = pf_printf_w(puts_clbk_file_w, file, format, locale, options,
+ options & MSVCRT_PRINTF_POSITIONAL_PARAMS ? arg_clbk_positional : arg_clbk_valist,
+ options & MSVCRT_PRINTF_POSITIONAL_PARAMS ? args_ctx : NULL, &valist);
if(tmp_buf) remove_std_buffer(file);
MSVCRT__unlock_file(file);
@@ -5202,6 +5230,42 @@ int CDECL MSVCRT__vfwprintf_l(MSVCRT_FILE* file, const MSVCRT_wchar_t *format,
return vfwprintf_helper(0, file, format, locale, valist);
}
+/*********************************************************************
+ * _vfprintf_p_l (MSVCRT.@)
+ */
+int CDECL MSVCRT__vfprintf_p_l(MSVCRT_FILE* file, const char *format,
+ MSVCRT__locale_t locale, __ms_va_list valist)
+{
+ return vfprintf_helper(MSVCRT_PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER,
+ file, format, locale, valist);
+}
+
+/*********************************************************************
+ * _vfprintf_p (MSVCRT.@)
+ */
+int CDECL MSVCRT__vfprintf_p(MSVCRT_FILE* file, const char *format, __ms_va_list valist)
+{
+ return MSVCRT__vfprintf_p_l(file, format, NULL, valist);
+}
+
+/*********************************************************************
+ * _vfwprintf_p_l (MSVCRT.@)
+ */
+int CDECL MSVCRT__vfwprintf_p_l(MSVCRT_FILE* file, const MSVCRT_wchar_t *format,
+ MSVCRT__locale_t locale, __ms_va_list valist)
+{
+ return vfwprintf_helper(MSVCRT_PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER,
+ file, format, locale, valist);
+}
+
+/*********************************************************************
+ * _vfwprintf_p (MSVCRT.@)
+ */
+int CDECL MSVCRT__vfwprintf_p(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, __ms_va_list valist)
+{
+ return MSVCRT__vfwprintf_p_l(file, format, NULL, valist);
+}
+
/*********************************************************************
* vprintf (MSVCRT.@)
*/
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index be0c1a264b..b1e5c4f394 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -1167,7 +1167,10 @@ int pf_printf_a(puts_clbk_a, void*, const char*, MSVCRT__locale_t,
DWORD, args_clbk, void*, __ms_va_list*) DECLSPEC_HIDDEN;
int pf_printf_w(puts_clbk_w, void*, const MSVCRT_wchar_t*, MSVCRT__locale_t,
DWORD, args_clbk, void*, __ms_va_list*) DECLSPEC_HIDDEN;
+int create_positional_ctx_a(void*, const char*, __ms_va_list) DECLSPEC_HIDDEN;
+int create_positional_ctx_w(void*, const MSVCRT_wchar_t*, __ms_va_list) DECLSPEC_HIDDEN;
printf_arg arg_clbk_valist(void*, int, int, __ms_va_list*) DECLSPEC_HIDDEN;
+printf_arg arg_clbk_positional(void*, int, int, __ms_va_list*) DECLSPEC_HIDDEN;
#define MSVCRT_FLT_MIN 1.175494351e-38F
#define MSVCRT_DBL_MIN 2.2250738585072014e-308
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index fcfa8fcca4..57d2a7889e 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1045,12 +1045,12 @@
# stub _vcwprintf_s(wstr ptr)
# stub _vcwprintf_s_l(wstr ptr ptr)
@ cdecl _vfprintf_l(ptr str ptr ptr) MSVCRT__vfprintf_l
-# stub _vfprintf_p(ptr str ptr)
-# stub _vfprintf_p_l(ptr str ptr ptr)
+@ cdecl _vfprintf_p(ptr str ptr) MSVCRT__vfprintf_p
+@ cdecl _vfprintf_p_l(ptr str ptr ptr) MSVCRT__vfprintf_p_l
@ cdecl _vfprintf_s_l(ptr str ptr ptr) MSVCRT__vfprintf_s_l
@ cdecl _vfwprintf_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_l
-# stub _vfwprintf_p(ptr wstr ptr)
-# stub _vfwprintf_p_l(ptr wstr ptr ptr)
+@ cdecl _vfwprintf_p(ptr wstr ptr) MSVCRT__vfwprintf_p
+@ cdecl _vfwprintf_p_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_p_l
@ cdecl _vfwprintf_s_l(ptr wstr ptr ptr) MSVCRT__vfwprintf_s_l
# stub _vprintf_l(str ptr ptr)
# stub _vprintf_p(str ptr)
diff --git a/dlls/msvcrt/printf.h b/dlls/msvcrt/printf.h
index fe1e127c76..4ba02bafdb 100644
--- a/dlls/msvcrt/printf.h
+++ b/dlls/msvcrt/printf.h
@@ -742,7 +742,7 @@ static printf_arg arg_clbk_type(void *ctx, int pos, int type, __ms_va_list *vali
}
#endif
-static int FUNC_NAME(create_positional_ctx)(void *args_ctx, const APICHAR *format, __ms_va_list valist)
+int FUNC_NAME(create_positional_ctx)(void *args_ctx, const APICHAR *format, __ms_va_list valist)
{
struct FUNC_NAME(_str_ctx) puts_ctx = {INT_MAX, NULL};
printf_arg *args = args_ctx;
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index cd87f211cb..eebd569adb 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -706,7 +706,7 @@ printf_arg arg_clbk_valist(void *ctx, int arg_pos, int type, __ms_va_list *valis
/*********************************************************************
* arg_clbk_positional (INTERNAL)
*/
-static printf_arg arg_clbk_positional(void *ctx, int pos, int type, __ms_va_list *valist)
+printf_arg arg_clbk_positional(void *ctx, int pos, int type, __ms_va_list *valist)
{
printf_arg *args = ctx;
return args[pos];
--
2.14.2.windows.1
More information about the wine-patches
mailing list