Commit 141e33b8 authored by Jason Edmeades's avatar Jason Edmeades Committed by Alexandre Julliard

cmd: More generic zero iteration for loop fix.

parent 4f71f4af
...@@ -1084,6 +1084,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) { ...@@ -1084,6 +1084,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
BOOL expandDirs = FALSE; BOOL expandDirs = FALSE;
BOOL useNumbers = FALSE; BOOL useNumbers = FALSE;
BOOL doFileset = FALSE; BOOL doFileset = FALSE;
BOOL doExecuted = FALSE; /* Has the 'do' part been executed */
LONG numbers[3] = {0,0,0}; /* Defaults to 0 in native */ LONG numbers[3] = {0,0,0}; /* Defaults to 0 in native */
int itemNum; int itemNum;
CMD_LIST *thisCmdStart; CMD_LIST *thisCmdStart;
...@@ -1233,6 +1234,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) { ...@@ -1233,6 +1234,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
{ {
thisCmdStart = cmdStart; thisCmdStart = cmdStart;
WINE_TRACE("Processing FOR filename %s\n", wine_dbgstr_w(fd.cFileName)); WINE_TRACE("Processing FOR filename %s\n", wine_dbgstr_w(fd.cFileName));
doExecuted = TRUE;
WCMD_part_execute (&thisCmdStart, firstCmd, variable, WCMD_part_execute (&thisCmdStart, firstCmd, variable,
fd.cFileName, FALSE, TRUE); fd.cFileName, FALSE, TRUE);
} }
...@@ -1241,6 +1243,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) { ...@@ -1241,6 +1243,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
FindClose (hff); FindClose (hff);
} }
} else { } else {
doExecuted = TRUE;
WCMD_part_execute(&thisCmdStart, firstCmd, variable, item, FALSE, TRUE); WCMD_part_execute(&thisCmdStart, firstCmd, variable, item, FALSE, TRUE);
} }
...@@ -1310,6 +1313,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) { ...@@ -1310,6 +1313,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
/* FIXME: The following should be moved into its own routine and /* FIXME: The following should be moved into its own routine and
reused for the string literal parsing below */ reused for the string literal parsing below */
thisCmdStart = cmdStart; thisCmdStart = cmdStart;
doExecuted = TRUE;
WCMD_part_execute(&thisCmdStart, firstCmd, variable, parm, FALSE, TRUE); WCMD_part_execute(&thisCmdStart, firstCmd, variable, parm, FALSE, TRUE);
cmdEnd = thisCmdStart; cmdEnd = thisCmdStart;
} }
...@@ -1340,6 +1344,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) { ...@@ -1340,6 +1344,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
/* FIXME: The following should be moved into its own routine and /* FIXME: The following should be moved into its own routine and
reused for the string literal parsing below */ reused for the string literal parsing below */
thisCmdStart = cmdStart; thisCmdStart = cmdStart;
doExecuted = TRUE;
WCMD_part_execute(&thisCmdStart, firstCmd, variable, parm, FALSE, TRUE); WCMD_part_execute(&thisCmdStart, firstCmd, variable, parm, FALSE, TRUE);
cmdEnd = thisCmdStart; cmdEnd = thisCmdStart;
} }
...@@ -1369,17 +1374,23 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) { ...@@ -1369,17 +1374,23 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
WINE_TRACE("Processing FOR number %s\n", wine_dbgstr_w(thisNum)); WINE_TRACE("Processing FOR number %s\n", wine_dbgstr_w(thisNum));
thisCmdStart = cmdStart; thisCmdStart = cmdStart;
doExecuted = TRUE;
WCMD_part_execute(&thisCmdStart, firstCmd, variable, thisNum, FALSE, TRUE); WCMD_part_execute(&thisCmdStart, firstCmd, variable, thisNum, FALSE, TRUE);
} }
/* Now skip over the subsequent commands if we did not perform the for loop */
if (thisCmdStart == cmdStart) {
WINE_TRACE("Skipping for loop commands due to no valid iterations\n");
WCMD_part_execute(&thisCmdStart, firstCmd, variable, thisNum, FALSE, FALSE);
}
cmdEnd = thisCmdStart; cmdEnd = thisCmdStart;
} }
/* Now skip over the do part if we did not perform the for loop so far.
We store in cmdEnd the next command after the do block, but we only
know this if something was run. If it has not been, we need to calculate
it. */
if (!doExecuted) {
thisCmdStart = cmdStart;
WINE_TRACE("Skipping for loop commands due to no valid iterations\n");
WCMD_part_execute(&thisCmdStart, firstCmd, NULL, NULL, FALSE, FALSE);
cmdEnd = thisCmdStart;
}
/* When the loop ends, either something like a GOTO or EXIT /b has terminated /* When the loop ends, either something like a GOTO or EXIT /b has terminated
all processing, OR it should be pointing to the end of && processing OR all processing, OR it should be pointing to the end of && processing OR
it should be pointing at the NULL end of bracket for the DO. The return it should be pointing at the NULL end of bracket for the DO. The return
......
...@@ -643,9 +643,27 @@ echo > bazbaz ...@@ -643,9 +643,27 @@ echo > bazbaz
echo --- basic wildcards echo --- basic wildcards
for %%i in (ba*) do echo %%i for %%i in (ba*) do echo %%i
echo --- for /d echo --- for /d
for /d %%i in (baz foo bar) do echo %%i for /d %%i in (baz foo bar) do echo %%i 2>&1
rem FIXME for /d incorrectly parses when wildcards are used rem Confirm we dont match files:
rem for /d %%i in (bazb*) do echo %%i for /d %%i in (bazb*) do echo %%i 2>&1
for /d %%i in (bazb2*) do echo %%i 2>&1
rem Show we pass through non wildcards
for /d %%i in (PASSED) do echo %%i
for /d %%i in (xxx) do (
echo %%i - Should be xxx
echo Expected second line
)
rem Show we issue no messages on failures
for /d %%i in (FAILED?) do echo %%i 2>&1
for /d %%i in (FAILED?) do (
echo %%i - Unexpected!
echo FAILED Unexpected second line
)
for /d %%i in (FAILED*) do echo %%i 2>&1
for /d %%i in (FAILED*) do (
echo %%i - Unexpected!
echo FAILED Unexpected second line
)
rem FIXME can't test wildcard expansion here since it's listed in directory rem FIXME can't test wildcard expansion here since it's listed in directory
rem order, and not in alphabetic order. rem order, and not in alphabetic order.
rem Proper testing would need a currently missing "sort" program implementation. rem Proper testing would need a currently missing "sort" program implementation.
......
...@@ -455,9 +455,12 @@ C ...@@ -455,9 +455,12 @@ C
--- basic wildcards --- basic wildcards
bazbaz bazbaz
--- for /d --- for /d
baz baz@space@
foo foo@space@
bar bar@space@
PASSED
xxx - Should be xxx
Expected second line
--- for /L --- for /L
1 1
3 3
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment