[PATCH 1/2] [cmd] for loops do not respect boundaries

Ann and Jason Edmeades jason at edmeades.me.uk
Sun Sep 2 17:43:52 CDT 2012


for /L loops do not respect the boundaries and terminate early.

[BUG 27894, part 1]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20120902/238a7b01/attachment.html>
-------------- next part --------------
From bdcae9efae9f61bcce1c4e2c22ee9643fd5bfcab Mon Sep 17 00:00:00 2001
From: Jason Edmeades <us at edmeades.me.uk>
Date: Sun, 2 Sep 2012 22:08:57 +0100
Subject: [PATCH 1/2] [cmd] for loops do not respect boundaries

for /L loops do not respect the boundaries and terminate early.

[BUG 27894, part 1]
---
 programs/cmd/builtins.c                  |    2 +-
 programs/cmd/tests/test_builtins.cmd     |   18 ++++++++++++------
 programs/cmd/tests/test_builtins.cmd.exp |   19 +++++++++++++++++++
 3 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index ebb1c80..e28ff10 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -1364,7 +1364,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
       WINE_TRACE("FOR /L provided range from %d to %d step %d\n",
                  numbers[0], numbers[2], numbers[1]);
       for (i=numbers[0];
-           (numbers[1]<0)? i>numbers[2] : i<numbers[2];
+           (numbers[1]<0)? i>=numbers[2] : i<=numbers[2];
            i=i + numbers[1]) {
 
           sprintfW(thisNum, fmt, i);
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd
index 6295f9e..4856578 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -673,12 +673,18 @@ for /L %%i in (1,2,a) do echo %%i
 echo ErrorLevel %ErrorLevel%
 for /L %%i in (1,a,b) do echo %%i
 echo ErrorLevel %ErrorLevel%
-rem FIXME: following test cases cannot be currently tested due to an inconsistent/buggy 'for /L' parsing.
-rem for /L %%i in (a,2,b) do echo %%i
-rem for /L %%i in (1,1,1) do echo %%i
-rem for /L %%i in (1,-2,-1) do echo %%i
-rem for /L %%i in (-1,-1,-1) do echo %%i
-rem for /L %%i in (1,2, 3) do echo %%i
+rem Test boundaries
+for /l %%i in (1,1,4) do echo %%i
+for /l %%i in (1,2,4) do echo %%i
+for /l %%i in (4,-1,1) do echo %%i
+for /l %%i in (4,-2,1) do echo %%i
+for /l %%i in (1,-1,4) do echo %%i
+for /l %%i in (4,1,1) do echo %%i
+for /L %%i in (a,2,b) do echo %%i
+for /L %%i in (1,1,1) do echo %%i
+for /L %%i in (1,-2,-1) do echo %%i
+for /L %%i in (-1,-1,-1) do echo %%i
+for /L %%i in (1,2, 3) do echo %%i
 echo --- for /a
 rem No output when using "set expr" syntax, unless in interactive mode
 rem Need to use "set envvar=expr" to use in a batch script
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index bb75515..0011d35 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -471,6 +471,25 @@ bar
 -1
 @todo_wine at ErrorLevel 0
 @todo_wine at ErrorLevel 0
+1
+2
+3
+4
+1
+3
+4
+3
+2
+1
+4
+2
+0
+1
+1
+-1
+-1
+1
+3
 --- for /a
 ------ individual operations
 0
-- 
1.7.5.4


More information about the wine-patches mailing list