[6/8] cmd: Fix if/else tab handling (try 2)

Frédéric Delanoy frederic.delanoy at gmail.com
Wed Aug 24 17:06:07 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                  |   19 +++++++++----------
 4 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index 7cc6520..5e405d5 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -1250,7 +1250,7 @@ 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'};
 
       /* execute all appropriate commands */
       curPosition = *cmdList;
@@ -1280,16 +1280,17 @@ 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
+            && WCMD_keyword_ws_found(ifElse, sizeof(ifElse)/sizeof(ifElse[0]),
+                                     (*cmdList)->command)) {
 
           /* Swap between if and else processing */
           processThese = !processThese;
 
           /* Process the ELSE part */
           if (processThese) {
-            WCHAR *cmd = ((*cmdList)->command) + strlenW(ifElse);
+            const int keyw_len = sizeof(ifElse)/sizeof(ifElse[0]) + 1;
+            WCHAR *cmd = ((*cmdList)->command) + keyw_len;
 
             /* Skip leading whitespace between condition and the command */
             while (*cmd && (*cmd==' ' || *cmd=='\t')) cmd++;
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 3efabfa..63e8c16 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -1755,8 +1755,8 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE
     static WCHAR    *extraSpace = NULL;  /* Deliberately never freed */
     const WCHAR remCmd[] = {'r','e','m'};
     const WCHAR forCmd[] = {'f','o','r'};
-    const WCHAR ifCmd[]  = {'i','f',' ','\0'};
-    const WCHAR ifElse[] = {'e','l','s','e',' ','\0'};
+    const WCHAR ifCmd[]  = {'i','f'};
+    const WCHAR ifElse[] = {'e','l','s','e'};
     BOOL      inRem = FALSE;
     BOOL      inFor = FALSE;
     BOOL      inIn  = FALSE;
@@ -1847,24 +1847,23 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE
         } else if (WCMD_keyword_ws_found(forCmd, sizeof(forCmd)/sizeof(forCmd[0]), curPos)) {
           inFor = TRUE;
 
-        /* If command starts with 'if' or 'else', handle ('s mid line. We should ensure this
+        /* If command starts with 'if ' or 'else ', handle ('s mid line. We should ensure this
            is only true in the command portion of the IF statement, but this
            should suffice for now
             FIXME: Silly syntax like "if 1(==1( (
                                         echo they equal
                                       )" will be parsed wrong */
-        } else if (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT,
-          curPos, 3, ifCmd, -1) == CSTR_EQUAL) {
+        } else if (WCMD_keyword_ws_found(ifCmd, sizeof(ifCmd)/sizeof(ifCmd[0]), curPos)) {
           inIf = TRUE;
 
-        } else if (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT,
-          curPos, 5, ifElse, -1) == CSTR_EQUAL) {
+        } else if (WCMD_keyword_ws_found(ifElse, sizeof(ifElse)/sizeof(ifElse[0]), curPos)) {
+          const int keyw_len = sizeof(ifElse)/sizeof(ifElse[0]) + 1;
           inElse = TRUE;
           lastWasElse = TRUE;
           onlyWhiteSpace = TRUE;
-          memcpy(&curCopyTo[*curLen], curPos, 5*sizeof(WCHAR));
-          (*curLen)+=5;
-          curPos+=5;
+          memcpy(&curCopyTo[*curLen], curPos, keyw_len*sizeof(WCHAR));
+          (*curLen)+=keyw_len;
+          curPos+=keyw_len;
           continue;
 
         /* In a for loop, the DO command will follow a close bracket followed by
-- 
1.7.6




More information about the wine-patches mailing list