mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.9 KiB
88 lines
2.9 KiB
#include "precomp.h"
|
|
#pragma hdrstop
|
|
/***************************************************************************/
|
|
/***** Common Library Component - Path Manipulation Routines - 2 ***********/
|
|
/***************************************************************************/
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Creates a valid FAT path from two pieces - a dir string (includes
|
|
** drive, colon, root backslash and zero or more subdirs - backslash
|
|
** at end is optional), and a subpath string.
|
|
** Arguments:
|
|
** szDir: string to a volume consisting of a drive letter (upper
|
|
** or lower case), a colon, a root backslash, and zero or more
|
|
** subdirs, optionally ending with a backslash.
|
|
** szSubPath: string for a subpath of zero or more subdirs and a file
|
|
** name separated by backslashes. (No backslash at the beginning.)
|
|
** szBuf: buffer in which to store the constructed FAT path. It
|
|
** have room for cchpBufMax physical characters which will include
|
|
** the zero terminator.
|
|
** cchpBufMax: non-negative maximum number of useable physical
|
|
** characters in szBuf.
|
|
** Returns:
|
|
** fFalse if any of the string buffers are NULL, if szDir does not
|
|
** start with a valid drive letter, colon and root backslash, or
|
|
** if szSubPath starts with a backslash or is invalid, or if there
|
|
** is not enough space in szBuf to store the newly constructed FAT
|
|
** path.
|
|
** fTrue if a valid FAT path can be constructed from the pieces and
|
|
** stored in szBuf.
|
|
**
|
|
**************************************************************************/
|
|
BOOL APIENTRY FMakeFATPathFromDirAndSubPath(szDir, szSubPath,
|
|
szBuf, cchpBufMax)
|
|
SZ szDir;
|
|
SZ szSubPath;
|
|
SZ szBuf;
|
|
CCHP cchpBufMax;
|
|
{
|
|
CB cbBackSlash = (CB)0;
|
|
SZ szPathTmp;
|
|
SZ szLastChar;
|
|
CB cb;
|
|
|
|
AssertDataSeg();
|
|
|
|
ChkArg(szDir != (SZ)NULL &&
|
|
*szDir != '\0', 1, fFalse);
|
|
ChkArg(szSubPath != (SZ)NULL, 2, fFalse);
|
|
ChkArg(szBuf != (SZ)NULL, 3, fFalse);
|
|
ChkArg(cchpBufMax > (CCHP)4, 4, fFalse);
|
|
|
|
EvalAssert((szLastChar = SzLastChar(szDir)) != (SZ)NULL);
|
|
//
|
|
// szLastChar could be a lead byte, but lead bytes aren't in the
|
|
// ASCII range so we just check for the \ without checking if
|
|
// szLastChar is a lead byte.
|
|
//
|
|
if(*szLastChar != '\\') {
|
|
cbBackSlash = (CB)2;
|
|
}
|
|
|
|
cb = strlen(szDir) + strlen(szSubPath) + cbBackSlash + 1;
|
|
if ((szPathTmp = SAlloc(cb)) == (SZ)NULL ||
|
|
strcpy(szPathTmp, szDir) != szPathTmp ||
|
|
(cbBackSlash > 0 &&
|
|
SzStrCat(szPathTmp, "\\") != szPathTmp) ||
|
|
SzStrCat(szPathTmp, szSubPath) != szPathTmp)
|
|
{
|
|
|
|
if(szPathTmp) {
|
|
SFree(szPathTmp);
|
|
}
|
|
|
|
return(fFalse);
|
|
}
|
|
|
|
if (_fullpath(szBuf, szPathTmp, cchpBufMax) == (SZ)NULL)
|
|
{
|
|
SFree(szPathTmp);
|
|
return(fFalse);
|
|
}
|
|
|
|
SFree(szPathTmp);
|
|
|
|
return fTrue;
|
|
}
|