michael@0: // Windows/FileName.cpp michael@0: michael@0: #include "StdAfx.h" michael@0: michael@0: #include "Windows/FileName.h" michael@0: #include "Common/Wildcard.h" michael@0: michael@0: namespace NWindows { michael@0: namespace NFile { michael@0: namespace NName { michael@0: michael@0: static const wchar_t kDiskDelimiter = L':'; michael@0: michael@0: /* michael@0: static bool IsCharAPrefixDelimiter(wchar_t c) michael@0: { return (c == kDirDelimiter || c == kDiskDelimiter); } michael@0: */ michael@0: michael@0: void NormalizeDirPathPrefix(CSysString &dirPath) michael@0: { michael@0: if (dirPath.IsEmpty()) michael@0: return; michael@0: if (dirPath.ReverseFind(kDirDelimiter) != dirPath.Length() - 1) michael@0: dirPath += kDirDelimiter; michael@0: } michael@0: michael@0: #ifndef _UNICODE michael@0: void NormalizeDirPathPrefix(UString &dirPath) michael@0: { michael@0: if (dirPath.IsEmpty()) michael@0: return; michael@0: if (dirPath.ReverseFind(wchar_t(kDirDelimiter)) != dirPath.Length() - 1) michael@0: dirPath += wchar_t(kDirDelimiter); michael@0: } michael@0: #endif michael@0: michael@0: namespace NPathType michael@0: { michael@0: EEnum GetPathType(const UString &path) michael@0: { michael@0: if (path.Length() <= 2) michael@0: return kLocal; michael@0: if (path[0] == kDirDelimiter && path[1] == kDirDelimiter) michael@0: return kUNC; michael@0: return kLocal; michael@0: } michael@0: } michael@0: michael@0: void CParsedPath::ParsePath(const UString &path) michael@0: { michael@0: int curPos = 0; michael@0: switch (NPathType::GetPathType(path)) michael@0: { michael@0: case NPathType::kLocal: michael@0: { michael@0: int posDiskDelimiter = path.Find(kDiskDelimiter); michael@0: if(posDiskDelimiter >= 0) michael@0: { michael@0: curPos = posDiskDelimiter + 1; michael@0: if (path.Length() > curPos) michael@0: if(path[curPos] == kDirDelimiter) michael@0: curPos++; michael@0: } michael@0: break; michael@0: } michael@0: case NPathType::kUNC: michael@0: { michael@0: int curPos = path.Find(kDirDelimiter, 2); michael@0: if(curPos < 0) michael@0: curPos = path.Length(); michael@0: else michael@0: curPos++; michael@0: } michael@0: } michael@0: Prefix = path.Left(curPos); michael@0: SplitPathToParts(path.Mid(curPos), PathParts); michael@0: } michael@0: michael@0: UString CParsedPath::MergePath() const michael@0: { michael@0: UString result = Prefix; michael@0: for(int i = 0; i < PathParts.Size(); i++) michael@0: { michael@0: if (i != 0) michael@0: result += kDirDelimiter; michael@0: result += PathParts[i]; michael@0: } michael@0: return result; michael@0: } michael@0: michael@0: const wchar_t kExtensionDelimiter = L'.'; michael@0: michael@0: void SplitNameToPureNameAndExtension(const UString &fullName, michael@0: UString &pureName, UString &extensionDelimiter, UString &extension) michael@0: { michael@0: int index = fullName.ReverseFind(kExtensionDelimiter); michael@0: if (index < 0) michael@0: { michael@0: pureName = fullName; michael@0: extensionDelimiter.Empty(); michael@0: extension.Empty(); michael@0: } michael@0: else michael@0: { michael@0: pureName = fullName.Left(index); michael@0: extensionDelimiter = kExtensionDelimiter; michael@0: extension = fullName.Mid(index + 1); michael@0: } michael@0: } michael@0: michael@0: }}}