<div dir="ltr">There are some problems with this patch, please ignore it for now.<div>Sorry for the noise.</div></div><div class="gmail_extra"><br><div class="gmail_quote">2018-01-14 0:15 GMT+01:00 Gijs Vermeulen <span dir="ltr"><<a href="mailto:gijsvrm@gmail.com" target="_blank">gijsvrm@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Signed-off-by: Gijs Vermeulen <<a href="mailto:gijsvrm@gmail.com">gijsvrm@gmail.com</a>><br>
---<br>
 dlls/msvcrt/wcs.c | 436 +++++++++++++++++++++++-------<wbr>------------------------<br>
 1 file changed, 189 insertions(+), 247 deletions(-)<br>
<br>
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c<br>
index 098e0d5ba8..a6c586eb97 100644<br>
--- a/dlls/msvcrt/wcs.c<br>
+++ b/dlls/msvcrt/wcs.c<br>
@@ -720,22 +720,6 @@ printf_arg arg_clbk_positional(void *ctx, int pos, int type, __ms_va_list *valis<br>
     return args[pos];<br>
 }<br>
<br>
-/****************************<wbr>******************************<wbr>***********<br>
- *              _vsnprintf (MSVCRT.@)<br>
- */<br>
-int CDECL MSVCRT_vsnprintf( char *str, MSVCRT_size_t len,<br>
-                            const char *format, __ms_va_list valist )<br>
-{<br>
-    static const char nullbyte = '\0';<br>
-    struct _str_ctx_a ctx = {len, str};<br>
-    int ret;<br>
-<br>
-    ret = pf_printf_a(puts_clbk_str_a, &ctx, format, NULL, 0,<br>
-            arg_clbk_valist, NULL, &valist);<br>
-    puts_clbk_str_a(&ctx, 1, &nullbyte);<br>
-    return ret;<br>
-}<br>
-<br>
 #if _MSVCR_VER>=140<br>
<br>
 static int puts_clbk_str_c99_a(void *ctx, int len, const char *str)<br>
@@ -758,94 +742,69 @@ static int puts_clbk_str_c99_a(void *ctx, int len, const char *str)<br>
     return len;<br>
 }<br>
