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