From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 33 ++++++++++-------------- programs/cmd/tests/test_builtins.cmd | 1 + programs/cmd/tests/test_builtins.cmd.exp | 2 +- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 5 files changed, 18 insertions(+), 22 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 8cbe9673b33..e5cc69c1461 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -4054,27 +4054,24 @@ RETURN_CODE WCMD_assoc(const WCHAR *args, BOOL assoc) * Colors the terminal screen. */
-void WCMD_color (void) { - +RETURN_CODE WCMD_color(void) +{ + RETURN_CODE return_code = ERROR_INVALID_FUNCTION; CONSOLE_SCREEN_BUFFER_INFO consoleInfo; HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
- if (param1[0] != 0x00 && lstrlenW(param1) > 2) { + if (param1[0] != 0x00 && lstrlenW(param1) > 2) + { WCMD_output_stderr(WCMD_LoadMessage(WCMD_ARGERR)); - return; } - - if (GetConsoleScreenBufferInfo(hStdOut, &consoleInfo)) + else if (GetConsoleScreenBufferInfo(hStdOut, &consoleInfo)) { - COORD topLeft; + COORD topLeft = {0, 0}; DWORD screenSize; - DWORD color = 0; + DWORD color;
screenSize = consoleInfo.dwSize.X * (consoleInfo.dwSize.Y + 1);
- topLeft.X = 0; - topLeft.Y = 0; - /* Convert the color hex digits */ if (param1[0] == 0x00) { color = defaultColor; @@ -4083,16 +4080,14 @@ void WCMD_color (void) { }
/* Fail if fg == bg color */ - if (((color & 0xF0) >> 4) == (color & 0x0F)) { - errorlevel = ERROR_INVALID_FUNCTION; - return; + if (((color & 0xF0) >> 4) != (color & 0x0F)) + { + FillConsoleOutputAttribute(hStdOut, color, screenSize, topLeft, &screenSize); + SetConsoleTextAttribute(hStdOut, color); + return_code = NO_ERROR; } - - /* Set the current screen contents and ensure all future writes - remain this color */ - FillConsoleOutputAttribute(hStdOut, color, screenSize, topLeft, &screenSize); - SetConsoleTextAttribute(hStdOut, color); } + return errorlevel = return_code; }
/**************************************************************************** diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index b43848575fc..d9757751bd1 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -693,6 +693,7 @@ call :setError 666 & (echo foo | more &&echo SUCCESS !errorlevel!||echo FAILURE echo --- success/failure for PAUSE command call :setError 666 & (pause < NUL > NUL 2>&1 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) rem TODO: pause is harder to test when fd 1 is a console handle as we don't control output + echo --- setlocal DisableDelayedExpansion echo ------------ Testing 'set' ------------ diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 0ca3459f8e0..86e9d22b0ce 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -603,7 +603,7 @@ SUCCESS 0 @todo_wine@@formfeed@SUCCESS 666 FAILURE 1 --- success/failure for COLOR command -@todo_wine@FAILURE 1 +FAILURE 1 --- success/failure for TITLE command SUCCESS 666 SUCCESS 666 diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index e43a9f4a127..e1d4d2bc431 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -167,7 +167,7 @@ RETURN_CODE WCMD_call(WCHAR *command); void WCMD_change_tty (void); void WCMD_choice (const WCHAR *); RETURN_CODE WCMD_clear_screen(void); -void WCMD_color (void); +RETURN_CODE WCMD_color(void); RETURN_CODE WCMD_copy(WCHAR *); RETURN_CODE WCMD_create_dir(WCHAR *); RETURN_CODE WCMD_delete(WCHAR *); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 90747ad8207..1411f0f193e 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1920,7 +1920,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_assoc(parms_start, TRUE); break; case WCMD_COLOR: - WCMD_color(); + return_code = WCMD_color(); break; case WCMD_FTYPE: return_code = WCMD_assoc(parms_start, FALSE);