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
17//===----------------------------------------------------------------------===//
18MCLDDirectory::MCLDDirectory()
19  : Directory(), m_Name(), m_bInSysroot(false) {
20}
21
22MCLDDirectory::MCLDDirectory(const char* pName)
23  : Directory(), m_Name(pName) {
24  Directory::m_Path.assign(pName);
25
26  if (!Directory::m_Path.empty())
27    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
28
29  Directory::m_Path.m_append_separator_if_needed();
30  if (m_bInSysroot)
31    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
32  else
33    detail::open_dir(*this);
34}
35
36MCLDDirectory::MCLDDirectory(const std::string &pName)
37  : Directory(), m_Name(pName) {
38  Directory::m_Path.assign(pName);
39
40  if (!Directory::m_Path.empty())
41    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
42
43  Directory::m_Path.m_append_separator_if_needed();
44  if (m_bInSysroot)
45    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
46  else
47    detail::open_dir(*this);
48}
49
50MCLDDirectory::MCLDDirectory(llvm::StringRef pName)
51  : Directory(), m_Name(pName.data(), pName.size()) {
52  Directory::m_Path.assign(pName.str());
53
54  if (!Directory::m_Path.empty())
55    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
56
57  Directory::m_Path.m_append_separator_if_needed();
58  if (m_bInSysroot)
59    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
60  else
61    detail::open_dir(*this);
62}
63
64MCLDDirectory &MCLDDirectory::assign(llvm::StringRef pName)
65{
66  m_Name.assign(pName.data(), pName.size());
67  Directory::m_Path.assign(pName.str());
68
69  if (!Directory::m_Path.empty())
70    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
71
72  Directory::m_Path.m_append_separator_if_needed();
73  if (m_bInSysroot)
74    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
75  else
76    detail::open_dir(*this);
77  Directory::m_FileStatus = FileStatus();
78  Directory::m_SymLinkStatus = FileStatus();
79  Directory::m_Cache.clear();
80  Directory::m_Handler = 0;
81  return (*this);
82}
83
84MCLDDirectory::~MCLDDirectory()
85{
86}
87
88bool MCLDDirectory::isInSysroot() const
89{
90  return m_bInSysroot;
91}
92
93void MCLDDirectory::setSysroot(const sys::fs::Path& pSysroot)
94{
95  if (m_bInSysroot) {
96    std::string old_path = Directory::m_Path.native();
97    Directory::m_Path.native() = pSysroot.native();
98    Directory::m_Path.m_append_separator_if_needed();
99    Directory::m_Path.native() += old_path;
100    detail::canonicalize(Directory::m_Path.native());
101    detail::open_dir(*this);
102  }
103}
104
105