238 lines
4.2 KiB
C
238 lines
4.2 KiB
C
|
/*
|
||
|
* util.c - Miscellaneous utility functions module.
|
||
|
*/
|
||
|
|
||
|
|
||
|
/* Headers
|
||
|
**********/
|
||
|
|
||
|
#include "project.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
|
||
|
/****************************** Public Functions *****************************/
|
||
|
|
||
|
|
||
|
/*
|
||
|
** IsLocalDrivePath()
|
||
|
**
|
||
|
**
|
||
|
**
|
||
|
** Arguments:
|
||
|
**
|
||
|
** Returns:
|
||
|
**
|
||
|
** Side Effects: none
|
||
|
*/
|
||
|
PUBLIC_CODE BOOL IsLocalDrivePath(LPCTSTR pcszFullPath)
|
||
|
{
|
||
|
BOOL bResult;
|
||
|
|
||
|
ASSERT(IsFullPath(pcszFullPath));
|
||
|
|
||
|
bResult = IsDrivePath(pcszFullPath);
|
||
|
|
||
|
if (bResult)
|
||
|
{
|
||
|
TCHAR rgchRootPath[DRIVE_ROOT_PATH_LEN];
|
||
|
|
||
|
ASSERT(IsCharAlpha(*pcszFullPath));
|
||
|
|
||
|
lstrcpy(rgchRootPath, TEXT("A:\\"));
|
||
|
rgchRootPath[0] = *pcszFullPath;
|
||
|
|
||
|
bResult = (GetDriveType(rgchRootPath) != DRIVE_REMOTE);
|
||
|
}
|
||
|
|
||
|
return(bResult);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
** IsUNCPath()
|
||
|
**
|
||
|
** Determines whether or not a path is in "\\server\share" UNC form.
|
||
|
**
|
||
|
** Arguments: pcszPath - path to examine
|
||
|
**
|
||
|
** Returns: TRUE if path is a UNC path. FALSE if not.
|
||
|
**
|
||
|
** Side Effects: none
|
||
|
**
|
||
|
** A UNC path is a string of the form two slashes, one or more non-slashes, one
|
||
|
** slash, one or more non-slashes
|
||
|
*/
|
||
|
PUBLIC_CODE BOOL IsUNCPath(LPCTSTR pcszFullPath)
|
||
|
{
|
||
|
BOOL bResult = FALSE;
|
||
|
|
||
|
ASSERT(IsFullPath(pcszFullPath));
|
||
|
|
||
|
if (lstrlen(pcszFullPath) >= 5 &&
|
||
|
IS_SLASH(pcszFullPath[0]) &&
|
||
|
IS_SLASH(pcszFullPath[1]) &&
|
||
|
! IS_SLASH(pcszFullPath[2]))
|
||
|
{
|
||
|
LPCTSTR pcsz;
|
||
|
|
||
|
for (pcsz = &(pcszFullPath[2]); *pcsz; pcsz = CharNext(pcsz))
|
||
|
{
|
||
|
if (IS_SLASH(*pcsz))
|
||
|
{
|
||
|
bResult = (*(pcsz + 1) &&
|
||
|
! IS_SLASH(*(pcsz + 1)));
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(bResult);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
** DeleteLastDrivePathElement()
|
||
|
**
|
||
|
** Deletes the last path element from a drive path.
|
||
|
**
|
||
|
** Arguments: pszDrivePath - drive path whose last element is to be deleted
|
||
|
**
|
||
|
** Returns: TRUE if path element deleted. FALSE if not, i.e., given path
|
||
|
** is root path.
|
||
|
**
|
||
|
** Side Effects: none
|
||
|
**
|
||
|
** Examples:
|
||
|
**
|
||
|
** input path output path
|
||
|
** ---------- -----------
|
||
|
** c:\ c:\
|
||
|
** c:\foo c:\
|
||
|
** c:\foo\bar c:\foo
|
||
|
** c:\foo\bar\ c:\foo\bar
|
||
|
**
|
||
|
** N.b., this function does not perform any validity tests on the format of the
|
||
|
** input path string.
|
||
|
*/
|
||
|
PUBLIC_CODE BOOL DeleteLastDrivePathElement(LPTSTR pszDrivePath)
|
||
|
{
|
||
|
BOOL bHackIt;
|
||
|
LPTSTR pszEndOfDriveSpec;
|
||
|
|
||
|
ASSERT(IsDrivePath(pszDrivePath));
|
||
|
|
||
|
pszEndOfDriveSpec = pszDrivePath + 3;
|
||
|
|
||
|
/* Is this a a root path? */
|
||
|
|
||
|
bHackIt = *pszEndOfDriveSpec;
|
||
|
|
||
|
if (bHackIt)
|
||
|
DeleteLastPathElement(pszEndOfDriveSpec);
|
||
|
|
||
|
ASSERT(IsDrivePath(pszDrivePath));
|
||
|
|
||
|
return(bHackIt);
|
||
|
}
|
||
|
|
||
|
|
||
|
#if defined(DEBUG) || defined(VSTF)
|
||
|
|
||
|
/*
|
||
|
** IsContained()
|
||
|
**
|
||
|
**
|
||
|
**
|
||
|
** Arguments:
|
||
|
**
|
||
|
** Returns:
|
||
|
**
|
||
|
** Side Effects: none
|
||
|
*/
|
||
|
PUBLIC_CODE BOOL IsContained(PCVOID pcvJar, UINT ucbJarLen, PCVOID pcvJelly,
|
||
|
UINT ucbJellyLen)
|
||
|
{
|
||
|
BOOL bResult = FALSE;
|
||
|
|
||
|
ASSERT(IS_VALID_READ_BUFFER_PTR(pcvJar, CVOID, ucbJarLen));
|
||
|
ASSERT(IS_VALID_READ_BUFFER_PTR(pcvJelly, CVOID, ucbJellyLen));
|
||
|
|
||
|
if (EVAL(pcvJelly >= pcvJar))
|
||
|
{
|
||
|
UINT ucbJellyOffset;
|
||
|
|
||
|
ucbJellyOffset = (UINT)((PCBYTE)pcvJelly - (PCBYTE)pcvJar);
|
||
|
|
||
|
if (EVAL(ucbJellyOffset < ucbJarLen) &&
|
||
|
EVAL(ucbJellyLen < ucbJarLen - ucbJellyOffset))
|
||
|
bResult = TRUE;
|
||
|
}
|
||
|
|
||
|
return(bResult);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
** IsValidCNRName()
|
||
|
**
|
||
|
**
|
||
|
**
|
||
|
** Arguments:
|
||
|
**
|
||
|
** Returns:
|
||
|
**
|
||
|
** Side Effects: none
|
||
|
*/
|
||
|
PUBLIC_CODE BOOL IsValidCNRName(LPCTSTR pcszCNRName)
|
||
|
{
|
||
|
BOOL bResult;
|
||
|
|
||
|
/* Any valid string < MAX_PATH_LEN bytes long is a valid CNR name. */
|
||
|
|
||
|
bResult = (IS_VALID_STRING_PTR(pcszCNRName, CSTR) &&
|
||
|
EVAL(lstrlen(pcszCNRName) < MAX_PATH_LEN));
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
|
||
|
/*
|
||
|
* RIP if a CNR name ends in a slash
|
||
|
*/
|
||
|
|
||
|
if (bResult)
|
||
|
{
|
||
|
if (IsUNCPath(pcszCNRName))
|
||
|
{
|
||
|
ASSERT(! IS_SLASH(*(CharPrev(pcszCNRName, pcszCNRName + lstrlen(pcszCNRName)))));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
return(bResult);
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
|
||
|
/*
|
||
|
** IsDriveRootPath()
|
||
|
**
|
||
|
**
|
||
|
**
|
||
|
** Arguments:
|
||
|
**
|
||
|
** Returns:
|
||
|
**
|
||
|
** Side Effects: none
|
||
|
*/
|
||
|
PUBLIC_CODE BOOL IsDriveRootPath(LPCTSTR pcszPath)
|
||
|
{
|
||
|
return(IsDrivePath(pcszPath) &&
|
||
|
lstrlen(pcszPath) == 3);
|
||
|
}
|
||
|
|
||
|
#endif
|