Module: wine Branch: master Commit: a810e41e47172f0929cce27c60147e2b72e5ba83 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a810e41e47172f0929cce27c60...
Author: Jason Edmeades jason@edmeades.me.uk Date: Tue Sep 25 22:05:03 2012 +0100
cmd: Echo back command with whitespace removed first.
---
programs/cmd/tests/test_builtins.cmd | 5 +++++ programs/cmd/tests/test_builtins.cmd.exp | 9 +++++++-- programs/cmd/wcmdmain.c | 17 ++++++++++++----- 3 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index 7c4b37f..d3bdf04 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -30,6 +30,9 @@ echo @tab@ on @space@
@echo off echo off@tab@@space@ +@echo noecho1 + @echo noecho2 +@@@@@echo echo3 echo ------------ Testing 'echo' [OFF] ------------ echo word echo 'singlequotedword' @@ -324,6 +327,8 @@ set VAR= echo ------------ Testing variable substitution ------------ echo --- in FOR variables for %%i in ("A B" C) do echo %%i +rem check works when prefix with @ +@for %%i in ("A B" C) do echo %%i rem quotes removal for %%i in ("A B" C) do echo '%%~i' rem fully qualified path diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 2888ffc..d2938ce 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -51,7 +51,7 @@ word@space@ @pwd@>echo word@space@@space@@space@ word@space@@space@
-@todo_wine@@pwd@>echo word@space@ +@pwd@>echo word@space@ word
@pwd@>echo@tab@word@space@ @@ -63,7 +63,7 @@ word@space@@tab@ @pwd@>echo@tab@word@tab@@space@@space@ word@tab@@space@
-@todo_wine@@pwd@>echo word@space@ +@pwd@>echo word@space@ word
@pwd@>echo@space@@tab@word@space@ @@ -76,6 +76,9 @@ word @tab@word
@pwd@>echo @tab@ on @space@@space@ +noecho1 +noecho2 +echo3 ------------ Testing 'echo' [OFF] ------------ word 'singlequotedword' @@ -282,6 +285,8 @@ r@or_broken@qwerty --- in FOR variables "A B" C +"A B" +C 'A B'@or_broken@'' 'C'@or_broken@'' @pwd@\C D@or_broken@%~ff diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index b095deb..c0d4925 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1819,27 +1819,34 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE
/* Replace env vars if in a batch context */ if (context) handleExpansion(extraSpace, FALSE, NULL, NULL); + + /* Skip preceeding whitespace */ + while (*curPos == ' ' || *curPos == '\t') curPos++; + /* Show prompt before batch line IF echo is on and in batch program */ - if (context && echo_mode && extraSpace[0] && (extraSpace[0] != '@')) { + if (context && echo_mode && *curPos && (*curPos != '@')) { static const WCHAR echoDot[] = {'e','c','h','o','.'}; static const WCHAR echoCol[] = {'e','c','h','o',':'}; const DWORD len = sizeof(echoDot)/sizeof(echoDot[0]); - DWORD curr_size = strlenW(extraSpace); + DWORD curr_size = strlenW(curPos); DWORD min_len = (curr_size < len ? curr_size : len); WCMD_show_prompt(); - WCMD_output_asis(extraSpace); + WCMD_output_asis(curPos); /* I don't know why Windows puts a space here but it does */ /* Except for lines starting with 'echo.' or 'echo:'. Ask MS why */ if (CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, - extraSpace, min_len, echoDot, len) != CSTR_EQUAL + curPos, min_len, echoDot, len) != CSTR_EQUAL && CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, - extraSpace, min_len, echoCol, len) != CSTR_EQUAL) + curPos, min_len, echoCol, len) != CSTR_EQUAL) { WCMD_output_asis(spaceW); } WCMD_output_asis(newlineW); }
+ /* Skip repeated 'no echo' characters */ + while (*curPos == '@') curPos++; + /* Start with an empty string, copying to the command string */ curStringLen = 0; curRedirsLen = 0;