[PATCH] msvcrt: Introduce vsprintf & vswprintf helper functions.
Gijs Vermeulen
gijsvrm at gmail.com
Sat Jan 13 18:39:27 CST 2018
There are some problems with this patch, please ignore it for now.
Sorry for the noise.
2018-01-14 0:15 GMT+01:00 Gijs Vermeulen <gijsvrm at gmail.com>:
> Signed-off-by: Gijs Vermeulen <gijsvrm at 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;
> --
> 2.15.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20180114/c79b8a93/attachment-0001.html>
More information about the wine-devel
mailing list