//===- MCLDDirectory.cpp --------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "mcld/MC/MCLDDirectory.h" #include "mcld/Support/FileSystem.h" using namespace mcld; using namespace mcld::sys::fs; //========================== // MCLDDirectory MCLDDirectory::MCLDDirectory() : Directory(), m_Name(), m_bInSysroot(false) { } MCLDDirectory::MCLDDirectory(const char* pName) : Directory(), m_Name(pName) { Directory::m_Path.assign(pName); if (!Directory::m_Path.empty()) m_bInSysroot = ('=' == Directory::m_Path.native()[0]); Directory::m_Path.m_append_separator_if_needed(); if (m_bInSysroot) Directory::m_Path.native().erase(Directory::m_Path.native().begin()); else detail::open_dir(*this); } MCLDDirectory::MCLDDirectory(const std::string &pName) : Directory(), m_Name(pName) { Directory::m_Path.assign(pName); if (!Directory::m_Path.empty()) m_bInSysroot = ('=' == Directory::m_Path.native()[0]); Directory::m_Path.m_append_separator_if_needed(); if (m_bInSysroot) Directory::m_Path.native().erase(Directory::m_Path.native().begin()); else detail::open_dir(*this); } MCLDDirectory::MCLDDirectory(llvm::StringRef pName) : Directory(), m_Name(pName.data(), pName.size()) { Directory::m_Path.assign(pName.str()); if (!Directory::m_Path.empty()) m_bInSysroot = ('=' == Directory::m_Path.native()[0]); Directory::m_Path.m_append_separator_if_needed(); if (m_bInSysroot) Directory::m_Path.native().erase(Directory::m_Path.native().begin()); else detail::open_dir(*this); } MCLDDirectory &MCLDDirectory::assign(llvm::StringRef pName) { m_Name.assign(pName.data(), pName.size()); Directory::m_Path.assign(pName.str()); if (!Directory::m_Path.empty()) m_bInSysroot = ('=' == Directory::m_Path.native()[0]); Directory::m_Path.m_append_separator_if_needed(); if (m_bInSysroot) Directory::m_Path.native().erase(Directory::m_Path.native().begin()); else detail::open_dir(*this); Directory::m_FileStatus = FileStatus(); Directory::m_SymLinkStatus = FileStatus(); Directory::m_Cache.clear(); Directory::m_Handler = 0; return (*this); } MCLDDirectory::~MCLDDirectory() { } bool MCLDDirectory::isInSysroot() const { return m_bInSysroot; } void MCLDDirectory::setSysroot(const sys::fs::Path& pSysroot) { if (m_bInSysroot) { std::string old_path = Directory::m_Path.native(); Directory::m_Path.native() = pSysroot.native(); Directory::m_Path.m_append_separator_if_needed(); Directory::m_Path.native() += old_path; detail::canonicalize(Directory::m_Path.native()); detail::open_dir(*this); } }