Signed-off-by: Gijs Vermeulen gijsvrm@gmail.com --- dlls/msvcrt/wcs.c | 436 +++++++++++++++++++++++------------------------------- 1 file changed, 189 insertions(+), 247 deletions(-)
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c index 098e0d5ba8..a6c586eb97 100644 --- a/dlls/msvcrt/wcs.c +++ b/dlls/msvcrt/wcs.c @@ -720,22 +720,6 @@ printf_arg arg_clbk_positional(void *ctx, int pos, int type, __ms_va_list *valis return args[pos]; }
-/********************************************************************* - * _vsnprintf (MSVCRT.@) - */ -int CDECL MSVCRT_vsnprintf( char *str, MSVCRT_size_t len, - const char *format, __ms_va_list valist ) -{ - static const char nullbyte = '\0'; - struct _str_ctx_a ctx = {len, str}; - int ret; - - ret = pf_printf_a(puts_clbk_str_a, &ctx, format, NULL, 0, - arg_clbk_valist, NULL, &valist); - puts_clbk_str_a(&ctx, 1, &nullbyte); - return ret; -} - #if _MSVCR_VER>=140
static int puts_clbk_str_c99_a(void *ctx, int len, const char *str) @@ -758,94 +742,69 @@ static int puts_clbk_str_c99_a(void *ctx, int len, const char *str) return len; }
-/********************************************************************* - * __stdio_common_vsprintf (UCRTBASE.@) - */ -int CDECL MSVCRT__stdio_common_vsprintf( unsigned __int64 options, char *str, MSVCRT_size_t len, const char *format, - MSVCRT__locale_t locale, __ms_va_list valist ) +static int puts_clbk_str_c99_w(void *ctx, int len, const MSVCRT_wchar_t *str) { - static const char nullbyte = '\0'; - struct _str_ctx_a ctx = {len, str}; - int ret; + struct _str_ctx_w *out = ctx;
- if (options & ~UCRTBASE_PRINTF_MASK) - FIXME("options %s not handled\n", wine_dbgstr_longlong(options)); - ret = pf_printf_a(puts_clbk_str_c99_a, - &ctx, format, locale, options & UCRTBASE_PRINTF_MASK, arg_clbk_valist, NULL, &valist); - puts_clbk_str_a(&ctx, 1, &nullbyte); + if(!out->buf) + return len;
- if(!str) - return ret; - if(options & UCRTBASE_PRINTF_LEGACY_VSPRINTF_NULL_TERMINATION) - return ret>len ? -1 : ret; - if(ret>=len) { - if(len) str[len-1] = 0; - return (options & UCRTBASE_PRINTF_STANDARD_SNPRINTF_BEHAVIOUR) ? ret : -2; + if(out->len < len) { + memcpy(out->buf, str, out->len*sizeof(MSVCRT_wchar_t)); + out->buf += out->len; + out->len = 0; + return len; } - return ret; -} - -#endif /* _MSVCR_VER>=140 */ - -/********************************************************************* - * _vsnprintf_l (MSVCRT.@) - */ -int CDECL MSVCRT_vsnprintf_l( char *str, MSVCRT_size_t len, const char *format, - MSVCRT__locale_t locale, __ms_va_list valist ) -{ - static const char nullbyte = '\0'; - struct _str_ctx_a ctx = {len, str}; - int ret;
- ret = pf_printf_a(puts_clbk_str_a, &ctx, format, locale, 0, - arg_clbk_valist, NULL, &valist); - puts_clbk_str_a(&ctx, 1, &nullbyte); - return ret; -} - -/********************************************************************* - * _vsprintf_l (MSVCRT.@) - */ -int CDECL MSVCRT_vsprintf_l( char *str, const char *format, - MSVCRT__locale_t locale, __ms_va_list valist ) -{ - return MSVCRT_vsnprintf_l(str, INT_MAX, format, locale, valist); + memcpy(out->buf, str, len*sizeof(MSVCRT_wchar_t)); + out->buf += len; + out->len -= len; + return len; }
-/********************************************************************* - * _sprintf_l (MSVCRT.@) - */ -int WINAPIV MSVCRT_sprintf_l(char *str, const char *format, - MSVCRT__locale_t locale, ...) -{ - int retval; - __ms_va_list valist; - __ms_va_start(valist, locale); - retval = MSVCRT_vsnprintf_l(str, INT_MAX, format, locale, valist); - __ms_va_end(valist); - return retval; -} +#endif /* _MSVCR_VER>=140 */
-static int CDECL MSVCRT_vsnprintf_s_l_opt( char *str, MSVCRT_size_t sizeOfBuffer, - MSVCRT_size_t count, const char *format, DWORD options, - MSVCRT__locale_t locale, __ms_va_list valist ) +static int vsprintf_helper(DWORD options, char *str, MSVCRT_size_t sizeOfBuffer, MSVCRT_size_t count, + const char *format, MSVCRT__locale_t locale, __ms_va_list valist) { static const char nullbyte = '\0'; - struct _str_ctx_a ctx; + printf_arg args_ctx[MSVCRT__ARGMAX+1]; + struct _str_ctx_a puts_ctx; int len, ret; + BOOL postional, secure, c99, initially_positional;
- if(sizeOfBuffer<count+1 || count==-1) - len = sizeOfBuffer; - else - len = count+1; + len = sizeOfBuffer; + postional = options & MSVCRT_PRINTF_POSITIONAL_PARAMS; + initially_positional = postional; + secure = options & MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER; + c99 = (options & UCRTBASE_PRINTF_MASK) && !secure; + + if(secure && !postional) + if(sizeOfBuffer>count+1 && count!=-1) len = count+1; + + puts_ctx.len = len; + puts_ctx.buf = str; + + if(postional) { + 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) + postional = FALSE; + }
- ctx.len = len; - ctx.buf = str; - ret = pf_printf_a(puts_clbk_str_a, &ctx, format, locale, MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER | options, - arg_clbk_valist, NULL, &valist); - puts_clbk_str_a(&ctx, 1, &nullbyte); + ret = pf_printf_a(c99 ? puts_clbk_str_c99_a : puts_clbk_str_a, + &puts_ctx, format, locale, options, + postional ? arg_clbk_positional : arg_clbk_valist, + postional ? args_ctx : NULL, + postional ? NULL : &valist); + puts_clbk_str_a(&puts_ctx, 1, &nullbyte);
- if(ret<0 || ret==len) { + if((secure && !initially_positional) && (ret<0 || ret==len)) { if(count!=MSVCRT__TRUNCATE && count>sizeOfBuffer) { MSVCRT_INVALID_PMT("str[sizeOfBuffer] is too small", MSVCRT_ERANGE); memset(str, 0, sizeOfBuffer); @@ -855,28 +814,61 @@ static int CDECL MSVCRT_vsnprintf_s_l_opt( char *str, MSVCRT_size_t sizeOfBuffer return -1; }
+ if(c99){ + if(!str) + return ret; + if(options & UCRTBASE_PRINTF_LEGACY_VSPRINTF_NULL_TERMINATION) + return ret>len ? -1 : ret; + if(ret>=len) { + if(len) str[len-1] = 0; + return (options & UCRTBASE_PRINTF_STANDARD_SNPRINTF_BEHAVIOUR) ? ret : -2; + } + } + return ret; }
-static int MSVCRT_vsnwprintf_s_l_opt( MSVCRT_wchar_t *str, MSVCRT_size_t sizeOfBuffer, - MSVCRT_size_t count, const MSVCRT_wchar_t *format, DWORD options, - MSVCRT__locale_t locale, __ms_va_list valist) +static int vswprintf_helper(DWORD options, MSVCRT_wchar_t *str, MSVCRT_size_t sizeOfBuffer, MSVCRT_size_t count, + const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list valist) { - static const MSVCRT_wchar_t nullbyte = '\0'; - struct _str_ctx_w ctx; + static const char nullbyte = '\0'; + printf_arg args_ctx[MSVCRT__ARGMAX+1]; + struct _str_ctx_w puts_ctx; int len, ret; + BOOL postional, secure, c99, initially_positional;
len = sizeOfBuffer; - if(count!=-1 && len>count+1) - len = count+1; + postional = options & MSVCRT_PRINTF_POSITIONAL_PARAMS; + initially_positional = postional; + secure = options & MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER; + c99 = (options & UCRTBASE_PRINTF_MASK) && !secure; + + if(secure && !postional) + if(sizeOfBuffer>count+1 && count!=-1) len = count+1; + + puts_ctx.len = len; + puts_ctx.buf = str; + + if(postional) { + 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) + postional = FALSE; + }
- ctx.len = len; - ctx.buf = str; - ret = pf_printf_w(puts_clbk_str_w, &ctx, format, locale, MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER | options, - arg_clbk_valist, NULL, &valist); - puts_clbk_str_w(&ctx, 1, &nullbyte); + ret = pf_printf_w(c99 ? puts_clbk_str_c99_w : puts_clbk_str_w, + &puts_ctx, format, locale, options, + postional ? arg_clbk_positional : arg_clbk_valist, + postional ? args_ctx : NULL, + postional ? NULL : &valist); + puts_clbk_str_w(&puts_ctx, 1, &nullbyte);
- if(ret<0 || ret==len) { + if((secure && !initially_positional) && (ret<0 || ret==len)) { if(count!=MSVCRT__TRUNCATE && count>sizeOfBuffer) { MSVCRT_INVALID_PMT("str[sizeOfBuffer] is too small", MSVCRT_ERANGE); memset(str, 0, sizeOfBuffer*sizeof(MSVCRT_wchar_t)); @@ -886,9 +878,76 @@ static int MSVCRT_vsnwprintf_s_l_opt( MSVCRT_wchar_t *str, MSVCRT_size_t sizeOfB return -1; }
+ if(c99){ + if(!str) + return ret; + if(options & UCRTBASE_PRINTF_LEGACY_VSPRINTF_NULL_TERMINATION) + return ret>len ? -1 : ret; + if(ret>=len) { + if(len) str[len-1] = 0; + return (options & UCRTBASE_PRINTF_STANDARD_SNPRINTF_BEHAVIOUR) ? ret : -2; + } + } + return ret; }
+/********************************************************************* + * _vsnprintf (MSVCRT.@) + */ +int CDECL MSVCRT_vsnprintf( char *str, MSVCRT_size_t len, + const char *format, __ms_va_list valist ) +{ + return vsprintf_helper(0, str, len, 0, format, NULL, valist); +} + +#if _MSVCR_VER>=140 + +/********************************************************************* + * __stdio_common_vsprintf (UCRTBASE.@) + */ +int CDECL MSVCRT__stdio_common_vsprintf( unsigned __int64 options, char *str, MSVCRT_size_t len, const char *format, + MSVCRT__locale_t locale, __ms_va_list valist ) +{ + if (options & ~UCRTBASE_PRINTF_MASK) + FIXME("options %s not handled\n", wine_dbgstr_longlong(options)); + return vsprintf_helper(options & UCRTBASE_PRINTF_MASK, str, len, 0, format, locale, valist); +} + +#endif /* _MSVCR_VER>=140 */ + +/********************************************************************* + * _vsnprintf_l (MSVCRT.@) + */ +int CDECL MSVCRT_vsnprintf_l( char *str, MSVCRT_size_t len, const char *format, + MSVCRT__locale_t locale, __ms_va_list valist ) +{ + return vsprintf_helper(0, str, len, format, locale, valist); +} + +/********************************************************************* + * _vsprintf_l (MSVCRT.@) + */ +int CDECL MSVCRT_vsprintf_l( char *str, const char *format, + MSVCRT__locale_t locale, __ms_va_list valist ) +{ + return MSVCRT_vsnprintf_l(str, INT_MAX, format, locale, valist); +} + +/********************************************************************* + * _sprintf_l (MSVCRT.@) + */ +int WINAPIV MSVCRT_sprintf_l(char *str, const char *format, + MSVCRT__locale_t locale, ...) +{ + int retval; + __ms_va_list valist; + __ms_va_start(valist, locale); + retval = MSVCRT_vsnprintf_l(str, INT_MAX, format, locale, valist); + __ms_va_end(valist); + return retval; +} + /********************************************************************* * _vsnprintf_s_l (MSVCRT.@) */ @@ -896,7 +955,8 @@ int CDECL MSVCRT_vsnprintf_s_l( char *str, MSVCRT_size_t sizeOfBuffer, MSVCRT_size_t count, const char *format, MSVCRT__locale_t locale, __ms_va_list valist ) { - return MSVCRT_vsnprintf_s_l_opt(str, sizeOfBuffer, count, format, 0, locale, valist); + return vsprintf_helper(MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, str, sizeOfBuffer, count, format, + locale, valist); }
/********************************************************************* @@ -942,7 +1002,8 @@ int CDECL MSVCRT__stdio_common_vsnprintf_s( unsigned __int64 options, { if (options & ~UCRTBASE_PRINTF_MASK) FIXME("options %s not handled\n", wine_dbgstr_longlong(options)); - return MSVCRT_vsnprintf_s_l_opt(str, sizeOfBuffer, count, format, options & UCRTBASE_PRINTF_MASK, locale, valist); + return vsprintf_helper((options & UCRTBASE_PRINTF_MASK) | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, str, + sizeOfBuffer, count, format, locale, valist); }
/********************************************************************* @@ -954,7 +1015,8 @@ int CDECL MSVCRT__stdio_common_vsnwprintf_s( unsigned __int64 options, { if (options & ~UCRTBASE_PRINTF_MASK) FIXME("options %s not handled\n", wine_dbgstr_longlong(options)); - return MSVCRT_vsnwprintf_s_l_opt(str, sizeOfBuffer, count, format, options & UCRTBASE_PRINTF_MASK, locale, valist); + return vswprintf_helper((options & UCRTBASE_PRINTF_MASK) | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, str, + sizeOfBuffer, count, format, locale, valist); }
/********************************************************************* @@ -974,9 +1036,7 @@ int CDECL MSVCRT__stdio_common_vsprintf_s( unsigned __int64 options, char *str, MSVCRT_size_t count, const char *format, MSVCRT__locale_t locale, __ms_va_list valist ) { - if (options & ~UCRTBASE_PRINTF_MASK) - FIXME("options %s not handled\n", wine_dbgstr_longlong(options)); - return MSVCRT_vsnprintf_s_l_opt(str, INT_MAX, count, format, options & UCRTBASE_PRINTF_MASK, locale, valist); + return MSVCRT__stdio_common_vsnprintf_s(options, str, INT_MAX, count, format, locale, valist); }
#endif /* _MSVCR_VER>=140 */ @@ -1011,28 +1071,8 @@ int CDECL MSVCRT__vscprintf( const char *format, __ms_va_list valist ) int CDECL MSVCRT__vscprintf_p_l(const char *format, MSVCRT__locale_t locale, __ms_va_list args) { - printf_arg args_ctx[MSVCRT__ARGMAX+1]; - struct _str_ctx_a puts_ctx = {INT_MAX, NULL}; - int ret; - - memset(args_ctx, 0, sizeof(args_ctx)); - - ret = create_positional_ctx_a(args_ctx, format, args); - if(ret < 0) { - MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); - *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); - } else { - ret = pf_printf_a(puts_clbk_str_a, &puts_ctx, format, locale, - MSVCRT_PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, - arg_clbk_positional, args_ctx, NULL); - } - - return ret; + return vsprintf_helper(MSVCRT_PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, + NULL, INT_MAX, 0, format, locale, args); }
/********************************************************************* @@ -1103,14 +1143,7 @@ int WINAPIV MSVCRT__scprintf(const char *format, ...) int CDECL MSVCRT_vsnwprintf(MSVCRT_wchar_t *str, MSVCRT_size_t len, const MSVCRT_wchar_t *format, __ms_va_list valist) { - static const MSVCRT_wchar_t nullbyte = '\0'; - struct _str_ctx_w ctx = {len, str}; - int ret; - - ret = pf_printf_w(puts_clbk_str_w, &ctx, format, NULL, 0, - arg_clbk_valist, NULL, &valist); - puts_clbk_str_w(&ctx, 1, &nullbyte); - return ret; + return vswprintf_helper(0, str, len, 0, format, NULL, valist); }
/********************************************************************* @@ -1120,41 +1153,7 @@ int CDECL MSVCRT_vsnwprintf_l(MSVCRT_wchar_t *str, MSVCRT_size_t len, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list valist) { - static const MSVCRT_wchar_t nullbyte = '\0'; - struct _str_ctx_w ctx = {len, str}; - int ret; - - ret = pf_printf_w(puts_clbk_str_w, &ctx, format, locale, 0, - arg_clbk_valist, NULL, &valist); - puts_clbk_str_w(&ctx, 1, &nullbyte); - return ret; -} - -static int MSVCRT_vswprintf_p_l_opt(MSVCRT_wchar_t *buffer, MSVCRT_size_t length, - const MSVCRT_wchar_t *format, DWORD options, MSVCRT__locale_t locale, __ms_va_list args) -{ - static const MSVCRT_wchar_t nullbyte = '\0'; - printf_arg args_ctx[MSVCRT__ARGMAX+1]; - struct _str_ctx_w puts_ctx = {length, buffer}; - int ret; - - memset(args_ctx, 0, sizeof(args_ctx)); - - ret = create_positional_ctx_w(args_ctx, format, args); - if(ret < 0) { - MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); - *MSVCRT__errno() = MSVCRT_EINVAL; - return ret; - } else if(ret == 0) - ret = pf_printf_w(puts_clbk_str_w, &puts_ctx, format, locale, MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER | options, - arg_clbk_valist, NULL, &args); - else - ret = pf_printf_w(puts_clbk_str_w, &puts_ctx, format, locale, - MSVCRT_PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER | options, - arg_clbk_positional, args_ctx, NULL); - - puts_clbk_str_w(&puts_ctx, 1, &nullbyte); - return ret; + return vswprintf_helper(0, str, len, 0, format, locale, valist); }
/********************************************************************* @@ -1163,7 +1162,8 @@ static int MSVCRT_vswprintf_p_l_opt(MSVCRT_wchar_t *buffer, MSVCRT_size_t length int CDECL MSVCRT_vswprintf_p_l(MSVCRT_wchar_t *buffer, MSVCRT_size_t length, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list args) { - return MSVCRT_vswprintf_p_l_opt(buffer, length, format, 0, locale, args); + return vswprintf_helper(MSVCRT_PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, + buffer, length, 0, format, locale, args); }
#if _MSVCR_VER>=80 @@ -1173,7 +1173,7 @@ int CDECL MSVCRT_vswprintf_p_l(MSVCRT_wchar_t *buffer, MSVCRT_size_t length, int CDECL MSVCRT__vswprintf_p(MSVCRT_wchar_t *buffer, MSVCRT_size_t length, const MSVCRT_wchar_t *format, __ms_va_list args) { - return MSVCRT_vswprintf_p_l_opt(buffer, length, format, 0, NULL, args); + return MSVCRT_vswprintf_p_l(buffer, length, format, NULL, args); } #endif
@@ -1187,7 +1187,8 @@ int CDECL MSVCRT__stdio_common_vswprintf_p( unsigned __int64 options, { if (options & ~UCRTBASE_PRINTF_MASK) FIXME("options %s not handled\n", wine_dbgstr_longlong(options)); - return MSVCRT_vswprintf_p_l_opt(str, count, format, options & UCRTBASE_PRINTF_MASK, locale, valist); + return vswprintf_helper((options & UCRTBASE_PRINTF_MASK) | (MSVCRT_PRINTF_POSITIONAL_PARAMS | + MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER), str, count, 0, format, locale, valist); } #endif
@@ -1198,7 +1199,8 @@ int CDECL MSVCRT_vsnwprintf_s_l( MSVCRT_wchar_t *str, MSVCRT_size_t sizeOfBuffer MSVCRT_size_t count, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list valist) { - return MSVCRT_vsnwprintf_s_l_opt(str, sizeOfBuffer, count, format, 0, locale, valist); + return vswprintf_helper(MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, str, sizeOfBuffer, count, format, + locale, valist); }
/********************************************************************* @@ -1268,26 +1270,6 @@ int WINAPIV MSVCRT__snwprintf_s_l( MSVCRT_wchar_t *str, unsigned int len, unsign
#if _MSVCR_VER>=140
-static int puts_clbk_str_c99_w(void *ctx, int len, const MSVCRT_wchar_t *str) -{ - struct _str_ctx_w *out = ctx; - - if(!out->buf) - return len; - - if(out->len < len) { - memcpy(out->buf, str, out->len*sizeof(MSVCRT_wchar_t)); - out->buf += out->len; - out->len = 0; - return len; - } - - memcpy(out->buf, str, len*sizeof(MSVCRT_wchar_t)); - out->buf += len; - out->len -= len; - return len; -} - /********************************************************************* * __stdio_common_vswprintf (UCRTBASE.@) */ @@ -1295,25 +1277,9 @@ int CDECL MSVCRT__stdio_common_vswprintf( unsigned __int64 options, MSVCRT_wchar_t *str, MSVCRT_size_t len, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list valist ) { - static const MSVCRT_wchar_t nullbyte = '\0'; - struct _str_ctx_w ctx = {len, str}; - int ret; - if (options & ~UCRTBASE_PRINTF_MASK) FIXME("options %s not handled\n", wine_dbgstr_longlong(options)); - ret = pf_printf_w(puts_clbk_str_c99_w, - &ctx, format, locale, options & UCRTBASE_PRINTF_MASK, arg_clbk_valist, NULL, &valist); - puts_clbk_str_w(&ctx, 1, &nullbyte); - - if(!str) - return ret; - if(options & UCRTBASE_PRINTF_LEGACY_VSPRINTF_NULL_TERMINATION) - return ret>len ? -1 : ret; - if(ret>=len) { - if(len) str[len-1] = 0; - return (options & UCRTBASE_PRINTF_STANDARD_SNPRINTF_BEHAVIOUR) ? ret : -2; - } - return ret; + return vswprintf_helper(options & UCRTBASE_PRINTF_MASK, str, len, 0, format, locale, valist); }
#endif /* _MSVCR_VER>=140 */ @@ -1444,7 +1410,8 @@ int CDECL MSVCRT__vscwprintf_l( const MSVCRT_wchar_t *format, MSVCRT__locale_t l */ int CDECL MSVCRT__vscwprintf_p_l( const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list args ) { - return MSVCRT_vswprintf_p_l_opt( NULL, INT_MAX, format, 0, locale, args ); + return vswprintf_helper(MSVCRT_PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, NULL, INT_MAX, + 0, format, locale, args); }
#if _MSVCR_VER>=80 @@ -1453,7 +1420,7 @@ int CDECL MSVCRT__vscwprintf_p_l( const MSVCRT_wchar_t *format, MSVCRT__locale_t */ int CDECL MSVCRT__vscwprintf_p(const MSVCRT_wchar_t *format, __ms_va_list args) { - return MSVCRT_vswprintf_p_l_opt(NULL, INT_MAX, format, 0, NULL, args); + return MSVCRT__vscwprintf_p_l(NULL, INT_MAX, format, 0, NULL, args); } #endif
@@ -1476,40 +1443,14 @@ int CDECL MSVCRT_vswprintf_s_l(MSVCRT_wchar_t* str, MSVCRT_size_t numberOfElemen format, locale, args ); }
-static int MSVCRT_vsprintf_p_l_opt(char *buffer, MSVCRT_size_t length, const char *format, - DWORD options, MSVCRT__locale_t locale, __ms_va_list args) -{ - static const char nullbyte = '\0'; - printf_arg args_ctx[MSVCRT__ARGMAX+1]; - struct _str_ctx_a puts_ctx = {length, buffer}; - int ret; - - memset(args_ctx, 0, sizeof(args_ctx)); - - ret = create_positional_ctx_a(args_ctx, format, args); - if(ret < 0) { - MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); - *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 | 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 | 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, 0, locale, args); + return vsprintf_helper(MSVCRT_PRINTF_POSITIONAL_PARAMS | MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER, buffer, length, + 0, format, locale, args); }
/********************************************************************* @@ -1530,7 +1471,8 @@ int CDECL MSVCRT__stdio_common_vsprintf_p(unsigned __int64 options, char *buffer { if (options & ~UCRTBASE_PRINTF_MASK) FIXME("options %s not handled\n", wine_dbgstr_longlong(options)); - return MSVCRT_vsprintf_p_l_opt(buffer, length, format, options & UCRTBASE_PRINTF_MASK, locale, args); + return vsprintf_helper((options & UCRTBASE_PRINTF_MASK) | (MSVCRT_PRINTF_POSITIONAL_PARAMS | + MSVCRT_PRINTF_INVOKE_INVALID_PARAM_HANDLER), buffer, length, 0, format, locale, args); } #endif
@@ -1591,7 +1533,7 @@ int WINAPIV MSVCRT_swprintf_p_l(MSVCRT_wchar_t *buffer, MSVCRT_size_t length, int r;
__ms_va_start(valist, locale); - r = MSVCRT_vswprintf_p_l_opt(buffer, length, format, 0, locale, valist); + r = MSVCRT_vswprintf_p_l(buffer, length, format, locale, valist); __ms_va_end(valist);
return r;