<br>
-/****************************<wbr>******************************<wbr>***********<br>
- *              __stdio_common_vsprintf (UCRTBASE.@)<br>
- */<br>
-int CDECL MSVCRT__stdio_common_vsprintf( unsigned __int64 options, char *str, MSVCRT_size_t len, const char *format,<br>
-                                         MSVCRT__locale_t locale, __ms_va_list valist )<br>
+static int puts_clbk_str_c99_w(void *ctx, int len, const MSVCRT_wchar_t *str)<br>
 {<br>
-    static const char nullbyte = '\0';<br>
-    struct _str_ctx_a ctx = {len, str};<br>
-    int ret;<br>
+    struct _str_ctx_w *out = ctx;<br>
<br>
-    if (options & ~UCRTBASE_PRINTF_MASK)<br>
-        FIXME("options %s not handled\n", wine_dbgstr_longlong(options))<wbr>;<br>
-    ret = pf_printf_a(puts_clbk_str_c99_<wbr>a,<br>
-            &ctx, format, locale, options & UCRTBASE_PRINTF_MASK, arg_clbk_valist, NULL, &valist);<br>
-    puts_clbk_str_a(&ctx, 1, &nullbyte);<br>
+    if(!out->buf)<br>
+        return len;<br>
<br>
-    if(!str)<br>
-        return ret;<br>
-    if(options & UCRTBASE_PRINTF_LEGACY_<wbr>VSPRINTF_NULL_TERMINATION)<br>
-        return ret>len ? -1 : ret;<br>
-    if(ret>=len) {<br>
-        if(len) str[len-1] = 0;<br>
-        return (options & UCRTBASE_PRINTF_STANDARD_<wbr>SNPRINTF_BEHAVIOUR) ? ret : -2;<br>
+    if(out->len < len) {<br>
+        memcpy(out->buf, str, out->len*sizeof(MSVCRT_wchar_<wbr>t));<br>
+        out->buf += out->len;<br>
+        out->len = 0;<br>
+        return len;<br>
     }<br>
-    return ret;<br>
-}<br>
-<br>
-#endif /* _MSVCR_VER>=140 */<br>
-<br>
-/****************************<wbr>******************************<wbr>***********<br>
- *             _vsnprintf_l (MSVCRT.@)<br>
- */<br>
-int CDECL MSVCRT_vsnprintf_l( char *str, MSVCRT_size_t len, const char *format,<br>
-                            MSVCRT__locale_t locale, __ms_va_list valist )<br>
-{<br>
-    static const char nullbyte = '\0';<br>
-    struct _str_ctx_a ctx = {len, str};<br>
-    int ret;<br>
<br>
-    ret = pf_printf_a(puts_clbk_str_a, &ctx, format, locale, 0,<br>
-            arg_clbk_valist, NULL, &valist);<br>
-    puts_clbk_str_a(&ctx, 1, &nullbyte);<br>
-    return ret;<br>
-}<br>
-<br>
-/****************************<wbr>******************************<wbr>***********<br>
- *             _vsprintf_l (MSVCRT.@)<br>
- */<br>
-int CDECL MSVCRT_vsprintf_l( char *str, const char *format,<br>
-                            MSVCRT__locale_t locale, __ms_va_list valist )<br>
-{<br>
-    return MSVCRT_vsnprintf_l(str, INT_MAX, format, locale, valist);<br>
+    memcpy(out->buf, str, len*sizeof(MSVCRT_wchar_t));<br>
+    out->buf += len;<br>
+    out->len -= len;<br>
+    return len;<br>
 }<br>
<br>
-/****************************<wbr>******************************<wbr>***********<br>
- *             _sprintf_l (MSVCRT.@)<br>
- */<br>
-int WINAPIV MSVCRT_sprintf_l(char *str, const char *format,<br>
-                           MSVCRT__locale_t locale, ...)<br>
-{<br>
-    int retval;<br>
-    __ms_va_list valist;<br>
-    __ms_va_start(valist, locale);<br>
-    retval = MSVCRT_vsnprintf_l(str, INT_MAX, format, locale, valist);<br>
-    __ms_va_end(valist);<br>
-    return retval;<br>
-}<br>
+#endif /* _MSVCR_VER>=140 */<br>
<br>
-static int CDECL MSVCRT_vsnprintf_s_l_opt( char *str, MSVCRT_size_t sizeOfBuffer,<br>
-        MSVCRT_size_t count, const char *format, DWORD options,<br>
-        MSVCRT__locale_t locale, __ms_va_list valist )<br>
+static int vsprintf_helper(DWORD options, char *str, MSVCRT_size_t sizeOfBuffer, MSVCRT_size_t count,<br>
+        const char *format, MSVCRT__locale_t locale, __ms_va_list valist)<br>
 {<br>
     static const char nullbyte = '\0';<br>
-    struct _str_ctx_a ctx;<br>
+    printf_arg args_ctx[MSVCRT__ARGMAX+1];<br>
+    struct _str_ctx_a puts_ctx;<br>
     int len, ret;<br>
+    BOOL postional, secure, c99, initially_positional;<br>
<br>
-    if(sizeOfBuffer<count+1 || count==-1)<br>
-        len = sizeOfBuffer;<br>
-    else<br>
-        len = count+1;<br>
+    len = sizeOfBuffer;<br>
+    postional = options & MSVCRT_PRINTF_POSITIONAL_<wbr>PARAMS;<br>
+    initially_positional = postional;<br>
+    secure = options & MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER;<br>
+    c99 = (options & UCRTBASE_PRINTF_MASK) && !secure;<br>
+<br>
+    if(secure && !postional)<br>
+        if(sizeOfBuffer>count+1 && count!=-1) len = count+1;<br>
+<br>
+    puts_ctx.len = len;<br>
+    puts_ctx.buf = str;<br>
+<br>
+    if(postional) {<br>
+        memset(args_ctx, 0, sizeof(args_ctx));<br>
+<br>
+        ret = create_positional_ctx_a(args_<wbr>ctx, format, valist);<br>
+        if(ret < 0) {<br>
+            MSVCRT__invalid_parameter(<wbr>NULL, NULL, NULL, 0, 0);<br>
+            *MSVCRT__errno() = MSVCRT_EINVAL;<br>
+            return ret;<br>
+        } else if(!ret)<br>
+            postional = FALSE;<br>
+    }<br>
<br>
-    ctx.len = len;<br>
-    ctx.buf = str;<br>
-    ret = pf_printf_a(puts_clbk_str_a, &ctx, format, locale, MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER | options,<br>
-            arg_clbk_valist, NULL, &valist);<br>
-    puts_clbk_str_a(&ctx, 1, &nullbyte);<br>
+    ret = pf_printf_a(c99 ? puts_clbk_str_c99_a : puts_clbk_str_a,<br>
+            &puts_ctx, format, locale, options,<br>
+            postional ? arg_clbk_positional : arg_clbk_valist,<br>
+            postional ? args_ctx : NULL,<br>
+            postional ? NULL : &valist);<br>
+    puts_clbk_str_a(&puts_ctx, 1, &nullbyte);<br>
<br>
-    if(ret<0 || ret==len) {<br>
+    if((secure && !initially_positional) && (ret<0 || ret==len)) {<br>
         if(count!=MSVCRT__TRUNCATE && count>sizeOfBuffer) {<br>
             MSVCRT_INVALID_PMT("str[<wbr>sizeOfBuffer] is too small", MSVCRT_ERANGE);<br>
             memset(str, 0, sizeOfBuffer);<br>
@@ -855,28 +814,61 @@ static int CDECL MSVCRT_vsnprintf_s_l_opt( char *str, MSVCRT_size_t sizeOfBuffer<br>
         return -1;<br>
     }<br>
<br>
+    if(c99){<br>
+        if(!str)<br>
+            return ret;<br>
+        if(options & UCRTBASE_PRINTF_LEGACY_<wbr>VSPRINTF_NULL_TERMINATION)<br>
+            return ret>len ? -1 : ret;<br>
+        if(ret>=len) {<br>
+            if(len) str[len-1] = 0;<br>
+            return (options & UCRTBASE_PRINTF_STANDARD_<wbr>SNPRINTF_BEHAVIOUR) ? ret : -2;<br>
+        }<br>
+    }<br>
+<br>
     return ret;<br>
 }<br>
<br>
-static int MSVCRT_vsnwprintf_s_l_opt( MSVCRT_wchar_t *str, MSVCRT_size_t sizeOfBuffer,<br>
-        MSVCRT_size_t count, const MSVCRT_wchar_t *format, DWORD options,<br>
-        MSVCRT__locale_t locale, __ms_va_list valist)<br>
+static int vswprintf_helper(DWORD options, MSVCRT_wchar_t *str, MSVCRT_size_t sizeOfBuffer, MSVCRT_size_t count,<br>
+        const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list valist)<br>
 {<br>
-    static const MSVCRT_wchar_t nullbyte = '\0';<br>
-    struct _str_ctx_w ctx;<br>
+    static const char nullbyte = '\0';<br>
+    printf_arg args_ctx[MSVCRT__ARGMAX+1];<br>
+    struct _str_ctx_w puts_ctx;<br>
     int len, ret;<br>
+    BOOL postional, secure, c99, initially_positional;<br>
<br>
     len = sizeOfBuffer;<br>
-    if(count!=-1 && len>count+1)<br>
-        len = count+1;<br>
+    postional = options & MSVCRT_PRINTF_POSITIONAL_<wbr>PARAMS;<br>
+    initially_positional = postional;<br>
+    secure = options & MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER;<br>
+    c99 = (options & UCRTBASE_PRINTF_MASK) && !secure;<br>
+<br>
+    if(secure && !postional)<br>
+        if(sizeOfBuffer>count+1 && count!=-1) len = count+1;<br>
+<br>
+    puts_ctx.len = len;<br>
+    puts_ctx.buf = str;<br>
+<br>
+    if(postional) {<br>
+        memset(args_ctx, 0, sizeof(args_ctx));<br>
+<br>
+        ret = create_positional_ctx_w(args_<wbr>ctx, format, valist);<br>
+        if(ret < 0) {<br>
+            MSVCRT__invalid_parameter(<wbr>NULL, NULL, NULL, 0, 0);<br>
+            *MSVCRT__errno() = MSVCRT_EINVAL;<br>
+            return ret;<br>
+        } else if(!ret)<br>
+            postional = FALSE;<br>
+    }<br>
<br>
-    ctx.len = len;<br>
-    ctx.buf = str;<br>
-    ret = pf_printf_w(puts_clbk_str_w, &ctx, format, locale, MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER | options,<br>
-            arg_clbk_valist, NULL, &valist);<br>
-    puts_clbk_str_w(&ctx, 1, &nullbyte);<br>
+    ret = pf_printf_w(c99 ? puts_clbk_str_c99_w : puts_clbk_str_w,<br>
+            &puts_ctx, format, locale, options,<br>
+            postional ? arg_clbk_positional : arg_clbk_valist,<br>
+            postional ? args_ctx : NULL,<br>
+            postional ? NULL : &valist);<br>
+    puts_clbk_str_w(&puts_ctx, 1, &nullbyte);<br>
<br>
-    if(ret<0 || ret==len) {<br>
+    if((secure && !initially_positional) && (ret<0 || ret==len)) {<br>
         if(count!=MSVCRT__TRUNCATE && count>sizeOfBuffer) {<br>
             MSVCRT_INVALID_PMT("str[<wbr>sizeOfBuffer] is too small", MSVCRT_ERANGE);<br>
             memset(str, 0, sizeOfBuffer*sizeof(MSVCRT_<wbr>wchar_t));<br>
@@ -886,9 +878,76 @@ static int MSVCRT_vsnwprintf_s_l_opt( MSVCRT_wchar_t *str, MSVCRT_size_t sizeOfB<br>
         return -1;<br>
     }<br>
<br>
+    if(c99){<br>
+        if(!str)<br>
+            return ret;<br>
+        if(options & UCRTBASE_PRINTF_LEGACY_<wbr>VSPRINTF_NULL_TERMINATION)<br>
+            return ret>len ? -1 : ret;<br>
+        if(ret>=len) {<br>
+            if(len) str[len-1] = 0;<br>
+            return (options & UCRTBASE_PRINTF_STANDARD_<wbr>SNPRINTF_BEHAVIOUR) ? ret : -2;<br>
+        }<br>
+    }<br>
+<br>
     return ret;<br>
 }<br>
<br>
+/****************************<wbr>******************************<wbr>***********<br>
+ *              _vsnprintf (MSVCRT.@)<br>
+ */<br>
+int CDECL MSVCRT_vsnprintf( char *str, MSVCRT_size_t len,<br>
+                            const char *format, __ms_va_list valist )<br>
+{<br>
+    return vsprintf_helper(0, str, len, 0, format, NULL, valist);<br>
+}<br>
+<br>
+#if _MSVCR_VER>=140<br>
+<br>
+/****************************<wbr>******************************<wbr>***********<br>
+ *              __stdio_common_vsprintf (UCRTBASE.@)<br>
+ */<br>
+int CDECL MSVCRT__stdio_common_vsprintf( unsigned __int64 options, char *str, MSVCRT_size_t len, const char *format,<br>
+                                         MSVCRT__locale_t locale, __ms_va_list valist )<br>
+{<br>
+    if (options & ~UCRTBASE_PRINTF_MASK)<br>
+        FIXME("options %s not handled\n", wine_dbgstr_longlong(options))<wbr>;<br>
+    return vsprintf_helper(options & UCRTBASE_PRINTF_MASK, str, len, 0, format, locale, valist);<br>
+}<br>
+<br>
+#endif /* _MSVCR_VER>=140 */<br>
+<br>
+/****************************<wbr>******************************<wbr>***********<br>
+ *             _vsnprintf_l (MSVCRT.@)<br>
+ */<br>
+int CDECL MSVCRT_vsnprintf_l( char *str, MSVCRT_size_t len, const char *format,<br>
+                            MSVCRT__locale_t locale, __ms_va_list valist )<br>
+{<br>
+    return vsprintf_helper(0, str, len, format, locale, valist);<br>
+}<br>
+<br>
+/****************************<wbr>******************************<wbr>***********<br>
+ *             _vsprintf_l (MSVCRT.@)<br>
+ */<br>
+int CDECL MSVCRT_vsprintf_l( char *str, const char *format,<br>
+                            MSVCRT__locale_t locale, __ms_va_list valist )<br>
+{<br>
+    return MSVCRT_vsnprintf_l(str, INT_MAX, format, locale, valist);<br>
+}<br>
+<br>
+/****************************<wbr>******************************<wbr>***********<br>
+ *             _sprintf_l (MSVCRT.@)<br>
+ */<br>
+int WINAPIV MSVCRT_sprintf_l(char *str, const char *format,<br>
+                           MSVCRT__locale_t locale, ...)<br>
+{<br>
+    int retval;<br>
+    __ms_va_list valist;<br>
+    __ms_va_start(valist, locale);<br>
+    retval = MSVCRT_vsnprintf_l(str, INT_MAX, format, locale, valist);<br>
+    __ms_va_end(valist);<br>
+    return retval;<br>
+}<br>
+<br>
 /*****************************<wbr>******************************<wbr>**********<br>
  *             _vsnprintf_s_l (MSVCRT.@)<br>
  */<br>
@@ -896,7 +955,8 @@ int CDECL MSVCRT_vsnprintf_s_l( char *str, MSVCRT_size_t sizeOfBuffer,<br>
         MSVCRT_size_t count, const char *format,<br>
         MSVCRT__locale_t locale, __ms_va_list valist )<br>
 {<br>
-    return MSVCRT_vsnprintf_s_l_opt(str, sizeOfBuffer, count, format, 0, locale, valist);<br>
+    return vsprintf_helper(MSVCRT_PRINTF_<wbr>INVOKE_INVALID_PARAM_HANDLER, str, sizeOfBuffer, count, format,<br>
+            locale, valist);<br>
 }<br>
<br>
 /*****************************<wbr>******************************<wbr>**********<br>
@@ -942,7 +1002,8 @@ int CDECL MSVCRT__stdio_common_<wbr>vsnprintf_s( unsigned __int64 options,<br>
 {<br>
     if (options & ~UCRTBASE_PRINTF_MASK)<br>
         FIXME("options %s not handled\n", wine_dbgstr_longlong(options))<wbr>;<br>
-    return MSVCRT_vsnprintf_s_l_opt(str, sizeOfBuffer, count, format, options & UCRTBASE_PRINTF_MASK, locale, valist);<br>
+    return vsprintf_helper((options & UCRTBASE_PRINTF_MASK) | MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER, str,<br>
+            sizeOfBuffer, count, format, locale, valist);<br>
 }<br>
<br>
 /*****************************<wbr>******************************<wbr>**********<br>
@@ -954,7 +1015,8 @@ int CDECL MSVCRT__stdio_common_<wbr>vsnwprintf_s( unsigned __int64 options,<br>
 {<br>
     if (options & ~UCRTBASE_PRINTF_MASK)<br>
         FIXME("options %s not handled\n", wine_dbgstr_longlong(options))<wbr>;<br>
-    return MSVCRT_vsnwprintf_s_l_opt(str, sizeOfBuffer, count, format, options & UCRTBASE_PRINTF_MASK, locale, valist);<br>
+    return vswprintf_helper((options & UCRTBASE_PRINTF_MASK) | MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER, str,<br>
+            sizeOfBuffer, count, format, locale, valist);<br>
 }<br>
<br>
 /*****************************<wbr>******************************<wbr>**********<br>
@@ -974,9 +1036,7 @@ int CDECL MSVCRT__stdio_common_vsprintf_<wbr>s( unsigned __int64 options,<br>
         char *str, MSVCRT_size_t count, const char *format,<br>
         MSVCRT__locale_t locale, __ms_va_list valist )<br>
 {<br>
-    if (options & ~UCRTBASE_PRINTF_MASK)<br>
-        FIXME("options %s not handled\n", wine_dbgstr_longlong(options))<wbr>;<br>
-    return MSVCRT_vsnprintf_s_l_opt(str, INT_MAX, count, format, options & UCRTBASE_PRINTF_MASK, locale, valist);<br>
+    return MSVCRT__stdio_common_<wbr>vsnprintf_s(options, str, INT_MAX, count, format, locale, valist);<br>
 }<br>
<br>
 #endif /* _MSVCR_VER>=140 */<br>
@@ -1011,28 +1071,8 @@ int CDECL MSVCRT__vscprintf( const char *format, __ms_va_list valist )<br>
 int CDECL MSVCRT__vscprintf_p_l(const char *format,<br>
         MSVCRT__locale_t locale, __ms_va_list args)<br>
 {<br>
-    printf_arg args_ctx[MSVCRT__ARGMAX+1];<br>
-    struct _str_ctx_a puts_ctx = {INT_MAX, NULL};<br>
-    int ret;<br>
-<br>
-    memset(args_ctx, 0, sizeof(args_ctx));<br>
-<br>
-    ret = create_positional_ctx_a(args_<wbr>ctx, format, args);<br>
-    if(ret < 0)  {<br>
-        MSVCRT__invalid_parameter(<wbr>NULL, NULL, NULL, 0, 0);<br>
-        *MSVCRT__errno() = MSVCRT_EINVAL;<br>
-        return ret;<br>
-    } else if(ret == 0) {<br>
-        ret = pf_printf_a(puts_clbk_str_a, &puts_ctx, format, locale,<br>
-                MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER,<br>
-                arg_clbk_valist, NULL, &args);<br>
-    } else {<br>
-        ret = pf_printf_a(puts_clbk_str_a, &puts_ctx, format, locale,<br>
-                MSVCRT_PRINTF_POSITIONAL_<wbr>PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER,<br>
-                arg_clbk_positional, args_ctx, NULL);<br>
-    }<br>
-<br>
-    return ret;<br>
+    return vsprintf_helper(MSVCRT_PRINTF_<wbr>POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER,<br>
+            NULL, INT_MAX, 0, format, locale, args);<br>
 }<br>
<br>
 /*****************************<wbr>******************************<wbr>**********<br>
@@ -1103,14 +1143,7 @@ int WINAPIV MSVCRT__scprintf(const char *format, ...)<br>
 int CDECL MSVCRT_vsnwprintf(MSVCRT_<wbr>wchar_t *str, MSVCRT_size_t len,<br>
         const MSVCRT_wchar_t *format, __ms_va_list valist)<br>
 {<br>
-    static const MSVCRT_wchar_t nullbyte = '\0';<br>
-    struct _str_ctx_w ctx = {len, str};<br>
-    int ret;<br>
-<br>
-    ret = pf_printf_w(puts_clbk_str_w, &ctx, format, NULL, 0,<br>
-            arg_clbk_valist, NULL, &valist);<br>
-    puts_clbk_str_w(&ctx, 1, &nullbyte);<br>
-    return ret;<br>
+    return vswprintf_helper(0, str, len, 0, format, NULL, valist);<br>
 }<br>
<br>
 /*****************************<wbr>******************************<wbr>**********<br>
@@ -1120,41 +1153,7 @@ int CDECL MSVCRT_vsnwprintf_l(MSVCRT_<wbr>wchar_t *str, MSVCRT_size_t len,<br>
         const MSVCRT_wchar_t *format, MSVCRT__locale_t locale,<br>
         __ms_va_list valist)<br>
 {<br>
-    static const MSVCRT_wchar_t nullbyte = '\0';<br>
-    struct _str_ctx_w ctx = {len, str};<br>
-    int ret;<br>
-<br>
-    ret = pf_printf_w(puts_clbk_str_w, &ctx, format, locale, 0,<br>
-            arg_clbk_valist, NULL, &valist);<br>
-    puts_clbk_str_w(&ctx, 1, &nullbyte);<br>
-    return ret;<br>
-}<br>
-<br>
-static int MSVCRT_vswprintf_p_l_opt(<wbr>MSVCRT_wchar_t *buffer, MSVCRT_size_t length,<br>
-        const MSVCRT_wchar_t *format, DWORD options, MSVCRT__locale_t locale, __ms_va_list args)<br>
-{<br>
-    static const MSVCRT_wchar_t nullbyte = '\0';<br>
-    printf_arg args_ctx[MSVCRT__ARGMAX+1];<br>
-    struct _str_ctx_w puts_ctx = {length, buffer};<br>
-    int ret;<br>
-<br>
-    memset(args_ctx, 0, sizeof(args_ctx));<br>
-<br>
-    ret = create_positional_ctx_w(args_<wbr>ctx, format, args);<br>
-    if(ret < 0)  {<br>
-        MSVCRT__invalid_parameter(<wbr>NULL, NULL, NULL, 0, 0);<br>
-        *MSVCRT__errno() = MSVCRT_EINVAL;<br>
-        return ret;<br>
-    } else if(ret == 0)<br>
-        ret = pf_printf_w(puts_clbk_str_w, &puts_ctx, format, locale, MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER | options,<br>
-                arg_clbk_valist, NULL, &args);<br>
-    else<br>
-        ret = pf_printf_w(puts_clbk_str_w, &puts_ctx, format, locale,<br>
-                MSVCRT_PRINTF_POSITIONAL_<wbr>PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER | options,<br>
-                arg_clbk_positional, args_ctx, NULL);<br>
-<br>
-    puts_clbk_str_w(&puts_ctx, 1, &nullbyte);<br>
-    return ret;<br>
+    return vswprintf_helper(0, str, len, 0, format, locale, valist);<br>
 }<br>
<br>
 /*****************************<wbr>******************************<wbr>**********<br>
@@ -1163,7 +1162,8 @@ static int MSVCRT_vswprintf_p_l_opt(<wbr>MSVCRT_wchar_t *buffer, MSVCRT_size_t length<br>
 int CDECL MSVCRT_vswprintf_p_l(MSVCRT_<wbr>wchar_t *buffer, MSVCRT_size_t length,<br>
         const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list args)<br>
 {<br>
-    return MSVCRT_vswprintf_p_l_opt(<wbr>buffer, length, format, 0, locale, args);<br>
+    return vswprintf_helper(MSVCRT_<wbr>PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER,<br>
+            buffer, length, 0, format, locale, args);<br>
 }<br>
<br>
 #if _MSVCR_VER>=80<br>
@@ -1173,7 +1173,7 @@ int CDECL MSVCRT_vswprintf_p_l(MSVCRT_<wbr>wchar_t *buffer, MSVCRT_size_t length,<br>
 int CDECL MSVCRT__vswprintf_p(MSVCRT_<wbr>wchar_t *buffer, MSVCRT_size_t length,<br>
         const MSVCRT_wchar_t *format, __ms_va_list args)<br>
 {<br>
-    return MSVCRT_vswprintf_p_l_opt(<wbr>buffer, length, format, 0, NULL, args);<br>
+    return MSVCRT_vswprintf_p_l(buffer, length, format, NULL, args);<br>
 }<br>
 #endif<br>
<br>
@@ -1187,7 +1187,8 @@ int CDECL MSVCRT__stdio_common_<wbr>vswprintf_p( unsigned __int64 options,<br>
 {<br>
     if (options & ~UCRTBASE_PRINTF_MASK)<br>
         FIXME("options %s not handled\n", wine_dbgstr_longlong(options))<wbr>;<br>
-    return MSVCRT_vswprintf_p_l_opt(str, count, format, options & UCRTBASE_PRINTF_MASK, locale, valist);<br>
+    return vswprintf_helper((options & UCRTBASE_PRINTF_MASK) | (MSVCRT_PRINTF_POSITIONAL_<wbr>PARAMS |<br>
+            MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER), str, count, 0, format, locale, valist);<br>
 }<br>
 #endif<br>
<br>
@@ -1198,7 +1199,8 @@ int CDECL MSVCRT_vsnwprintf_s_l( MSVCRT_wchar_t *str, MSVCRT_size_t sizeOfBuffer<br>
         MSVCRT_size_t count, const MSVCRT_wchar_t *format,<br>
         MSVCRT__locale_t locale, __ms_va_list valist)<br>
 {<br>
-    return MSVCRT_vsnwprintf_s_l_opt(str, sizeOfBuffer, count, format, 0, locale, valist);<br>
+    return vswprintf_helper(MSVCRT_<wbr>PRINTF_INVOKE_INVALID_PARAM_<wbr>HANDLER, str, sizeOfBuffer, count, format,<br>
+            locale, valist);<br>
 }<br>
<br>
 /*****************************<wbr>******************************<wbr>**********<br>
@@ -1268,26 +1270,6 @@ int WINAPIV MSVCRT__snwprintf_s_l( MSVCRT_wchar_t *str, unsigned int len, unsign<br>
<br>
 #if _MSVCR_VER>=140<br>
<br>
-static int puts_clbk_str_c99_w(void *ctx, int len, const MSVCRT_wchar_t *str)<br>
-{<br>
-    struct _str_ctx_w *out = ctx;<br>
-<br>
-    if(!out->buf)<br>
-        return len;<br>
-<br>
-    if(out->len < len) {<br>
-        memcpy(out->buf, str, out->len*sizeof(MSVCRT_wchar_<wbr>t));<br>
-        out->buf += out->len;<br>
-        out->len = 0;<br>
-        return len;<br>
-    }<br>
-<br>
-    memcpy(out->buf, str, len*sizeof(MSVCRT_wchar_t));<br>
-    out->buf += len;<br>
-    out->len -= len;<br>
-    return len;<br>
-}<br>
-<br>
 /*****************************<wbr>******************************<wbr>**********<br>
  *              __stdio_common_vswprintf (UCRTBASE.@)<br>
  */<br>
@@ -1295,25 +1277,9 @@ int CDECL MSVCRT__stdio_common_<wbr>vswprintf( unsigned __int64 options,<br>
         MSVCRT_wchar_t *str, MSVCRT_size_t len, const MSVCRT_wchar_t *format,<br>
         MSVCRT__locale_t locale, __ms_va_list valist )<br>
 {<br>
-    static const MSVCRT_wchar_t nullbyte = '\0';<br>
-    struct _str_ctx_w ctx = {len, str};<br>
-    int ret;<br>
-<br>
     if (options & ~UCRTBASE_PRINTF_MASK)<br>
         FIXME("options %s not handled\n", wine_dbgstr_longlong(options))<wbr>;<br>
-    ret = pf_printf_w(puts_clbk_str_c99_<wbr>w,<br>
-            &ctx, format, locale, options & UCRTBASE_PRINTF_MASK, arg_clbk_valist, NULL, &valist);<br>
-    puts_clbk_str_w(&ctx, 1, &nullbyte);<br>
-<br>
-    if(!str)<br>
-        return ret;<br>
-    if(options & UCRTBASE_PRINTF_LEGACY_<wbr>VSPRINTF_NULL_TERMINATION)<br>
-        return ret>len ? -1 : ret;<br>
-    if(ret>=len) {<br>
-        if(len) str[len-1] = 0;<br>
-        return (options & UCRTBASE_PRINTF_STANDARD_<wbr>SNPRINTF_BEHAVIOUR) ? ret : -2;<br>
-    }<br>
-    return ret;<br>
+    return vswprintf_helper(options & UCRTBASE_PRINTF_MASK, str, len, 0, format, locale, valist);<br>
 }<br>
<br>
 #endif /* _MSVCR_VER>=140 */<br>
@@ -1444,7 +1410,8 @@ int CDECL MSVCRT__vscwprintf_l( const MSVCRT_wchar_t *format, MSVCRT__locale_t l<br>
  */<br>
 int CDECL MSVCRT__vscwprintf_p_l( const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list args )<br>
 {<br>
-    return MSVCRT_vswprintf_p_l_opt( NULL, INT_MAX, format, 0, locale, args );<br>
+    return vswprintf_helper(MSVCRT_<wbr>PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER, NULL, INT_MAX,<br>
+            0, format, locale, args);<br>
 }<br>
<br>
 #if _MSVCR_VER>=80<br>
@@ -1453,7 +1420,7 @@ int CDECL MSVCRT__vscwprintf_p_l( const MSVCRT_wchar_t *format, MSVCRT__locale_t<br>
  */<br>
 int CDECL MSVCRT__vscwprintf_p(const MSVCRT_wchar_t *format, __ms_va_list args)<br>
 {<br>
-    return MSVCRT_vswprintf_p_l_opt(NULL, INT_MAX, format, 0, NULL, args);<br>
+    return MSVCRT__vscwprintf_p_l(NULL, INT_MAX, format, 0, NULL, args);<br>
 }<br>
 #endif<br>
<br>
@@ -1476,40 +1443,14 @@ int CDECL MSVCRT_vswprintf_s_l(MSVCRT_<wbr>wchar_t* str, MSVCRT_size_t numberOfElemen<br>
             format, locale, args );<br>
 }<br>
<br>
-static int MSVCRT_vsprintf_p_l_opt(char *buffer, MSVCRT_size_t length, const char *format,<br>
-        DWORD options, MSVCRT__locale_t locale, __ms_va_list args)<br>
-{<br>
-    static const char nullbyte = '\0';<br>
-    printf_arg args_ctx[MSVCRT__ARGMAX+1];<br>
-    struct _str_ctx_a puts_ctx = {length, buffer};<br>
-    int ret;<br>
-<br>
-    memset(args_ctx, 0, sizeof(args_ctx));<br>
-<br>
-    ret = create_positional_ctx_a(args_<wbr>ctx, format, args);<br>
-    if(ret < 0) {<br>
-        MSVCRT__invalid_parameter(<wbr>NULL, NULL, NULL, 0, 0);<br>
-        *MSVCRT__errno() = MSVCRT_EINVAL;<br>
-        return ret;<br>
-    } else if(ret == 0)<br>
-        ret = pf_printf_a(puts_clbk_str_a, &puts_ctx, format, locale,<br>
-                MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER | options, arg_clbk_valist, NULL, &args);<br>
-    else<br>
-        ret = pf_printf_a(puts_clbk_str_a, &puts_ctx, format, locale,<br>
-                MSVCRT_PRINTF_POSITIONAL_<wbr>PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER | options,<br>
-                arg_clbk_positional, args_ctx, NULL);<br>
-<br>
-    puts_clbk_str_a(&puts_ctx, 1, &nullbyte);<br>
-    return ret;<br>
-}<br>
-<br>
 /*****************************<wbr>******************************<wbr>**********<br>
  *              _vsprintf_p_l (MSVCRT.@)<br>
  */<br>
 int CDECL MSVCRT_vsprintf_p_l(char *buffer, MSVCRT_size_t length, const char *format,<br>
         MSVCRT__locale_t locale, __ms_va_list args)<br>
 {<br>
-    return MSVCRT_vsprintf_p_l_opt(<wbr>buffer, length, format, 0, locale, args);<br>
+    return vsprintf_helper(MSVCRT_PRINTF_<wbr>POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER, buffer, length,<br>
+        0, format, locale, args);<br>
 }<br>
<br>
 /*****************************<wbr>******************************<wbr>**********<br>
@@ -1530,7 +1471,8 @@ int CDECL MSVCRT__stdio_common_vsprintf_<wbr>p(unsigned __int64 options, char *buffer<br>
 {<br>
     if (options & ~UCRTBASE_PRINTF_MASK)<br>
         FIXME("options %s not handled\n", wine_dbgstr_longlong(options))<wbr>;<br>
-    return MSVCRT_vsprintf_p_l_opt(<wbr>buffer, length, format, options & UCRTBASE_PRINTF_MASK, locale, args);<br>
+    return vsprintf_helper((options & UCRTBASE_PRINTF_MASK) | (MSVCRT_PRINTF_POSITIONAL_<wbr>PARAMS |<br>
+            MSVCRT_PRINTF_INVOKE_INVALID_<wbr>PARAM_HANDLER), buffer, length, 0, format, locale, args);<br>
 }<br>
 #endif<br>
<br>
@@ -1591,7 +1533,7 @@ int WINAPIV MSVCRT_swprintf_p_l(MSVCRT_<wbr>wchar_t *buffer, MSVCRT_size_t length,<br>
     int r;<br>
<br>
     __ms_va_start(valist, locale);<br>
-    r = MSVCRT_vswprintf_p_l_opt(<wbr>buffer, length, format, 0, locale, valist);<br>
+    r = MSVCRT_vswprintf_p_l(buffer, length, format, locale, valist);<br>
     __ms_va_end(valist);<br>
<br>
     return r;<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.15.1<br>
<br>
</font></span></blockquote></div><br></div>