[6/8] cmd: Fix if/else tab handling
Frédéric Delanoy
frederic.delanoy at gmail.com
Tue Aug 23 15:54:54 CDT 2011
---
programs/cmd/builtins.c | 11 +++++++----
programs/cmd/tests/test_builtins.cmd | 7 +++++++
programs/cmd/tests/test_builtins.cmd.exp | 7 +++++++
programs/cmd/wcmdmain.c | 14 ++++++++++----
4 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index 7aaa900..2c19877 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -1256,7 +1256,8 @@ static void WCMD_part_execute(CMD_LIST **cmdList, const WCHAR *firstcmd,
if (isIF) processThese = conditionTRUE;
while (*cmdList) {
- const WCHAR ifElse[] = {'e','l','s','e',' ','\0'};
+ const WCHAR ifElse[] = {'e','l','s','e',' ','\0'};
+ const WCHAR ifElseTab[] = {'e','l','s','e','\t','\0'};
/* execute all appropriate commands */
curPosition = *cmdList;
@@ -1286,9 +1287,11 @@ static void WCMD_part_execute(CMD_LIST **cmdList, const WCHAR *firstcmd,
/* End of the command - does 'ELSE ' follow as the next command? */
} else {
- if (isIF && CompareStringW(LOCALE_USER_DEFAULT,
- NORM_IGNORECASE | SORT_STRINGSORT,
- (*cmdList)->command, 5, ifElse, -1) == CSTR_EQUAL) {
+ if (isIF
+ && (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT,
+ (*cmdList)->command, 5, ifElse, -1) == CSTR_EQUAL
+ || CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT,
+ (*cmdList)->command, 5, ifElseTab, -1) == CSTR_EQUAL)) {
/* Swap between if and else processing */
processThese = !processThese;
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd
index cd46dbd..cc083d2 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -391,6 +391,13 @@ if /i foo==FOO echo if /i seems to work
if /i not foo==FOO echo if /i seems to be broken
if /I foo==FOO echo if /I seems to work
if /I not foo==FOO echo if /I seems to be broken
+if at tab@1==1 echo doom
+if @tab at 1==1 echo doom
+if 1==1 (echo doom) else at tab@echo quake
+if at tab@not @tab at 1==@tab at 0 @tab at echo lol
+if 1==0 at tab@(echo doom) else echo quake
+if 1==0 (echo doom)@tab at else echo quake
+if 1==0 (echo doom) else at tab@echo quake
echo -----------Testing for -----------
echo ...plain FOR
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index dafb6a3..535ef44 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -271,6 +271,13 @@ Testing case sensitivity with and without /i option
if seems to default to case sensitivity
if /i seems to work
if /I seems to work
+doom
+doom
+doom
+lol
+quake
+quake
+quake
-----------Testing for -----------
...plain FOR
A
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index 8a3189c..bc51d83 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -1745,8 +1745,10 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE
const WCHAR remTabCmd[] = {'r','e','m','\t','\0'};
const WCHAR forCmd[] = {'f','o','r',' ' ,'\0'};
const WCHAR forTabCmd[] = {'f','o','r','\t','\0'};
- const WCHAR ifCmd[] = {'i','f',' ','\0'};
- const WCHAR ifElse[] = {'e','l','s','e',' ','\0'};
+ const WCHAR ifCmd[] = {'i','f',' ' ,'\0'};
+ const WCHAR ifTabCmd[] = {'i','f','\t','\0'};
+ const WCHAR ifElse[] = {'e','l','s','e',' ' ,'\0'};
+ const WCHAR ifElseTab[] = {'e','l','s','e','\t','\0'};
BOOL inRem = FALSE;
BOOL inFor = FALSE;
BOOL inIn = FALSE;
@@ -1852,11 +1854,15 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE
echo they equal
)" will be parsed wrong */
} else if (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT,
- curPos, 3, ifCmd, -1) == CSTR_EQUAL) {
+ curPos, 3, ifCmd, -1) == CSTR_EQUAL
+ || CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT,
+ curPos, 3, ifTabCmd, -1) == CSTR_EQUAL) {
inIf = TRUE;
} else if (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT,
- curPos, 5, ifElse, -1) == CSTR_EQUAL) {
+ curPos, 5, ifElse, -1) == CSTR_EQUAL
+ || CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT,
+ curPos, 5, ifElseTab, -1) == CSTR_EQUAL) {
inElse = TRUE;
lastWasElse = TRUE;
onlyWhiteSpace = TRUE;
--
1.7.6
More information about the wine-patches
mailing list