Piotr Caban : wmic: Fix output when redirected to pipe.
Module: wine Branch: master Commit: 707d299da62414e6582c5c0c8cfec0cd43c3ac97 URL: https://gitlab.winehq.org/wine/wine/-/commit/707d299da62414e6582c5c0c8cfec0c... Author: Piotr Caban <piotr(a)codeweavers.com> Date: Tue Aug 22 14:18:12 2023 +0200 wmic: Fix output when redirected to pipe. --- programs/wmic/main.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/programs/wmic/main.c b/programs/wmic/main.c index 20030101224..936fe45139d 100644 --- a/programs/wmic/main.c +++ b/programs/wmic/main.c @@ -19,6 +19,8 @@ #define COBJMACROS +#include <fcntl.h> +#include <io.h> #include <locale.h> #include <stdio.h> #include "windows.h" @@ -63,29 +65,25 @@ static const WCHAR *find_class( const WCHAR *alias ) return NULL; } -static int WINAPIV output_string( HANDLE handle, const WCHAR *msg, ... ) +static int WINAPIV output_string( const WCHAR *msg, ... ) { - static const WCHAR bomW[] = {0xfeff}; + int count, bom_count = 0; static BOOL bom; va_list va_args; - int len; - DWORD count, bom_count = 0; - WCHAR buffer[8192]; - - va_start( va_args, msg ); - len = vswprintf( buffer, ARRAY_SIZE(buffer), msg, va_args ); - va_end( va_args ); - if (!WriteConsoleW( handle, buffer, len, &count, NULL )) + if (!bom) { - if (!bom) + if (GetFileType((HANDLE)_get_osfhandle( STDOUT_FILENO )) == FILE_TYPE_DISK) { - WriteFile( handle, bomW, sizeof(bomW), &bom_count, FALSE ); - bom = TRUE; + _setmode( STDOUT_FILENO, _O_U16TEXT ); + bom_count = wprintf( L"\xfeff" ); } - WriteFile( handle, buffer, len * sizeof(WCHAR), &count, FALSE ); + bom = TRUE; } + va_start( va_args, msg ); + count = vwprintf( msg, va_args ); + va_end( va_args ); return count + bom_count; } @@ -99,12 +97,12 @@ static int output_error( int msg ) static int output_text( const WCHAR *str, ULONG column_width ) { - return output_string( GetStdHandle(STD_OUTPUT_HANDLE), L"%-*s", column_width, str ); + return output_string( L"%-*s", column_width, str ); } static int output_newline( void ) { - return output_string( GetStdHandle(STD_OUTPUT_HANDLE), L"\r\n" ); + return output_string( L"\n" ); } static WCHAR * strip_spaces(WCHAR *start)
participants (1)
-
Alexandre Julliard