- added a @more@ keyword to detect the 'More?' localized string (first occurence is stored, when all subsequent occurences are compared against the stored value) - some basic tests
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- programs/cmd/tests/batch.c | 47 +++++++++++++++++++++++ programs/cmd/tests/interactive_builtins.cmd | 24 ++++++++++++ programs/cmd/tests/interactive_builtins.cmd.exp | 36 ++++++++++++++++++ programs/cmd/wcmdmain.c | 7 +++ 4 files changed, 114 insertions(+)
diff --git a/programs/cmd/tests/batch.c b/programs/cmd/tests/batch.c index 0d6832df30f..bcaeb0190ac 100644 --- a/programs/cmd/tests/batch.c +++ b/programs/cmd/tests/batch.c @@ -30,6 +30,8 @@ static char path[MAX_PATH]; static DWORD path_len; static char shortpath[MAX_PATH]; static DWORD shortpath_len; +static char more[MAX_PATH]; +static DWORD more_len;
/* Convert to DOS line endings, and substitute escaped whitespace chars with real ones */ static const char* convert_input_data(const char *data, DWORD size, DWORD *new_size) @@ -164,6 +166,31 @@ static DWORD map_file(const char *file_name, const char **ret) return size; }
+static const char *compare_line(const char *out_line, const char *out_end, const char *exp_line, + const char *exp_end); + +static BOOL guess_string(const char *out_ptr, const char *out_end, + const char *exp_ptr, const char *exp_end, + char* storage, DWORD* storage_len) +{ + /* as some output depends on locale (like 'More? ', 'Are you sure (Y|N)? '...), try to guess its value from first input */ + const char* out_try = out_ptr; + if (exp_ptr == exp_end) + { + *storage_len = min(out_end - out_ptr, MAX_PATH); + memcpy(storage, out_ptr, *storage_len); + return TRUE; + } + while (out_try < out_end) + { + storage[(*storage_len)++] = *out_try++; + if (compare_line(out_try, out_end, exp_ptr, exp_end) == NULL) + return TRUE; + } + *storage_len = 0; + return FALSE; +} + static const char *compare_line(const char *out_line, const char *out_end, const char *exp_line, const char *exp_end) { @@ -174,6 +201,7 @@ static const char *compare_line(const char *out_line, const char *out_end, const static const char drive_cmd[] = {'@','d','r','i','v','e','@'}; static const char path_cmd[] = {'@','p','a','t','h','@'}; static const char shortpath_cmd[] = {'@','s','h','o','r','t','p','a','t','h','@'}; + static const char more_cmd[] = {'@','m','o','r','e','@'}; 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','@'}; @@ -225,6 +253,25 @@ static const char *compare_line(const char *out_line, const char *out_end, const out_ptr += shortpath_len; continue; } + } else if(exp_ptr+sizeof(more_cmd) <= exp_end + && !memcmp(exp_ptr, more_cmd, sizeof(more_cmd))) { + exp_ptr += sizeof(more_cmd); + if (!more_len) + { + if (guess_string(out_ptr, out_end, exp_ptr, exp_end, more, &more_len)) + { + trace("match @more@ with [%.*s]\n", more_len, more); + return NULL; + } + err = out_ptr; + }else if(out_end-out_ptr < more_len + || (CompareStringA(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, + out_ptr, more_len, more, more_len) != CSTR_EQUAL)) { + err = out_ptr; + }else { + out_ptr += more_len; + continue; + } }else if(exp_ptr+sizeof(space_cmd) <= exp_end && !memcmp(exp_ptr, space_cmd, sizeof(space_cmd))) { exp_ptr += sizeof(space_cmd); diff --git a/programs/cmd/tests/interactive_builtins.cmd b/programs/cmd/tests/interactive_builtins.cmd index d1e308f159a..f5ab45d7bb1 100644 --- a/programs/cmd/tests/interactive_builtins.cmd +++ b/programs/cmd/tests/interactive_builtins.cmd @@ -1,8 +1,32 @@ @echo --------- testing echo echo foo @echo foo +if exist c:\windows ( + echo bar +) +@if exist c:\windows ( + echo bar +) +if exist c:\windows ( + @echo bar +) +@if exist c:\windows ( + @echo bar +) echo off echo foo @echo foo +if exist c:\windows ( + echo bar +) +@if exist c:\windows ( + echo bar +) +if exist c:\windows ( + @echo bar +) +@if exist c:\windows ( + @echo bar +) echo --------- done exit 0 diff --git a/programs/cmd/tests/interactive_builtins.cmd.exp b/programs/cmd/tests/interactive_builtins.cmd.exp index 64482e85c04..4280ec186c9 100644 --- a/programs/cmd/tests/interactive_builtins.cmd.exp +++ b/programs/cmd/tests/interactive_builtins.cmd.exp @@ -7,11 +7,47 @@ foo @pwd@>@echo foo foo
+@pwd@>if exist c:\windows ( +@more@ echo bar +@more@) +bar + +@pwd@>@if exist c:\windows ( +@more@ echo bar +@more@) +bar + +@pwd@>if exist c:\windows ( +@more@ @echo bar +@more@) +bar + +@pwd@>@if exist c:\windows ( +@more@ @echo bar +@more@) +bar + @pwd@>echo off echo foo foo @echo foo foo +if exist c:\windows ( +@more@ echo bar +@more@) +bar +@if exist c:\windows ( +@more@ echo bar +@more@) +bar +if exist c:\windows ( +@more@ @echo bar +@more@) +bar +@if exist c:\windows ( +@more@ @echo bar +@more@) +bar echo --------- done --------- done exit 0 diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index ee863856ec9..286dc6b9ff0 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -2315,6 +2315,13 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE if (!WCMD_fgets(extraData, MAXSTRING, readFrom)) break;
+ /* echo input stream if naturally not echoed */ + if (!context && !optionalcmd && GetFileType(readFrom) != FILE_TYPE_CHAR) + { + WCMD_output_asis(extraData); + WCMD_output_asis(L"\r\n"); + } + /* Edge case for carets - a completely blank line (i.e. was just CRLF) is oddly added as an LF but then more data is received (but only once more!) */