xcopy: Make displayed names mirror windows.

This commit is contained in:
Jason Edmeades 2007-03-31 21:24:17 +01:00 committed by Alexandre Julliard
parent a8914b9494
commit da977e5579
1 changed files with 79 additions and 50 deletions

View File

@ -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) {
attribs = 0x00; /* Ensures skips invalid or directory check below */
} else {
attribs = GetFileAttributes(actualsource);
}
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;
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 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;
if (starPos) *starPos = 0x00;
if (questPos) *questPos = 0x00;
WINE_TRACE("Filename supplied\n");
lastDir = wcsrchr(suppliedsource, '\\');
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);
} else {
DWORD attribs = GetFileAttributes(actualsource);
if (attribs == INVALID_FILE_ATTRIBUTES) {
XCOPY_FailMessage(GetLastError());
return RC_INITERROR;
/* Directory: */
} else if (attribs & FILE_ATTRIBUTE_DIRECTORY) {
lstrcatW(stem, wchr_slash);
lstrcpyW(spec, wchr_star);
/* File: */
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 */