PATH.H

//******************************************************************************************* 
//
// Filename : Path.h
//
//Path APIs
//
// Copyright 1994 - 1998 Microsoft Corporation. All rights reserved
//
//*******************************************************************************************


#ifndef _PATH_H_
#define _PATH_H_

#ifdef __cplusplus
extern "C" {
#endif



extern const TCHAR c_szStarDotStar[];
extern const TCHAR c_szStar[];
extern const TCHAR c_szSlash[];
extern const TCHAR c_szNULL[];

#define DRIVEID(path) ((path[0] - 'A') & 31)
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
#define SIZEOF(v) sizeof(v)


BOOL PathIsDotOrDotDot(LPTSTR pszDir);
BOOL PathStripToRoot(LPTSTR pszRoot);
LPTSTR PathAddBackslash(LPTSTR lpszPath);
LPTSTR PathRemoveBackslash(LPTSTR lpszPath);
void PathRemoveBlanks(LPTSTR lpszString);
BOOL PathRemoveFileSpec(LPTSTR lpszPath);
LPTSTR PathFindFileName(LPCTSTR pPath);
BOOL PathIsRoot(LPCTSTR lpszPath);
BOOL PathIsRelative(LPCTSTR lpszPath);
BOOL PathIsUNC(LPCTSTR lpsz);
BOOL PathIsDirectory(LPCTSTR lpszPath);
BOOL PathIsExe(LPCTSTR lpszPath);
int PathGetDriveNumber(LPCTSTR lpszPath);
LPTSTR PathCombine(LPTSTR szDest, LPCTSTR lpszDir, LPCTSTR lpszFile);
BOOL PathAppend(LPTSTR pPath, LPCTSTR pMore);
LPTSTR PathBuildRoot(LPTSTR szRoot, int iDrive);
int PathCommonPrefix(LPCTSTR pszFile1, LPCTSTR pszFile2, LPTSTR achPath);
LPTSTR PathFindExtension(LPCTSTR pszPath);
BOOL PathFileExists(LPCTSTR lpszPath);
BOOL PathMatchSpec(LPCTSTR pszFile, LPCTSTR pszSpec);
BOOL PathMakeUniqueName(LPTSTR pszUniqueName, UINT cchMax, LPCTSTR pszTemplate, LPCTSTR pszLongPlate, LPCTSTR pszDir);
LPTSTR PathGetArgs(LPCTSTR pszPath);
BOOL PathGetShortName(LPCTSTR lpszLongName, LPTSTR lpszShortName, UINT cbShortName);
void PathQuoteSpaces(LPTSTR lpsz);
void PathUnquoteSpaces(LPTSTR lpsz);
BOOL PathDirectoryExists(LPCTSTR lpszDir);

#define PQD_NOSTRIPDOTS 0x00000001
void PathQualifyDef(LPTSTR psz, LPCTSTR szDefDir, DWORD dwFlags);
void PathQualify(LPTSTR lpsz);


#define PRF_VERIFYEXISTS 0x0001
#define PRF_TRYPROGRAMEXTENSIONS (0x0002 | PRF_VERIFYEXISTS)
#define PRF_FIRSTDIRDEF 0x0004
#define PRF_DONTFINDLNK 0x0008 // if PRF_TRYPROGRAMEXTENSIONS is specified

int PathResolve(LPTSTR lpszPath, LPCTSTR FAR dirs[], UINT fFlags);


LPTSTR PathGetNextComponent(LPCTSTR lpszPath, LPTSTR lpszComponent);
LPTSTR PathFindNextComponent(LPCTSTR lpszPath);
BOOL PathIsSameRoot(LPCTSTR pszPath1, LPCTSTR pszPath2);

//
// Return codes from PathCleanupSpec. Negative return values are
// unrecoverable errors
//
#define PCS_FATAL 0x80000000
#define PCS_REPLACEDCHAR 0x00000001
#define PCS_REMOVEDCHAR 0x00000002
#define PCS_TRUNCATED 0x00000004
#define PCS_PATHTOOLONG 0x00000008 // Always combined with FATAL

int PathCleanupSpec(LPCTSTR pszDir, LPTSTR pszSpec);

BOOL PathCompactPath(HDC hDC, LPTSTR lpszPath, UINT dx);
void PathSetDlgItemPath(HWND hDlg, int id, LPCTSTR pszPath);

#define GCT_INVALID 0x0000
#define GCT_LFNCHAR 0x0001
#define GCT_SHORTCHAR 0x0002
#define GCT_WILD 0x0004
#define GCT_SEPERATOR 0x0008
UINT PathGetCharType(TCHAR ch);

void PathRemoveArgs(LPTSTR pszPath);
BOOL PathMakePretty(LPTSTR lpPath);

BOOL PathIsFileSpec(LPCTSTR lpszPath);
BOOL PathIsLink(LPCTSTR szFile);

BOOL PathRenameExtension(LPTSTR pszPath, LPCTSTR pszExt);

int DriveType(int iDrive);

//-------- drive type identification --------------
// iDrive drive index (0=A, 1=B, ...)
//
#define DRIVE_CDROM 5 // extended DriveType() types
#define DRIVE_RAMDRIVE 6

#define DRIVE_TYPE 0x000F // type masek
#define DRIVE_SLOW 0x0010 // drive is on a slow link
#define DRIVE_LFN 0x0020 // drive supports LFNs
#define DRIVE_AUTORUN 0x0040 // drive has AutoRun.inf in root.
#define DRIVE_AUDIOCD 0x0080 // drive is a AudioCD
#define DRIVE_AUTOOPEN 0x0100 // should *always* auto open on insert
#define DRIVE_NETUNAVAIL 0x0200 // Network drive that is not available
#define DRIVE_SHELLOPEN 0x0400 // should auto open on insert, if shell has focus

#define DriveTypeFlags(iDrive) DriveType('A' + (iDrive))
#define DriveIsSlow(iDrive) (DriveTypeFlags(iDrive) & DRIVE_SLOW)
#define DriveIsLFN(iDrive) (DriveTypeFlags(iDrive) & DRIVE_LFN)
#define DriveIsAutoRun(iDrive) (DriveTypeFlags(iDrive) & DRIVE_AUTORUN)
#define DriveIsAutoOpen(iDrive) (DriveTypeFlags(iDrive) & DRIVE_AUTOOPEN)
#define DriveIsShellOpen(iDrive) (DriveTypeFlags(iDrive) & DRIVE_SHELLOPEN)
#define DriveIsAudioCD(iDrive) (DriveTypeFlags(iDrive) & DRIVE_AUDIOCD)
#define DriveIsNetUnAvail(iDrive) (DriveTypeFlags(iDrive) & DRIVE_NETUNAVAIL)

#define IsCDRomDrive(iDrive) (DriveType(iDrive) == DRIVE_CDROM)
#define IsRamDrive(iDrive) (DriveType(iDrive) == DRIVE_RAMDRIVE)
#define IsRemovableDrive(iDrive) (DriveType(iDrive) == DRIVE_REMOVABLE)
#define IsRemoteDrive(iDrive) (DriveType(iDrive) == DRIVE_REMOTE)


#ifdef __cplusplus
}
#endif

#endif // _PATH_H_