//===- 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" namespace mcld { //===----------------------------------------------------------------------===// // 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 sys::fs::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 sys::fs::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 sys::fs::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 sys::fs::detail::open_dir(*this); Directory::m_FileStatus = sys::fs::FileStatus(); Directory::m_SymLinkStatus = sys::fs::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; sys::fs::detail::canonicalize(Directory::m_Path.native()); sys::fs::detail::open_dir(*this); } } } // namespace mcld