//===- 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);
  }
}

