msvcrt: Implement _wperror

Piotr Caban piotr.caban at gmail.com
Tue Jun 21 04:04:37 CDT 2016


On 06/21/16 10:09, Hugh McMaster wrote:
>  dlls/msvcrt/msvcrt.spec |  2 +-
>  2 files changed, 36 insertions(+), 1 deletion(-)
Please also update other msvc*/ucrtbase spec files as well.

>  /*********************************************************************
> + *		_wperror (MSVCRT.@)
> + */
> +void CDECL MSVCRT__wperror(const MSVCRT_wchar_t* str)
> +{
> +    int err, size, len;
> +    static const WCHAR colon_spaceW[] = {':',' ',0};
> +    static const WCHAR newlineW[] = {'\n',0};
> +    MSVCRT_wchar_t *buffer = NULL;
> +
> +    err = *MSVCRT__errno();
> +    if (err < 0 || err > MSVCRT__sys_nerr) err = MSVCRT__sys_nerr;
> +
> +    size = MultiByteToWideChar(CP_ACP, 0, MSVCRT__sys_errlist[err], -1, NULL, 0) + 1 /* add \n */;
> +
> +    if (str && *str)
> +        size += lstrlenW(str) + 2; /* add str length, colon and space */
> +
> +    buffer = MSVCRT_malloc(size * sizeof(MSVCRT_wchar_t));
> +    if (!buffer) return;
> +
> +    if (str && *str)
> +    {
> +        lstrcpyW(buffer, str);
> +        lstrcatW(buffer, colon_spaceW);
> +    }
> +    else buffer[0] = 0;
> +
> +    len = lstrlenW(buffer);
> +    MultiByteToWideChar(CP_ACP, 0, MSVCRT__sys_errlist[err], -1, buffer + len, size - len);
> +    lstrcatW(buffer, newlineW);
> +    MSVCRT__write(2, buffer, lstrlenW(buffer) * sizeof(MSVCRT_wchar_t));
> +    MSVCRT_free(buffer);
> +}
This is not how the function works. It shouldn't print wchar_t string to 
stderr. Probably the simplest implementation is to convert input 
parameter and call _perror (CP_ACP is not the correct encoding, you can 
use MSVCRT_wcstombs).

Thanks,
Piotr



More information about the wine-devel mailing list