[PATCH 2/8] [cmd] Refactor building a list of directories out of WCMD_for

Ann and Jason Edmeades jason at edmeades.me.uk
Tue Oct 23 16:19:49 CDT 2012


Refactor code used in building a list of subdirectories still to
recurse (used in for /r) out of main line WCMD_for.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20121023/b37c236f/attachment-0001.html>
-------------- next part --------------
From 72d8ec2286f9c81ca0bc6b2531c1d9f4ff0797c7 Mon Sep 17 00:00:00 2001
From: Jason Edmeades <jason at edmeades.me.uk>
Date: Mon, 22 Oct 2012 00:10:10 +0100
Subject: [PATCH 2/8] [cmd] Refactor building a list of directories out of
 WCMD_for

Refactor code used in building a list of subdirectories still to
recurse (used in for /r) out of main line WCMD_for.
---
 programs/cmd/builtins.c |   89 ++++++++++++++++++++++++++++-------------------
 1 file changed, 53 insertions(+), 36 deletions(-)

diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index 7bafd9e..f706dff 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -1624,6 +1624,58 @@ static BOOL WCMD_parse_forf_options(WCHAR *options, WCHAR *eol, int *skip,
   return TRUE;
 }
 
+/*****************************************************************************
+ * WCMD_add_dirstowalk
+ *
+ * When recursing through directories (for /r), we need to add to the list of
+ * directories still to walk, any subdirectories of the one we are processing.
+ *
+ * Parameters
+ *  options    [I] The remaining list of directories still to process
+ *
+ * Note this routine inserts the subdirectories found between the entry being
+ * processed, and any other directory still to be processed, mimicing what
+ * Windows does
+ */
+static void WCMD_add_dirstowalk(DIRECTORY_STACK *dirsToWalk) {
+  DIRECTORY_STACK *remainingDirs = dirsToWalk;
+  WCHAR fullitem[MAX_PATH];
+  WIN32_FIND_DATAW fd;
+  HANDLE hff;
+
+  /* Build a generic search and add all directories on the list of directories
+     still to walk                                                             */
+  strcpyW(fullitem, dirsToWalk->dirName);
+  strcatW(fullitem, slashstarW);
+  hff = FindFirstFileW(fullitem, &fd);
+  if (hff != INVALID_HANDLE_VALUE) {
+    do {
+      WINE_TRACE("Looking for subdirectories\n");
+      if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
+          (strcmpW(fd.cFileName, dotdotW) != 0) &&
+          (strcmpW(fd.cFileName, dotW) != 0))
+      {
+        /* Allocate memory, add to list */
+        DIRECTORY_STACK *toWalk = HeapAlloc(GetProcessHeap(), 0, sizeof(DIRECTORY_STACK));
+        WINE_TRACE("(%p->%p)\n", remainingDirs, remainingDirs->next);
+        toWalk->next = remainingDirs->next;
+        remainingDirs->next = toWalk;
+        remainingDirs = toWalk;
+        toWalk->dirName = HeapAlloc(GetProcessHeap(), 0,
+                                    sizeof(WCHAR) *
+                                    (strlenW(dirsToWalk->dirName) + 2 + strlenW(fd.cFileName)));
+        strcpyW(toWalk->dirName, dirsToWalk->dirName);
+        strcatW(toWalk->dirName, slashW);
+        strcatW(toWalk->dirName, fd.cFileName);
+        WINE_TRACE("Added to stack %s (%p->%p)\n", wine_dbgstr_w(toWalk->dirName),
+                   toWalk, toWalk->next);
+      }
+    } while (FindNextFileW(hff, &fd) != 0);
+    WINE_TRACE("Finished adding all subdirectories\n");
+    FindClose (hff);
+  }
+}
+
 /**************************************************************************
  * WCMD_for
  *
@@ -1779,7 +1831,6 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
   /* Loop repeatedly per-directory we are potentially walking, when in for /r
      mode, or once for the rest of the time.                                  */
   do {
-    WCHAR fullitem[MAX_PATH];
 
     /* Save away the starting position for the commands (and offset for the
        first one)                                                           */
@@ -1789,41 +1840,7 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
 
     /* If we are recursing directories (ie /R), add all sub directories now, then
        prefix the root when searching for the item */
-    if (dirsToWalk) {
-      DIRECTORY_STACK *remainingDirs = dirsToWalk;
-
-      /* Build a generic search and add all directories on the list of directories
-         still to walk                                                             */
-      strcpyW(fullitem, dirsToWalk->dirName);
-      strcatW(fullitem, slashstarW);
-      hff = FindFirstFileW(fullitem, &fd);
-      if (hff != INVALID_HANDLE_VALUE) {
-        do {
-          WINE_TRACE("Looking for subdirectories\n");
-          if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
-              (strcmpW(fd.cFileName, dotdotW) != 0) &&
-              (strcmpW(fd.cFileName, dotW) != 0))
-          {
-            /* Allocate memory, add to list */
-            DIRECTORY_STACK *toWalk = HeapAlloc(GetProcessHeap(), 0, sizeof(DIRECTORY_STACK));
-            WINE_TRACE("(%p->%p)\n", remainingDirs, remainingDirs->next);
-            toWalk->next = remainingDirs->next;
-            remainingDirs->next = toWalk;
-            remainingDirs = toWalk;
-            toWalk->dirName = HeapAlloc(GetProcessHeap(), 0,
-                                        sizeof(WCHAR) *
-                                        (strlenW(dirsToWalk->dirName) + 2 + strlenW(fd.cFileName)));
-            strcpyW(toWalk->dirName, dirsToWalk->dirName);
-            strcatW(toWalk->dirName, slashW);
-            strcatW(toWalk->dirName, fd.cFileName);
-            WINE_TRACE("Added to stack %s (%p->%p)\n", wine_dbgstr_w(toWalk->dirName),
-                       toWalk, toWalk->next);
-          }
-        } while (FindNextFileW(hff, &fd) != 0);
-        WINE_TRACE("Finished adding all subdirectories\n");
-        FindClose (hff);
-      }
-    }
+    if (dirsToWalk) WCMD_add_dirstowalk(dirsToWalk);
 
     thisSet = setStart;
     /* Loop through all set entries */
-- 
1.7.9.5


More information about the wine-patches mailing list