windows-nt/Source/XPSP1/NT/net/rras/cm/cmsetup/cfilename.cpp
2020-09-26 16:20:57 +08:00

104 lines
2.4 KiB
C++

//+----------------------------------------------------------------------------
//
// File: cfilename.cpp
//
// Module: CMSETUP.LIB
//
// Synopsis: Implementation of the CFileNameParts Class
//
// Copyright (c) 1998-1999 Microsoft Corporation
//
// Author: quintinb Created Header 08/19/99
//
//+----------------------------------------------------------------------------
#include "cfilename.h"
CFileNameParts::CFileNameParts(LPCTSTR szFullPath)
{
if (NULL == szFullPath)
{
CMASSERTMSG(FALSE, TEXT("NULL Input to CFileNameParts"));
return;
}
MYDBGASSERT(MAX_PATH >= lstrlen(szFullPath));
ZeroMemory(m_szFullPath, sizeof(m_szFullPath));
ZeroMemory(m_Drive, sizeof(m_Drive));
ZeroMemory(m_Dir, sizeof(m_Dir));
ZeroMemory(m_FileName, sizeof(m_FileName));
ZeroMemory(m_Extension, sizeof(m_Extension));
TCHAR* pszStart = m_szFullPath;
const TCHAR* pszCurrentSource = szFullPath;
TCHAR* pszLastSlash = NULL;
TCHAR* pszColon = NULL;
TCHAR* pszLastDot = NULL;
TCHAR* pszCurrentDest = m_szFullPath;
//
// Copy szFullPath to m_szFullPath
//
lstrcpy(m_szFullPath, szFullPath);
while ((TEXT('\0') != *pszCurrentSource) && (MAX_PATH >= (pszCurrentSource - szFullPath)))
{
switch(*pszCurrentSource)
{
case TEXT(':'):
//
// Found a colon, take the drive letter.
//
if ((NULL == pszColon) && (pszCurrentDest != m_szFullPath) &&
(m_szFullPath == CharPrev(m_szFullPath, pszCurrentDest)))
{
pszColon = pszCurrentDest;
lstrcpyn(m_Drive, pszStart, (size_t)((pszCurrentDest - pszStart) + 2));
pszStart = CharNext(pszColon);
}
else
{
CMASSERTMSG(FALSE, TEXT("CFileNameParts -- Error, we only allow one colon in a path."));
return;
}
break;
case TEXT('\\'):
case TEXT('/'):
pszLastSlash = pszCurrentDest;
break;
case TEXT('.'):
pszLastDot = pszCurrentDest;
break;
}
pszCurrentSource = CharNext(pszCurrentSource);
pszCurrentDest = CharNext(pszCurrentDest);
}
if (pszLastSlash)
{
lstrcpyn(m_Dir, pszStart, (size_t)((pszLastSlash - pszStart) + 2));
pszStart = CharNext(pszLastSlash) ;
}
if (pszLastDot && (pszLastDot > pszLastSlash))
{
lstrcpyn(m_FileName, pszStart, (size_t)((pszLastDot - pszStart) + 1));
lstrcpyn(m_Extension, pszLastDot, _MAX_EXT+1);
}
else
{
//
// No extension
//
lstrcpyn(m_FileName, pszStart, _MAX_FNAME+1);
}
}