1//===- MCLDDirectory.cpp --------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include "mcld/MC/MCLDDirectory.h"
10#include "mcld/Support/FileSystem.h"
11
12using namespace mcld;
13using namespace mcld::sys::fs;
14
15//==========================
16// MCLDDirectory
17MCLDDirectory::MCLDDirectory()
18  : Directory(), m_Name(), m_bInSysroot(false) {
19}
20
21MCLDDirectory::MCLDDirectory(const char* pName)
22  : Directory(), m_Name(pName) {
23  Directory::m_Path.assign(pName);
24
25  if (!Directory::m_Path.empty())
26    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
27
28  Directory::m_Path.m_append_separator_if_needed();
29  if (m_bInSysroot)
30    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
31  else
32    detail::open_dir(*this);
33}
34
35MCLDDirectory::MCLDDirectory(const std::string &pName)
36  : Directory(), m_Name(pName) {
37  Directory::m_Path.assign(pName);
38
39  if (!Directory::m_Path.empty())
40    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
41
42  Directory::m_Path.m_append_separator_if_needed();
43  if (m_bInSysroot)
44    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
45  else
46    detail::open_dir(*this);
47}
48
49MCLDDirectory::MCLDDirectory(llvm::StringRef pName)
50  : Directory(), m_Name(pName.data(), pName.size()) {
51  Directory::m_Path.assign(pName.str());
52
53  if (!Directory::m_Path.empty())
54    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
55
56  Directory::m_Path.m_append_separator_if_needed();
57  if (m_bInSysroot)
58    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
59  else
60    detail::open_dir(*this);
61}
62
63MCLDDirectory &MCLDDirectory::assign(llvm::StringRef pName)
64{
65  m_Name.assign(pName.data(), pName.size());
66  Directory::m_Path.assign(pName.str());
67
68  if (!Directory::m_Path.empty())
69    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
70
71  Directory::m_Path.m_append_separator_if_needed();
72  if (m_bInSysroot)
73    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
74  else
75    detail::open_dir(*this);
76  Directory::m_FileStatus = FileStatus();
77  Directory::m_SymLinkStatus = FileStatus();
78  Directory::m_Cache.clear();
79  Directory::m_Handler = 0;
80  return (*this);
81}
82
83MCLDDirectory::~MCLDDirectory()
84{
85}
86
87bool MCLDDirectory::isInSysroot() const
88{
89  return m_bInSysroot;
90}
91
92void MCLDDirectory::setSysroot(const sys::fs::Path& pSysroot)
93{
94  if (m_bInSysroot) {
95    std::string old_path = Directory::m_Path.native();
96    Directory::m_Path.native() = pSysroot.native();
97    Directory::m_Path.m_append_separator_if_needed();
98    Directory::m_Path.native() += old_path;
99    detail::canonicalize(Directory::m_Path.native());
100    detail::open_dir(*this);
101  }
102}
103
104