// 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 #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(fp.m_FilePath); } FilePath::~FilePath() { } BYTE FilePath::NumComponents() { return static_cast(m_FilePath.size()); } bool FilePath::IsEmpty() { return (m_FilePath.size() == 0); } FilePathComponent FilePath::ChopTail() { std::list::iterator iter1 = m_FilePath.begin(); std::list::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::iterator iter = m_FilePath.begin(); if (m_FilePath.end() == iter) throw Exception(ccBadFilePath); return *iter; } FilePathComponent FilePath::Tail() { std::list::iterator iter = m_FilePath.end(); if (m_FilePath.begin() == iter) throw Exception(ccBadFilePath); return *(--iter); } string FilePath::GetStringPath() { string str; std::list::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::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::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::iterator iter1 = m_FilePath.begin(); std::list::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; }