89 lines
2.9 KiB
C
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;
|
||
|
}
|