Jason Edmeades : xcopy: Make displayed names mirror windows.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Apr 2 06:23:20 CDT 2007
Module: wine
Branch: master
Commit: da977e5579e4df4a5875b82095bf3baae2bb7373
URL: http://source.winehq.org/git/wine.git/?a=commit;h=da977e5579e4df4a5875b82095bf3baae2bb7373
Author: Jason Edmeades <us at edmeades.me.uk>
Date: Sat Mar 31 21:24:17 2007 +0100
xcopy: Make displayed names mirror windows.
---
programs/xcopy/xcopy.c | 123 +++++++++++++++++++++++++++++------------------
1 files changed, 76 insertions(+), 47 deletions(-)
diff --git a/programs/xcopy/xcopy.c b/programs/xcopy/xcopy.c
index 0de0b6f..eafc1d7 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,11 +308,13 @@ 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;
WCHAR *questPos;
+ DWORD attribs;
/*
* Validate the source, expanding to full path ensuring it exists
@@ -321,56 +324,79 @@ 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
*/
- /* If no wildcard were supplied then the source is either a single
- 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, '?');
+ /* If a directory is supplied, use that as-is (either fully or
+ partially qualified)
+ If a filename is supplied + a directory or drive path, use that
+ as-is
+ Otherwise
+ If no directory or path specified, add eg. C:
+ stem is Drive/Directory is bit up to last \ (or first :)
+ spec is bit after that */
+
+ starPos = wcschr(suppliedsource, '*');
+ questPos = wcschr(suppliedsource, '?');
if (starPos || questPos) {
- WCHAR *lastDir;
-
- if (starPos) *starPos = 0x00;
- if (questPos) *questPos = 0x00;
-
- lastDir = wcsrchr(stem, '\\');
- if (lastDir) *(lastDir+1) = 0x00;
- else {
- WINE_FIXME("Unexpected syntax error in source parameter\n");
- return RC_INITERROR;
- }
- lstrcpyW(spec, actualsource + (lastDir - stem)+1);
+ attribs = 0x00; /* Ensures skips invalid or directory check below */
} else {
+ attribs = GetFileAttributes(actualsource);
+ }
- DWORD attribs = GetFileAttributes(actualsource);
+ if (attribs == INVALID_FILE_ATTRIBUTES) {
+ XCOPY_FailMessage(GetLastError());
+ return RC_INITERROR;
- if (attribs == INVALID_FILE_ATTRIBUTES) {
- XCOPY_FailMessage(GetLastError());
- return RC_INITERROR;
+ /* 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) {
+ WCHAR lastChar;
- /* Directory: */
- } else if (attribs & FILE_ATTRIBUTE_DIRECTORY) {
+ WINE_TRACE("Directory supplied\n");
+ lstrcpyW(stem, suppliedsource);
+ lastChar = stem[lstrlenW(stem)-1];
+ if (lastChar != '\\' && lastChar != ':') {
lstrcatW(stem, wchr_slash);
- lstrcpyW(spec, wchr_star);
+ }
+ lstrcpyW(spec, wchr_star);
- /* File: */
+ /* File or wildcard search:
+ 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 *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 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 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 +894,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 */
More information about the wine-cvs
mailing list