This is part XVIII of cmd engine rewrite.
It mainly focuses on setting the expected return code for some builtin functions. Includes also a fix for pipe inside a redirection (spotted by the added tests).
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/tests/batch.c | 10 ++++++++++ programs/cmd/tests/test_builtins.cmd | 24 ++++++++++++++++++++++++ programs/cmd/tests/test_builtins.cmd.exp | 22 ++++++++++++++++++++++ 3 files changed, 56 insertions(+)
diff --git a/programs/cmd/tests/batch.c b/programs/cmd/tests/batch.c index ade6587be81..d44d2d33dec 100644 --- a/programs/cmd/tests/batch.c +++ b/programs/cmd/tests/batch.c @@ -167,6 +167,7 @@ static const char *compare_line(const char *out_line, const char *out_end, const static const char space_cmd[] = {'@','s','p','a','c','e','@'}; static const char spaces_cmd[] = {'@','s','p','a','c','e','s','@'}; static const char tab_cmd[] = {'@','t','a','b','@'}; + static const char formfeed_cmd[] = {'@','f','o','r','m', 'f', 'e', 'e', 'd', '@'}; static const char or_broken_cmd[] = {'@','o','r','_','b','r','o','k','e','n','@'};
while(exp_ptr < exp_end) { @@ -242,6 +243,15 @@ static const char *compare_line(const char *out_line, const char *out_end, const } else { err = out_end; } + }else if(exp_ptr+sizeof(formfeed_cmd) <= exp_end + && !memcmp(exp_ptr, formfeed_cmd, sizeof(formfeed_cmd))) { + exp_ptr += sizeof(formfeed_cmd); + if(out_ptr < out_end && *out_ptr == '\f') { + out_ptr++; + continue; + } else { + err = out_end; + } }else if(exp_ptr+sizeof(or_broken_cmd) <= exp_end && !memcmp(exp_ptr, or_broken_cmd, sizeof(or_broken_cmd))) { if(out_ptr == out_end) diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index 2bda4ad68ff..b43848575fc 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -669,6 +669,30 @@ call :setError 666 & help ACommandThatLikelyDoesntExist >NUL &&echo SUCCESS !err echo --- success/failure for PROMPT command call :setError 666 & prompt >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! rem doesn't seem to set errors either on invalid $ escapes, nor qualifiers + +echo --- success/failure for CLS command +call :setError 666 & (cls &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (cls foobar &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (cls /X &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +echo --- success/failure for COLOR command +call :setError 666 & (color fc < NUL > NUL 2>&1 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem TODO: color is also hard to test: it requires fd 1 to be bound to a console, so we can't redirect its output +echo --- success/failure for TITLE command +call :setError 666 & (title a new title &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (title &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +echo --- success/failure for CHOICE command +call :setError 666 & (choice <NUL >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (choice /c <NUL >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & ((echo A | choice /C:BA) >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (choice /C:BA <NUL >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem syntax errors in command return INVALID_FUNCTION, need to find a test for returning 255 +echo --- success/failure for MORE command +call :setError 666 & (more NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (more I\dont\exist.txt > NUL 2>&1 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (echo foo | more &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +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 de82728369a..3daf9f1b3db 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -598,6 +598,28 @@ FAILURE 1 SUCCESS 0 --- success/failure for PROMPT command SUCCESS 0 +--- success/failure for CLS command +@todo_wine@@formfeed@SUCCESS 666 +@todo_wine@@formfeed@SUCCESS 666 +@todo_wine@FAILURE 1 +--- success/failure for COLOR command +@todo_wine@FAILURE 1 +--- success/failure for TITLE command +SUCCESS 666 +SUCCESS 666 +--- success/failure for CHOICE command +@todo_wine@FAILURE 1 +@todo_wine@FAILURE 1 +@todo_wine@FAILURE 2 +@todo_wine@FAILURE 1 +@todo_wine@--- success/failure for MORE command +SUCCESS 0 +@todo_wine@SUCCESS 0 +foo@space@ +@todo_wine@ +@todo_wine@SUCCESS 0 +@todo_wine@--- success/failure for PAUSE command +@todo_wine@FAILURE 1 --- ------------ Testing 'set' ------------ 1
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 7 +++++-- programs/cmd/tests/test_builtins.cmd.exp | 2 +- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index c8c4dfbaa0b..8cbe9673b33 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -249,13 +249,15 @@ static BOOL WCMD_ask_confirm (const WCHAR *message, BOOL showSureText, * Clear the terminal screen. */
-void WCMD_clear_screen (void) { - +RETURN_CODE WCMD_clear_screen(void) +{ /* Emulate by filling the screen from the top left to bottom right with spaces, then moving the cursor to the top left afterwards */ CONSOLE_SCREEN_BUFFER_INFO consoleInfo; HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
+ if (*quals) + return errorlevel = ERROR_INVALID_FUNCTION; if (GetConsoleScreenBufferInfo(hStdOut, &consoleInfo)) { COORD topLeft; @@ -269,6 +271,7 @@ void WCMD_clear_screen (void) { FillConsoleOutputAttribute(hStdOut, consoleInfo.wAttributes, screenSize, topLeft, &written); SetConsoleCursorPosition(hStdOut, topLeft); } + return NO_ERROR; }
/**************************************************************************** diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 3daf9f1b3db..0ca3459f8e0 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -601,7 +601,7 @@ SUCCESS 0 --- success/failure for CLS command @todo_wine@@formfeed@SUCCESS 666 @todo_wine@@formfeed@SUCCESS 666 -@todo_wine@FAILURE 1 +FAILURE 1 --- success/failure for COLOR command @todo_wine@FAILURE 1 --- success/failure for TITLE command diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index f225ad0b9ff..e43a9f4a127 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -166,7 +166,7 @@ RETURN_CODE WCMD_batch(const WCHAR *, WCHAR *, const WCHAR *, HANDLE); RETURN_CODE WCMD_call(WCHAR *command); void WCMD_change_tty (void); void WCMD_choice (const WCHAR *); -void WCMD_clear_screen (void); +RETURN_CODE WCMD_clear_screen(void); void WCMD_color (void); RETURN_CODE WCMD_copy(WCHAR *); RETURN_CODE WCMD_create_dir(WCHAR *); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index ed520a05ed6..90747ad8207 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1820,7 +1820,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_setshow_default(parms_start); break; case WCMD_CLS: - WCMD_clear_screen (); + return_code = WCMD_clear_screen(); break; case WCMD_COPY: return_code = WCMD_copy(parms_start);
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);
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 6 ++++-- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 3 +-- 3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index e5cc69c1461..c4a387dc823 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3538,8 +3538,10 @@ void WCMD_start(WCHAR *args) * * Set the console title */ -void WCMD_title (const WCHAR *args) { - SetConsoleTitleW(args); +RETURN_CODE WCMD_title(const WCHAR *args) +{ + SetConsoleTitleW(args); + return NO_ERROR; }
/**************************************************************************** diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index e1d4d2bc431..36de66215bd 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -204,7 +204,7 @@ RETURN_CODE WCMD_setshow_prompt(void); RETURN_CODE WCMD_setshow_time(void); RETURN_CODE WCMD_shift(const WCHAR *args); void WCMD_start (WCHAR *args); -void WCMD_title (const WCHAR *); +RETURN_CODE WCMD_title(const WCHAR *); RETURN_CODE WCMD_type(WCHAR *); RETURN_CODE WCMD_verify(void); RETURN_CODE WCMD_version(void); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 1411f0f193e..b7aec31ee2f 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1895,8 +1895,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_setshow_time(); break; case WCMD_TITLE: - if (lstrlenW(&whichcmd[count]) > 0) - WCMD_title(&whichcmd[count+1]); + return_code = WCMD_title(parms_start); break; case WCMD_TYPE: return_code = WCMD_type(parms_start);
From: Eric Pouech epouech@codeweavers.com
For commands like '(lhs_command | rhs_command) > foo' run the rhs_command with the expected output handle.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/wcmdmain.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index b7aec31ee2f..72df7f2567c 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -3728,6 +3728,7 @@ RETURN_CODE node_execute(CMD_NODE *node) WCHAR temp_path[MAX_PATH]; WCHAR filename[MAX_PATH]; CMD_REDIRECTION *output; + HANDLE saved_output;
/* FIXME: a real pipe instead of writing to an intermediate file would be * better. @@ -3742,6 +3743,7 @@ RETURN_CODE node_execute(CMD_NODE *node) GetTempFileNameW(temp_path, L"CMD", 0, filename); TRACE("Using temporary file of %ls\n", filename);
+ saved_output = GetStdHandle(STD_OUTPUT_HANDLE); /* set output for left hand side command */ output = redirection_create_file(REDIR_WRITE_TO, 1, filename); if (set_std_redirections(output)) @@ -3750,7 +3752,7 @@ RETURN_CODE node_execute(CMD_NODE *node) return_code = NO_ERROR;
CloseHandle(GetStdHandle(STD_OUTPUT_HANDLE)); - SetStdHandle(STD_OUTPUT_HANDLE, old_stdhandles[1]); + SetStdHandle(STD_OUTPUT_HANDLE, saved_output);
return_code = temp_fixup_return_code(node->left, return_code, NO_ERROR); if (return_code == NO_ERROR)
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 24 +++++++++++++----------- programs/cmd/tests/test_builtins.cmd | 1 - programs/cmd/tests/test_builtins.cmd.exp | 12 ++++++------ programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 5 files changed, 21 insertions(+), 20 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index c4a387dc823..caa76547734 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -291,7 +291,8 @@ void WCMD_change_tty (void) { * */
-void WCMD_choice (const WCHAR * args) { +RETURN_CODE WCMD_choice (const WCHAR * args) +{ WCHAR answer[16]; WCHAR buffer[16]; WCHAR *ptr = NULL; @@ -306,11 +307,12 @@ void WCMD_choice (const WCHAR * args) { BOOL opt_s = FALSE;
have_console = GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &oldmode); - errorlevel = NO_ERROR; - my_command = xstrdupW(WCMD_skip_leading_spaces((WCHAR*)args));
- ptr = WCMD_skip_leading_spaces(my_command); + ptr = my_command; + /* syntax errors are reported with ERRORLEVEL=1, which doesn't allow to + * discriminate from a choosen option! + */ while (*ptr == '/') { switch (towupper(ptr[1])) { case 'C': @@ -322,7 +324,7 @@ void WCMD_choice (const WCHAR * args) { if (!*ptr || iswspace(*ptr)) { WINE_FIXME("bad parameter %s for /C\n", wine_dbgstr_w(ptr)); free(my_command); - return; + return errorlevel = ERROR_INVALID_FUNCTION; }
/* remember the allowed keys (overwrite previous /C option) */ @@ -359,7 +361,7 @@ void WCMD_choice (const WCHAR * args) { if (!opt_default || (*ptr != ',')) { WINE_FIXME("bad option %s for /T\n", opt_default ? wine_dbgstr_w(ptr) : ""); free(my_command); - return; + return errorlevel = ERROR_INVALID_FUNCTION; } ptr++;
@@ -378,7 +380,7 @@ void WCMD_choice (const WCHAR * args) { default: WINE_FIXME("bad parameter: %s\n", wine_dbgstr_w(ptr)); free(my_command); - return; + return errorlevel = ERROR_INVALID_FUNCTION; } }
@@ -422,11 +424,11 @@ void WCMD_choice (const WCHAR * args) {
/* FIXME: Add support for option /T */ answer[1] = 0; /* terminate single character string */ - if (!WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), answer, 1, &count)) + if (!WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), answer, 1, &count) || !count) { free(my_command); - errorlevel = NO_ERROR; - return; + /* FIXME: is this choice 1 or ERROR_INVALID_FUNCTION? */ + return errorlevel = 1; }
if (!opt_s) @@ -442,7 +444,7 @@ void WCMD_choice (const WCHAR * args) { errorlevel = (ptr - opt_c) + 1; TRACE("answer: %d\n", errorlevel); free(my_command); - return; + return errorlevel; } else { diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index d9757751bd1..b43848575fc 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -693,7 +693,6 @@ 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 86e9d22b0ce..a949693025c 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -608,11 +608,11 @@ FAILURE 1 SUCCESS 666 SUCCESS 666 --- success/failure for CHOICE command -@todo_wine@FAILURE 1 -@todo_wine@FAILURE 1 -@todo_wine@FAILURE 2 -@todo_wine@FAILURE 1 -@todo_wine@--- success/failure for MORE command +FAILURE 1 +FAILURE 1 +FAILURE 2 +FAILURE 1 +--- success/failure for MORE command SUCCESS 0 @todo_wine@SUCCESS 0 foo@space@ @@ -659,7 +659,7 @@ I'm here!@space@ I'm here!@space@ ------------ Testing 'choice' ------------ @todo_wine@Example message [A,B,C]?A@or_broken@choice unavailable -@todo_wine@1@or_broken@9009 +1@or_broken@9009 @todo_wine@Example message [A,B,C]?B@or_broken@choice unavailable @todo_wine@2@or_broken@9009 @todo_wine@[D,E,F]?F@or_broken@choice unavailable diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 36de66215bd..ae8f69166c2 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -165,7 +165,7 @@ RETURN_CODE WCMD_assoc(const WCHAR *, BOOL); RETURN_CODE WCMD_batch(const WCHAR *, WCHAR *, const WCHAR *, HANDLE); RETURN_CODE WCMD_call(WCHAR *command); void WCMD_change_tty (void); -void WCMD_choice (const WCHAR *); +RETURN_CODE WCMD_choice(const WCHAR *); RETURN_CODE WCMD_clear_screen(void); RETURN_CODE WCMD_color(void); RETURN_CODE WCMD_copy(WCHAR *); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 72df7f2567c..4aa5a992218 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1928,7 +1928,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) WCMD_more(parms_start); break; case WCMD_CHOICE: - WCMD_choice(parms_start); + return_code = WCMD_choice(parms_start); break; case WCMD_MKLINK: WCMD_mklink(parms_start);
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 11 +++++------ programs/cmd/tests/test_builtins.cmd.exp | 8 ++++---- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 4 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index caa76547734..368722ee1f0 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3605,17 +3605,17 @@ RETURN_CODE WCMD_type(WCHAR *args) * Output either a file or stdin to screen in pages */
-void WCMD_more (WCHAR *args) { - +RETURN_CODE WCMD_more(WCHAR *args) +{ int argno = 0; WCHAR *argN = args; WCHAR moreStr[100]; WCHAR moreStrPage[100]; WCHAR buffer[512]; DWORD count; + RETURN_CODE return_code = NO_ERROR;
/* Prefix the NLS more with '-- ', then load the text */ - errorlevel = NO_ERROR; lstrcpyW(moreStr, L"-- "); LoadStringW(hinst, WCMD_MORESTR, &moreStr[3], ARRAY_SIZE(moreStr)-3);
@@ -3647,8 +3647,7 @@ void WCMD_more (WCHAR *args) { /* Restore stdin to what it was */ SetStdHandle(STD_INPUT_HANDLE, hstdin); CloseHandle(hConIn); - - return; + WCMD_output_asis (L"\r\n"); } else { BOOL needsPause = FALSE;
@@ -3679,7 +3678,6 @@ void WCMD_more (WCHAR *args) { if (h == INVALID_HANDLE_VALUE) { WCMD_print_error (); WCMD_output_stderr(WCMD_LoadMessage(WCMD_READFAIL), thisArg); - errorlevel = ERROR_INVALID_FUNCTION; } else { ULONG64 curPos = 0; ULONG64 fileLen = 0; @@ -3706,6 +3704,7 @@ void WCMD_more (WCHAR *args) {
WCMD_leave_paged_mode(); } + return errorlevel = return_code; }
/**************************************************************************** diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index a949693025c..18a7fecbcb7 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -614,11 +614,11 @@ FAILURE 2 FAILURE 1 --- success/failure for MORE command SUCCESS 0 -@todo_wine@SUCCESS 0 +SUCCESS 0 foo@space@ -@todo_wine@ -@todo_wine@SUCCESS 0 -@todo_wine@--- success/failure for PAUSE command + +SUCCESS 0 +--- success/failure for PAUSE command @todo_wine@FAILURE 1 --- ------------ Testing 'set' ------------ diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index ae8f69166c2..181e3ed1c2e 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -181,7 +181,7 @@ RETURN_CODE WCMD_give_help(WCHAR *args); RETURN_CODE WCMD_goto(void); RETURN_CODE WCMD_label(void); void WCMD_leave_paged_mode(void); -void WCMD_more (WCHAR *); +RETURN_CODE WCMD_more(WCHAR *); RETURN_CODE WCMD_move (void); WCHAR* WINAPIV WCMD_format_string (const WCHAR *format, ...); void WINAPIV WCMD_output (const WCHAR *format, ...); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 4aa5a992218..27723347966 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1925,7 +1925,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_assoc(parms_start, FALSE); break; case WCMD_MORE: - WCMD_more(parms_start); + return_code = WCMD_more(parms_start); break; case WCMD_CHOICE: return_code = WCMD_choice(parms_start);
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 7 +++++-- programs/cmd/tests/test_builtins.cmd.exp | 2 +- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 368722ee1f0..bd0d94f00e8 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -2087,8 +2087,9 @@ RETURN_CODE WCMD_move(void) * Suspend execution of a batch script until a key is typed */
-void WCMD_pause (void) +RETURN_CODE WCMD_pause(void) { + RETURN_CODE return_code = NO_ERROR; DWORD oldmode; BOOL have_console; DWORD count; @@ -2100,9 +2101,11 @@ void WCMD_pause (void) SetConsoleMode(hIn, 0);
WCMD_output_asis(anykey); - WCMD_ReadFile(hIn, &key, 1, &count); + if (!WCMD_ReadFile(hIn, &key, 1, &count) || !count) + return_code = ERROR_INVALID_FUNCTION; if (have_console) SetConsoleMode(hIn, oldmode); + return return_code; }
/**************************************************************************** diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 18a7fecbcb7..4b162af9a8e 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -619,7 +619,7 @@ foo@space@
SUCCESS 0 --- success/failure for PAUSE command -@todo_wine@FAILURE 1 +FAILURE 1 --- ------------ Testing 'set' ------------ 1 diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 181e3ed1c2e..6c76070338c 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -188,7 +188,7 @@ void WINAPIV WCMD_output (const WCHAR *format, ...); void WINAPIV WCMD_output_stderr (const WCHAR *format, ...); void WCMD_output_asis (const WCHAR *message); void WCMD_output_asis_stderr (const WCHAR *message); -void WCMD_pause (void); +RETURN_CODE WCMD_pause(void); RETURN_CODE WCMD_popd(void); void WCMD_print_error (void); RETURN_CODE WCMD_pushd(const WCHAR *args); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 27723347966..8380207e5d2 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1861,7 +1861,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_setshow_path(parms_start); break; case WCMD_PAUSE: - WCMD_pause (); + return_code = WCMD_pause(); break; case WCMD_PROMPT: return_code = WCMD_setshow_prompt();