Jason Edmeades : cmd: Fix 'for' expansion of wildcards when no args are supplied.

Alexandre Julliard julliard at winehq.org
Wed Jun 5 13:47:02 CDT 2013


Module: wine
Branch: master
Commit: a5b1172e90de94234b2799d26ccc36a752bdd7eb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a5b1172e90de94234b2799d26ccc36a752bdd7eb

Author: Jason Edmeades <jason at edmeades.me.uk>
Date:   Tue Jun  4 00:29:51 2013 +0100

cmd: Fix 'for' expansion of wildcards when no args are supplied.

---

 programs/cmd/builtins.c                  |    8 ++++++--
 programs/cmd/tests/test_builtins.cmd     |   17 ++++++++++++++++-
 programs/cmd/tests/test_builtins.cmd.exp |   12 ++++++++++++
 3 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index c2ccdc8..aa1e7d4 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -2237,6 +2237,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
 
         if (!useNumbers && !doFileset) {
             WCHAR fullitem[MAX_PATH];
+            int prefixlen = 0;
 
             /* Now build the item to use / search for in the specified directory,
                as it is fully qualified in the /R case */
@@ -2245,11 +2246,12 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
               strcatW(fullitem, slashW);
               strcatW(fullitem, item);
             } else {
+              WCHAR *prefix = strrchrW(item, '\\');
+              if (prefix) prefixlen = (prefix - item) + 1;
               strcpyW(fullitem, item);
             }
 
             if (strpbrkW (fullitem, wildcards)) {
-
               hff = FindFirstFileW(fullitem, &fd);
               if (hff != INVALID_HANDLE_VALUE) {
                 do {
@@ -2270,7 +2272,9 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
                           strcatW(fullitem, slashW);
                           strcatW(fullitem, fd.cFileName);
                       } else {
-                          strcpyW(fullitem, fd.cFileName);
+                          if (prefixlen) lstrcpynW(fullitem, item, prefixlen + 1);
+                          fullitem[prefixlen] = 0x00;
+                          strcatW(fullitem, fd.cFileName);
                       }
                       doExecuted = TRUE;
 
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd
index 48a8362..78f7cdc 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -1017,7 +1017,22 @@ for /R %%i in (baz* fred* jim) do call temp.bat %%i
 call :ValidateExpected
 
 echo for /R passed
-cd .. & rd /s/Q foobar
+echo --- Complex wildcards unix and windows slash
+cd ..
+echo Windows slashs, valid path
+for %%f in (foobar\baz\bazbaz) do echo ASIS: %%f
+for %%f in (foobar\baz\*) do echo WC  : %%f
+echo Windows slashs, invalid path
+for %%f in (foobar\jim\bazbaz) do echo ASIS: %%f
+for %%f in (foobar\jim\*) do echo WC  : %%f
+echo Unix slashs, valid path
+for %%f in (foobar/baz/bazbaz) do echo ASIS: %%f
+for %%f in (foobar/baz/*) do echo WC  : %%f
+echo Unix slashs, invalid path
+for %%f in (foobar/jim/bazbaz) do echo ASIS: %%f
+for %%f in (foobar/jim/*) do echo WC  : %%f
+echo Done
+rd /s/Q foobar
 echo --- for /L
 rem Some cases loop forever writing 0s, like e.g. (1,0,1), (1,a,3) or (a,b,c); those can't be tested here
 for /L %%i in (1,2,0) do echo %%i
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index 77e4178..7380185 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -691,6 +691,18 @@ Mixed enumeration from provided root
 With duplicates enumeration
 Strip missing wildcards, keep unwildcarded names
 for /R passed
+--- Complex wildcards unix and windows slash
+Windows slashs, valid path
+ASIS: foobar\baz\bazbaz
+WC  : foobar\baz\bazbaz
+Windows slashs, invalid path
+ASIS: foobar\jim\bazbaz
+Unix slashs, valid path
+ASIS: foobar/baz/bazbaz
+WC  : bazbaz
+Unix slashs, invalid path
+ASIS: foobar/jim/bazbaz
+Done
 --- for /L
 1
 3




More information about the wine-cvs mailing list