[PATCH 8/8] XCOPY: Make displayed names mirror windows

Jason Edmeades us at edmeades.me.uk
Fri Mar 30 13:20:23 CDT 2007


This also fixes the EXCLUDE: file issue as to whether or
not to include the stem. Testing on windows shows the exclude
tests is exactly what gets displayed to the screen, and
hence it becomes important to show relative information
rather than full names where required.
---
 programs/xcopy/xcopy.c |   86 +++++++++++++++++++++++++++++++++--------------
 1 files changed, 60 insertions(+), 26 deletions(-)

diff --git a/programs/xcopy/xcopy.c b/programs/xcopy/xcopy.c
index 0de0b6f..9ca2e36 100644
--- a/programs/xcopy/xcopy.c
+++ b/programs/xcopy/xcopy.c
@@ -48,7 +48,8 @@
 WINE_DEFAULT_DEBUG_CHANNEL(xcopy);
 
 /* Prototypes */
-static int XCOPY_ProcessSourceParm(WCHAR *suppliedsource, WCHAR *stem, WCHAR *spec);
+static int XCOPY_ProcessSourceParm(WCHAR *suppliedsource, WCHAR *stem,
+                                   WCHAR *spec, DWORD flags);
 static int XCOPY_ProcessDestParm(WCHAR *supplieddestination, WCHAR *stem,
                                  WCHAR *spec, WCHAR *srcspec, DWORD flags);
 static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec,
@@ -255,7 +256,7 @@ int main (int argc, char *argv[])
     WINE_TRACE("Destination : '%s'\n", wine_dbgstr_w(supplieddestination));
 
     /* Extract required information from source specification */
-    rc = XCOPY_ProcessSourceParm(suppliedsource, sourcestem, sourcespec);
+    rc = XCOPY_ProcessSourceParm(suppliedsource, sourcestem, sourcespec, flags);
 
     /* Extract required information from destination specification */
     rc = XCOPY_ProcessDestParm(supplieddestination, destinationstem,
@@ -307,7 +308,8 @@ int main (int argc, char *argv[])
    XCOPY_ProcessSourceParm - Takes the supplied source parameter, and
      converts it into a stem and a filespec
    ========================================================================= */
-static int XCOPY_ProcessSourceParm(WCHAR *suppliedsource, WCHAR *stem, WCHAR *spec)
+static int XCOPY_ProcessSourceParm(WCHAR *suppliedsource, WCHAR *stem,
+                                   WCHAR *spec, DWORD flags)
 {
     WCHAR             actualsource[MAX_PATH];
     WCHAR            *starPos;
@@ -321,6 +323,11 @@ static int XCOPY_ProcessSourceParm(WCHAR *suppliedsource, WCHAR *stem, WCHAR *sp
         return RC_INITERROR;
     }
 
+    /* If full names required, convert to using the full path */
+    if (flags & OPT_FULL) {
+        lstrcpyW(suppliedsource, actualsource);
+    }
+
     /*
      * Work out the stem of the source
      */
@@ -329,9 +336,8 @@ static int XCOPY_ProcessSourceParm(WCHAR *suppliedsource, WCHAR *stem, WCHAR *sp
        file or a directory - in which case thats the stem of the search,
        otherwise split off the wildcards and use the higher level as the
        stem                                                              */
-    lstrcpyW(stem, actualsource);
-    starPos = wcschr(stem, '*');
-    questPos = wcschr(stem, '?');
+    starPos = wcschr(suppliedsource, '*');
+    questPos = wcschr(suppliedsource, '?');
     if (starPos || questPos) {
         WCHAR *lastDir;
 
@@ -353,22 +359,47 @@ static int XCOPY_ProcessSourceParm(WCHAR *suppliedsource, WCHAR *stem, WCHAR *sp
             XCOPY_FailMessage(GetLastError());
             return RC_INITERROR;
 
-        /* Directory: */
+        /* Directory:
+             stem should be exactly as supplied plus a '\', unless it was
+              eg. C: in which case no slash required */
         } else if (attribs & FILE_ATTRIBUTE_DIRECTORY) {
-            lstrcatW(stem, wchr_slash);
+            WCHAR lastChar;
+
+            WINE_TRACE("Directory supplied\n");
+            lstrcpyW(stem, suppliedsource);
+            lastChar = stem[lstrlenW(stem)-1];
+            if (lastChar != '\\' && lastChar != ':') {
+                lstrcatW(stem, wchr_slash);
+            }
             lstrcpyW(spec, wchr_star);
 
-        /* File: */
+        /* File:
+             stem should be:
+               Up to and including last slash if directory path supplied
+               If c:filename supplied, just the c:
+               Otherwise stem should be the current drive letter + ':' */
         } else {
-            WCHAR drive[MAX_PATH];
-            WCHAR dir[MAX_PATH];
-            WCHAR fname[MAX_PATH];
-            WCHAR ext[MAX_PATH];
-            _wsplitpath(actualsource, drive, dir, fname, ext);
-            lstrcpyW(stem, drive);
-            lstrcatW(stem, dir);
-            lstrcpyW(spec, fname);
-            lstrcatW(spec, ext);
+            WCHAR *lastDir;
+
+            WINE_TRACE("Filename supplied\n");
+            lastDir   = wcsrchr(suppliedsource, '\\');
+
+            if (lastDir) {
+                lstrcpyW(stem, suppliedsource);
+                stem[(lastDir-suppliedsource) + 1] = 0x00;
+                lstrcpyW(spec, (lastDir+1));
+            } else if (suppliedsource[1] == ':') {
+                lstrcpyW(stem, suppliedsource);
+                stem[2] = 0x00;
+                lstrcpyW(spec, suppliedsource+2);
+            } else {
+                WCHAR curdir[MAXSTRING];
+                GetCurrentDirectory (sizeof(curdir), curdir);
+                stem[0] = curdir[0];
+                stem[1] = curdir[1];
+                stem[2] = 0x00;
+                lstrcpyW(spec, suppliedsource);
+            }
         }
     }
     return RC_OK;
@@ -868,14 +899,17 @@ static BOOL XCOPY_ProcessExcludeFile(WCHAR* filename, WCHAR* endOfName) {
         /* Strip CRLF */
         buffer[length-1] = 0x00;
 
-        thisEntry = HeapAlloc(GetProcessHeap(), 0, sizeof(EXCLUDELIST));
-        thisEntry->next = excludeList;
-        excludeList = thisEntry;
-        thisEntry->name = HeapAlloc(GetProcessHeap(), 0,
-                                    (length * sizeof(WCHAR))+1);
-        lstrcpyW(thisEntry->name, buffer);
-        CharUpperBuff(thisEntry->name, length);
-        WINE_TRACE("Read line : '%s'\n", wine_dbgstr_w(thisEntry->name));
+        /* If more than CRLF */
+        if (length > 1) {
+          thisEntry = HeapAlloc(GetProcessHeap(), 0, sizeof(EXCLUDELIST));
+          thisEntry->next = excludeList;
+          excludeList = thisEntry;
+          thisEntry->name = HeapAlloc(GetProcessHeap(), 0,
+                                      (length * sizeof(WCHAR))+1);
+          lstrcpyW(thisEntry->name, buffer);
+          CharUpperBuff(thisEntry->name, length);
+          WINE_TRACE("Read line : '%s'\n", wine_dbgstr_w(thisEntry->name));
+        }
     }
 
     /* See if EOF or error occurred */
-- 
1.5.0




More information about the wine-patches mailing list