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