22class MIKTEXNOVTABLE PathNameUtil
27 PathNameUtil() =
delete;
28 PathNameUtil(
const PathNameUtil& other) =
delete;
29 PathNameUtil& operator=(
const PathNameUtil& other) =
delete;
30 PathNameUtil(PathNameUtil&& other) =
delete;
31 PathNameUtil& operator=(PathNameUtil&& other) =
delete;
32 ~PathNameUtil() =
delete;
34 static constexpr char DosDirectoryDelimiter{
'\\' };
35 static constexpr char UnixDirectoryDelimiter{
'/' };
36 static constexpr char DosPathNameDelimiter{
';' };
37 static constexpr char UnixPathNameDelimiter{
':' };
38 static constexpr char DosVolumeDelimiter{
':' };
40#if defined(MIKTEX_WINDOWS)
41 static constexpr char AltDirectoryDelimiter{ UnixDirectoryDelimiter };
44#if defined(MIKTEX_WINDOWS)
45 static constexpr char DirectoryDelimiter{ DosDirectoryDelimiter };
46#elif defined(MIKTEX_UNIX)
47 static constexpr char DirectoryDelimiter{ UnixDirectoryDelimiter };
50#if defined(MIKTEX_WINDOWS)
51 static constexpr char PathNameDelimiter{ DosPathNameDelimiter };
52#elif defined(MIKTEX_UNIX)
53 static constexpr char PathNameDelimiter{ UnixPathNameDelimiter };
56#if defined(MIKTEX_WINDOWS)
57 static constexpr char VolumeDelimiter{ DosVolumeDelimiter };
60 static bool IsDosDriveLetter(
int ch)
62 return (ch >=
'A' && ch <=
'Z') || (ch >=
'a' && ch <=
'z');
65 static bool IsDosVolumeDelimiter(
int ch)
67 return ch == DosVolumeDelimiter;
75 if (ch == DirectoryDelimiter)
79#if defined(MIKTEX_WINDOWS)
80 return ch == AltDirectoryDelimiter;
86 static bool IsExplicitlyRelative(
const std::string& path)
92 else if (path[0] ==
'.')
94 return (path.length() > 1 && IsDirectoryDelimiter(path[1])) || (path.length() > 2 && path[1] ==
'.' && IsDirectoryDelimiter(path[2]));
102 static bool IsAbsolutePath(
const std::string& path)
108 else if (IsDirectoryDelimiter(path[0]))
113#if defined(MIKTEX_WINDOWS)
114 else if (path.length() > 2 && PathNameUtil::IsDosDriveLetter(path[0])
115 && IsDosVolumeDelimiter(path[1])
116 && IsDirectoryDelimiter(path[2]))
127 static bool IsFullyQualifiedPath(
const std::string& path)
129#if defined(MIKTEX_WINDOWS)
130 if (path.length() < 3)
134 else if (IsDirectoryDelimiter(path[0]) && IsDirectoryDelimiter(path[1]))
139 else if (PathNameUtil::IsDosDriveLetter(path[0])
140 && IsDosVolumeDelimiter(path[1])
141 && IsDirectoryDelimiter(path[2]))
151 return IsAbsolutePath(path);
155 static char ToUnix(
char ch)
157 return ch == DosDirectoryDelimiter ? UnixDirectoryDelimiter : ch;
160 static char ToDos(
char ch)
162 return ch == UnixDirectoryDelimiter ? DosDirectoryDelimiter : ch;
165 static void ConvertToUnix(std::string& path)
167 for (
char& ch : path)
173 static void ConvertToDos(std::string& path)
175 for (
char& ch : path)
181#if defined(MIKTEX_WINDOWS)
182 static MIKTEXUTILCEEAPI(std::wstring) ToLengthExtendedPathName(
const std::string& path);