[PATCH] msvcrt: Add vf[w]printf_p & vf[w]printf_p_l.

Gijs Vermeulen gijsvrm at gmail.com
Thu Oct 12 07:50:04 CDT 2017


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                  | 104 +++++++++++++++++++++++++++++-------
 dlls/msvcrt/msvcrt.h                |   3 ++
 dlls/msvcrt/msvcrt.spec             |   8 +--
 dlls/msvcrt/printf.h                |   2 +-
 dlls/msvcrt/wcs.c                   |   2 +-
 11 files changed, 117 insertions(+), 50 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index f963c3b..f015fa1 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 721886e..fbbef72 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 2416144..cf9f42f 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 fc7f72c..08455db 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 1f87e2a..6737467 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 f63f979..c6f4a0b 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 0746cf2..4fe3b11 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -5049,7 +5049,7 @@ 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)
+        MSVCRT__locale_t locale, __ms_va_list valist, args_clbk type, void *args_ctx)
 {
     BOOL tmp_buf;
     int ret;
@@ -5059,7 +5059,7 @@ static int vfprintf_helper(DWORD options, MSVCRT_FILE* file, const char *format,
 
     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, type, args_ctx, &valist);
     if(tmp_buf) remove_std_buffer(file);
     MSVCRT__unlock_file(file);
 
@@ -5067,7 +5067,7 @@ 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)
+        MSVCRT__locale_t locale, __ms_va_list valist, args_clbk type, void *args_ctx)
 {
     BOOL tmp_buf;
     int ret;
@@ -5077,7 +5077,7 @@ static int vfwprintf_helper(DWORD options, MSVCRT_FILE* file, const MSVCRT_wchar
 
     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, type, args_ctx, &valist);
     if(tmp_buf) remove_std_buffer(file);
     MSVCRT__unlock_file(file);
 
@@ -5085,12 +5085,31 @@ static int vfwprintf_helper(DWORD options, MSVCRT_FILE* file, const MSVCRT_wchar
 }
 
 /*********************************************************************
+ *    _vfprintf_l (MSVCRT.@)
+ */
+int CDECL MSVCRT__vfprintf_l(MSVCRT_FILE* file, const char *format,
+        MSVCRT__locale_t locale, __ms_va_list valist)
+{
+    return vfprintf_helper(0, file, format, locale, valist, arg_clbk_valist, NULL);
+}
+
+/*********************************************************************
+ *    _vfwprintf_l (MSVCRT.@)
+ */
+int CDECL MSVCRT__vfwprintf_l(MSVCRT_FILE* file, const MSVCRT_wchar_t *format,
+        MSVCRT__locale_t locale, __ms_va_list valist)
+{
+    return vfwprintf_helper(0, file, format, locale, valist, arg_clbk_valist, NULL);
+}
+
+/*********************************************************************
  *    _vfprintf_s_l (MSVCRT.@)
  */
 int CDECL MSVCRT__vfprintf_s_l(MSVCRT_FILE* file, const char *format,
         MSVCRT__locale_t locale, __ms_va_list valist)
 {
-    return vfprintf_helper(MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, file, format, locale, valist);
+    return vfprintf_helper(MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, file, format, locale, valist,
+            arg_clbk_valist, NULL);
 }
 
 /*********************************************************************
@@ -5099,7 +5118,8 @@ int CDECL MSVCRT__vfprintf_s_l(MSVCRT_FILE* file, const char *format,
 int CDECL MSVCRT__vfwprintf_s_l(MSVCRT_FILE* file, const MSVCRT_wchar_t *format,
         MSVCRT__locale_t locale, __ms_va_list valist)
 {
-    return vfwprintf_helper(MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, file, format, locale, valist);
+    return vfwprintf_helper(MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, file, format, locale, valist,
+            arg_clbk_valist, NULL);
 }
 
 /*********************************************************************
@@ -5107,7 +5127,7 @@ int CDECL MSVCRT__vfwprintf_s_l(MSVCRT_FILE* file, const MSVCRT_wchar_t *format,
  */
 int CDECL MSVCRT_vfprintf(MSVCRT_FILE* file, const char *format, __ms_va_list valist)
 {
-    return vfprintf_helper(0, file, format, NULL, valist);
+    return MSVCRT__vfprintf_l(file, format, NULL, valist);
 }
 
 /*********************************************************************
@@ -5123,7 +5143,7 @@ int CDECL MSVCRT_vfprintf_s(MSVCRT_FILE* file, const char *format, __ms_va_list
  */
 int CDECL MSVCRT_vfwprintf(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, __ms_va_list valist)
 {
-    return vfwprintf_helper(0, file, format, NULL, valist);
+    return MSVCRT__vfwprintf_l(file, format, NULL, valist);
 }
 
 /*********************************************************************
@@ -5143,7 +5163,7 @@ int CDECL MSVCRT__stdio_common_vfprintf(unsigned __int64 options, MSVCRT_FILE *f
     if (options & ~UCRTBASE_PRINTF_MASK)
         FIXME("options %s not handled\n", wine_dbgstr_longlong(options));
 
-    return vfprintf_helper(options & UCRTBASE_PRINTF_MASK, file, format, locale, valist);
+    return vfprintf_helper(options & UCRTBASE_PRINTF_MASK, file, format, locale, valist, arg_clbk_valist, NULL);
 }
 
 /*********************************************************************
@@ -5156,7 +5176,7 @@ int CDECL MSVCRT__stdio_common_vfprintf_s(unsigned __int64 options, MSVCRT_FILE
         FIXME("options %s not handled\n", wine_dbgstr_longlong(options));
 
     return vfprintf_helper((options & UCRTBASE_PRINTF_MASK) | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER,
-            file, format, locale, valist);
+            file, format, locale, valist, arg_clbk_valist, NULL);
 }
 
 /*********************************************************************
@@ -5168,7 +5188,7 @@ int CDECL MSVCRT__stdio_common_vfwprintf(unsigned __int64 options, MSVCRT_FILE *
     if (options & ~UCRTBASE_PRINTF_MASK)
         FIXME("options %s not handled\n", wine_dbgstr_longlong(options));
 
-    return vfwprintf_helper(options & UCRTBASE_PRINTF_MASK, file, format, locale, valist);
+    return vfwprintf_helper(options & UCRTBASE_PRINTF_MASK, file, format, locale, valist, arg_clbk_valist, NULL);
 }
 
 /*********************************************************************
@@ -5181,25 +5201,69 @@ int CDECL MSVCRT__stdio_common_vfwprintf_s(unsigned __int64 options, MSVCRT_FILE
         FIXME("options %s not handled\n", wine_dbgstr_longlong(options));
 
     return vfwprintf_helper((options & UCRTBASE_PRINTF_MASK) | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER,
-            file, format, locale, valist);
+            file, format, locale, valist, arg_clbk_valist, NULL);
 }
 
 /*********************************************************************
- *    _vfprintf_l (MSVCRT.@)
+ *    _vfprintf_p_l (MSVCRT.@)
  */
-int CDECL MSVCRT__vfprintf_l(MSVCRT_FILE* file, const char *format,
-        MSVCRT__locale_t locale, __ms_va_list valist)
+int CDECL MSVCRT__vfprintf_p_l(MSVCRT_FILE* file, const char *format, MSVCRT__locale_t locale, __ms_va_list valist)
+{
+    int ret;
+    printf_arg args_ctx[MSVCRT__ARGMAX+1];
+
+    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 == 0)
+        ret = MSVCRT__vfprintf_s_l(file, format, locale, valist);
+    else
+        ret = vfprintf_helper(MSVCRT_PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER,
+                file, format, locale, valist, arg_clbk_positional, args_ctx);
+
+    return ret;
+}
+
+/*********************************************************************
+ *    _vfprintf_p (MSVCRT.@)
+ */
+int CDECL MSVCRT__vfprintf_p(MSVCRT_FILE* file, const char *format, __ms_va_list valist)
 {
-    return vfprintf_helper(0, file, format, locale, valist);
+    return MSVCRT__vfprintf_p_l(file, format, NULL, valist);
 }
 
 /*********************************************************************
- *              _vfwprintf_l (MSVCRT.@)
+ *    _vfwprintf_p_l (MSVCRT.@)
  */
-int CDECL MSVCRT__vfwprintf_l(MSVCRT_FILE* file, const MSVCRT_wchar_t *format,
-        MSVCRT__locale_t locale, __ms_va_list valist)
+int CDECL MSVCRT__vfwprintf_p_l(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list valist)
+{
+    int ret;
+    printf_arg args_ctx[MSVCRT__ARGMAX+1];
+
+    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 == 0)
+        ret = MSVCRT__vfwprintf_s_l(file, format, locale, valist);
+    else
+        ret = vfwprintf_helper(MSVCRT_PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER,
+                file, format, locale, valist, arg_clbk_positional, args_ctx);
+
+    return ret;
+}
+
+/*********************************************************************
+ *    _vfwprintf_p (MSVCRT.@)
+ */
+int CDECL MSVCRT__vfwprintf_p(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, __ms_va_list valist)
 {
-    return vfwprintf_helper(0, file, format, locale, valist);
+    return MSVCRT__vfwprintf_p_l(file, format, NULL, valist);
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index be0c1a2..b1e5c4f 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 fcfa8fc..57d2a78 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 fe1e127..4ba02ba 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 cd87f21..eebd569 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.7.4




More information about the wine-patches mailing list