[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