256 lines
5.6 KiB
C++
256 lines
5.6 KiB
C++
|
// FilePath.cpp: implementation of the FilePath class.
|
||
|
//
|
||
|
// (c) Copyright Schlumberger Technology Corp., unpublished work, created
|
||
|
// 2000. This computer program includes Confidential, Proprietary
|
||
|
// Information and is a Trade Secret of Schlumberger Technology Corp. All
|
||
|
// use, disclosure, and/or reproduction is prohibited unless authorized
|
||
|
// in writing. All Rights Reserved.
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// Don't allow the min & max macros in WINDEF.H to be defined so the
|
||
|
// min/max methods declared in limits are accessible.
|
||
|
#define NOMINMAX
|
||
|
|
||
|
#include "NoWarning.h"
|
||
|
|
||
|
#include <limits>
|
||
|
|
||
|
#include "iopExc.h"
|
||
|
#include "FilePath.h"
|
||
|
|
||
|
using namespace std;
|
||
|
using namespace iop;
|
||
|
|
||
|
namespace
|
||
|
{
|
||
|
const char szSeparators[] = "/\\:";
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
// Construction/Destruction
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
FilePath::FilePath()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
FilePath::FilePath(const string strFilePath)
|
||
|
{
|
||
|
|
||
|
// Make local copy of the string, since we need to manipulate it
|
||
|
string strPath(strFilePath);
|
||
|
|
||
|
while (strPath.length() > 0)
|
||
|
{
|
||
|
string::size_type i(0);
|
||
|
string::size_type j(0);
|
||
|
|
||
|
i = strPath.find_first_not_of(szSeparators, 0);
|
||
|
if (i == std::string::npos)
|
||
|
break;
|
||
|
j = strPath.find_first_of(szSeparators, i+1);
|
||
|
|
||
|
std::string::size_type cIndex =
|
||
|
std::string::npos == j
|
||
|
? strPath.length()
|
||
|
: j - i;
|
||
|
|
||
|
FilePathComponent fpc(FilePathComponent(strPath.substr(i, cIndex)));
|
||
|
m_FilePath.push_back(fpc);
|
||
|
|
||
|
if (std::string::npos == j)
|
||
|
break;
|
||
|
|
||
|
strPath = strPath.substr(j+1, strPath.length() - (j+1));
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
FilePath::FilePath(FilePath const &fp)
|
||
|
{
|
||
|
m_FilePath = list<FilePathComponent>(fp.m_FilePath);
|
||
|
}
|
||
|
|
||
|
FilePath::~FilePath()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
BYTE
|
||
|
FilePath::NumComponents()
|
||
|
{
|
||
|
return static_cast<BYTE>(m_FilePath.size());
|
||
|
}
|
||
|
|
||
|
bool FilePath::IsEmpty()
|
||
|
{
|
||
|
return (m_FilePath.size() == 0);
|
||
|
}
|
||
|
|
||
|
FilePathComponent FilePath::ChopTail()
|
||
|
{
|
||
|
std::list<FilePathComponent>::iterator iter1 = m_FilePath.begin();
|
||
|
std::list<FilePathComponent>::iterator iter2 = m_FilePath.end();
|
||
|
|
||
|
if (iter1 == iter2)
|
||
|
throw Exception(ccBadFilePath);
|
||
|
iter2--;
|
||
|
FilePathComponent fpc = *iter2;
|
||
|
m_FilePath.erase(iter2);
|
||
|
return fpc;
|
||
|
}
|
||
|
|
||
|
void FilePath::Clear()
|
||
|
{
|
||
|
m_FilePath.clear();
|
||
|
}
|
||
|
|
||
|
FilePathComponent FilePath::Head()
|
||
|
{
|
||
|
std::list<FilePathComponent>::iterator iter = m_FilePath.begin();
|
||
|
if (m_FilePath.end() == iter)
|
||
|
throw Exception(ccBadFilePath);
|
||
|
return *iter;
|
||
|
}
|
||
|
|
||
|
FilePathComponent FilePath::Tail()
|
||
|
{
|
||
|
std::list<FilePathComponent>::iterator iter = m_FilePath.end();
|
||
|
if (m_FilePath.begin() == iter)
|
||
|
throw Exception(ccBadFilePath);
|
||
|
return *(--iter);
|
||
|
}
|
||
|
|
||
|
string FilePath::GetStringPath()
|
||
|
{
|
||
|
string str;
|
||
|
std::list<FilePathComponent>::iterator iter = m_FilePath.begin();
|
||
|
while (iter != m_FilePath.end())
|
||
|
{
|
||
|
str += (*iter).GetStringID();
|
||
|
iter++;
|
||
|
}
|
||
|
return str;
|
||
|
}
|
||
|
|
||
|
FilePath FilePath::Root()
|
||
|
{
|
||
|
return FilePath(string("/3f00"));
|
||
|
}
|
||
|
|
||
|
const FilePath &FilePath::operator +=(const FilePathComponent fp)
|
||
|
{
|
||
|
if (m_FilePath.size() >= std::numeric_limits<BYTE>::max())
|
||
|
throw Exception(ccFilePathTooLong);
|
||
|
m_FilePath.push_back(fp);
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
FilePathComponent &FilePath::operator [](unsigned int index)
|
||
|
{
|
||
|
if (index > (m_FilePath.size() - 1))
|
||
|
throw Exception(ccInvalidParameter);
|
||
|
std::list<FilePathComponent>::iterator iter = m_FilePath.begin();
|
||
|
for (unsigned int i = 0; i < index; i++)
|
||
|
iter++;
|
||
|
return *iter;
|
||
|
}
|
||
|
|
||
|
FilePath FilePath::GreatestCommonPrefix(FilePath &rPath)
|
||
|
{
|
||
|
FilePath fp;
|
||
|
std::list<FilePathComponent>::iterator iter1 = m_FilePath.begin();
|
||
|
std::list<FilePathComponent>::iterator iter2 = rPath.m_FilePath.begin();
|
||
|
while ((iter1 != m_FilePath.end()) &&
|
||
|
(iter2 != rPath.m_FilePath.end()) &&
|
||
|
(*iter1 == *iter2))
|
||
|
{
|
||
|
fp += *iter1;
|
||
|
iter1++;
|
||
|
iter2++;
|
||
|
}
|
||
|
return fp;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
bool iop::operator==(FilePath const &lhs, FilePath const &rhs)
|
||
|
{
|
||
|
return lhs.m_FilePath == rhs.m_FilePath;
|
||
|
}
|
||
|
|
||
|
std::ostream &iop::operator<<(std::ostream &output, FilePath &fp)
|
||
|
{
|
||
|
string str = fp.GetStringPath();
|
||
|
output << str;
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
FilePathComponent::FilePathComponent(string strFileID)
|
||
|
{
|
||
|
// Check the length and throw if it is greater than 5
|
||
|
if (strFileID.length() > 5)
|
||
|
throw Exception(ccFileIdTooLarge);
|
||
|
|
||
|
char *stopstring;
|
||
|
|
||
|
const char* buf = strFileID.c_str();
|
||
|
if ((buf[0] == '/') || (buf[0] == '\\') || (buf[0] == ':'))
|
||
|
m_usFileID = (short)strtoul(&buf[1],&stopstring,16);
|
||
|
else
|
||
|
m_usFileID = (short)strtoul(buf,&stopstring,16);
|
||
|
|
||
|
}
|
||
|
|
||
|
FilePathComponent::FilePathComponent(unsigned short usFileID) : m_usFileID(usFileID)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
FilePathComponent::~FilePathComponent()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
// Overloaded == operator for FilePathComponent
|
||
|
bool iop::operator==(FilePathComponent const &lhs,
|
||
|
FilePathComponent const &rhs)
|
||
|
{
|
||
|
return lhs.m_usFileID == rhs.m_usFileID;
|
||
|
}
|
||
|
|
||
|
bool iop::operator!=(FilePathComponent const &lhs,
|
||
|
FilePathComponent const &rhs)
|
||
|
{
|
||
|
return lhs.m_usFileID != rhs.m_usFileID;
|
||
|
}
|
||
|
bool iop::operator<(FilePathComponent const &lhs,
|
||
|
FilePathComponent const &rhs)
|
||
|
{
|
||
|
return lhs.m_usFileID < rhs.m_usFileID;
|
||
|
}
|
||
|
bool iop::operator>(FilePathComponent const &lhs,
|
||
|
FilePathComponent const &rhs)
|
||
|
{
|
||
|
return lhs.m_usFileID > rhs.m_usFileID;
|
||
|
}
|
||
|
|
||
|
|
||
|
std::ostream &iop::operator<<(std::ostream &output,
|
||
|
FilePathComponent &fpc)
|
||
|
{
|
||
|
output << fpc.GetStringID();
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
string FilePathComponent::GetStringID()
|
||
|
{
|
||
|
char buf[33]; //
|
||
|
_itoa(m_usFileID,buf,16);
|
||
|
string tmp(buf);
|
||
|
for (unsigned int i = 4; i > strlen(buf); i--) tmp = string("0") + tmp;
|
||
|
return string("/") + tmp;
|
||
|
}
|