windows-nt/Source/XPSP1/NT/base/ntsetup/legacy/dll/path2.c
2020-09-26 16:20:57 +08:00

89 lines
2.9 KiB
C

#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;
}