130fdc8d8SChris Lattner //===-- SBFileSpec.cpp ------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
10*672d2c12SJonas Devlieghere #include <inttypes.h>
118acdbb8aSStephen Wilson #include <limits.h>
128acdbb8aSStephen Wilson 
1330fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h"
14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
152c22c800SJonas Devlieghere #include "lldb/Host/FileSystem.h"
168d48cd60SZachary Turner #include "lldb/Host/PosixApi.h"
175713a05bSZachary Turner #include "lldb/Utility/FileSpec.h"
186f9e6901SZachary Turner #include "lldb/Utility/Log.h"
19bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
2030fdc8d8SChris Lattner 
213f559740SZachary Turner #include "llvm/ADT/SmallString.h"
223f559740SZachary Turner 
2330fdc8d8SChris Lattner using namespace lldb;
2430fdc8d8SChris Lattner using namespace lldb_private;
2530fdc8d8SChris Lattner 
26b9c1b51eSKate Stone SBFileSpec::SBFileSpec() : m_opaque_ap(new lldb_private::FileSpec()) {}
2730fdc8d8SChris Lattner 
28b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const SBFileSpec &rhs)
29b9c1b51eSKate Stone     : m_opaque_ap(new lldb_private::FileSpec(*rhs.m_opaque_ap)) {}
3030fdc8d8SChris Lattner 
31b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const lldb_private::FileSpec &fspec)
32b9c1b51eSKate Stone     : m_opaque_ap(new lldb_private::FileSpec(fspec)) {}
3330fdc8d8SChris Lattner 
34d93c4a33SBruce Mitchener // Deprecated!!!
358f3be7a3SJonas Devlieghere SBFileSpec::SBFileSpec(const char *path) : m_opaque_ap(new FileSpec(path)) {
368f3be7a3SJonas Devlieghere   FileSystem::Instance().Resolve(*m_opaque_ap);
378f3be7a3SJonas Devlieghere }
38274060b6SGreg Clayton 
39b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const char *path, bool resolve)
408f3be7a3SJonas Devlieghere     : m_opaque_ap(new FileSpec(path)) {
418f3be7a3SJonas Devlieghere   if (resolve)
428f3be7a3SJonas Devlieghere     FileSystem::Instance().Resolve(*m_opaque_ap);
438f3be7a3SJonas Devlieghere }
4430fdc8d8SChris Lattner 
45b9c1b51eSKate Stone SBFileSpec::~SBFileSpec() {}
4630fdc8d8SChris Lattner 
47b9c1b51eSKate Stone const SBFileSpec &SBFileSpec::operator=(const SBFileSpec &rhs) {
4830fdc8d8SChris Lattner   if (this != &rhs)
49226cce25SGreg Clayton     *m_opaque_ap = *rhs.m_opaque_ap;
5030fdc8d8SChris Lattner   return *this;
5130fdc8d8SChris Lattner }
5230fdc8d8SChris Lattner 
53b9c1b51eSKate Stone bool SBFileSpec::IsValid() const { return m_opaque_ap->operator bool(); }
5430fdc8d8SChris Lattner 
55b9c1b51eSKate Stone bool SBFileSpec::Exists() const {
565160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
57ceb6b139SCaroline Tice 
58dbd7fabaSJonas Devlieghere   bool result = FileSystem::Instance().Exists(*m_opaque_ap);
59ceb6b139SCaroline Tice 
60ceb6b139SCaroline Tice   if (log)
61324a1036SSaleem Abdulrasool     log->Printf("SBFileSpec(%p)::Exists () => %s",
62324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()),
63324a1036SSaleem Abdulrasool                 (result ? "true" : "false"));
64ceb6b139SCaroline Tice 
65ceb6b139SCaroline Tice   return result;
6630fdc8d8SChris Lattner }
6730fdc8d8SChris Lattner 
68b9c1b51eSKate Stone bool SBFileSpec::ResolveExecutableLocation() {
692c22c800SJonas Devlieghere   return FileSystem::Instance().ResolveExecutableLocation(*m_opaque_ap);
70428a9a58SCaroline Tice }
7130fdc8d8SChris Lattner 
72b9c1b51eSKate Stone int SBFileSpec::ResolvePath(const char *src_path, char *dst_path,
73b9c1b51eSKate Stone                             size_t dst_len) {
743f559740SZachary Turner   llvm::SmallString<64> result(src_path);
758f3be7a3SJonas Devlieghere   FileSystem::Instance().Resolve(result);
76686b1fe6SIlia K   ::snprintf(dst_path, dst_len, "%s", result.c_str());
77686b1fe6SIlia K   return std::min(dst_len - 1, result.size());
7830fdc8d8SChris Lattner }
7930fdc8d8SChris Lattner 
80b9c1b51eSKate Stone const char *SBFileSpec::GetFilename() const {
81226cce25SGreg Clayton   const char *s = m_opaque_ap->GetFilename().AsCString();
824838131bSGreg Clayton 
835160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
84b9c1b51eSKate Stone   if (log) {
85cfd1acedSGreg Clayton     if (s)
86324a1036SSaleem Abdulrasool       log->Printf("SBFileSpec(%p)::GetFilename () => \"%s\"",
87324a1036SSaleem Abdulrasool                   static_cast<void *>(m_opaque_ap.get()), s);
88cfd1acedSGreg Clayton     else
89324a1036SSaleem Abdulrasool       log->Printf("SBFileSpec(%p)::GetFilename () => NULL",
90324a1036SSaleem Abdulrasool                   static_cast<void *>(m_opaque_ap.get()));
91cfd1acedSGreg Clayton   }
92750cd175SCaroline Tice 
934838131bSGreg Clayton   return s;
9430fdc8d8SChris Lattner }
9530fdc8d8SChris Lattner 
96b9c1b51eSKate Stone const char *SBFileSpec::GetDirectory() const {
977d2f62daSChaoren Lin   FileSpec directory{*m_opaque_ap};
987d2f62daSChaoren Lin   directory.GetFilename().Clear();
995160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
100b9c1b51eSKate Stone   if (log) {
1017d2f62daSChaoren Lin     if (directory)
102324a1036SSaleem Abdulrasool       log->Printf("SBFileSpec(%p)::GetDirectory () => \"%s\"",
103b9c1b51eSKate Stone                   static_cast<void *>(m_opaque_ap.get()),
104b9c1b51eSKate Stone                   directory.GetCString());
105cfd1acedSGreg Clayton     else
106324a1036SSaleem Abdulrasool       log->Printf("SBFileSpec(%p)::GetDirectory () => NULL",
107324a1036SSaleem Abdulrasool                   static_cast<void *>(m_opaque_ap.get()));
108cfd1acedSGreg Clayton   }
1097d2f62daSChaoren Lin   return directory.GetCString();
11030fdc8d8SChris Lattner }
11130fdc8d8SChris Lattner 
112b9c1b51eSKate Stone void SBFileSpec::SetFilename(const char *filename) {
113fbb76349SGreg Clayton   if (filename && filename[0])
114fbb76349SGreg Clayton     m_opaque_ap->GetFilename().SetCString(filename);
115fbb76349SGreg Clayton   else
116fbb76349SGreg Clayton     m_opaque_ap->GetFilename().Clear();
117fbb76349SGreg Clayton }
118fbb76349SGreg Clayton 
119b9c1b51eSKate Stone void SBFileSpec::SetDirectory(const char *directory) {
120fbb76349SGreg Clayton   if (directory && directory[0])
121fbb76349SGreg Clayton     m_opaque_ap->GetDirectory().SetCString(directory);
122fbb76349SGreg Clayton   else
123fbb76349SGreg Clayton     m_opaque_ap->GetDirectory().Clear();
124fbb76349SGreg Clayton }
125fbb76349SGreg Clayton 
126b9c1b51eSKate Stone uint32_t SBFileSpec::GetPath(char *dst_path, size_t dst_len) const {
1275160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
128ceb6b139SCaroline Tice 
129226cce25SGreg Clayton   uint32_t result = m_opaque_ap->GetPath(dst_path, dst_len);
130ceb6b139SCaroline Tice 
131ceb6b139SCaroline Tice   if (log)
132b9c1b51eSKate Stone     log->Printf("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%" PRIu64
133b9c1b51eSKate Stone                 ") => %u",
134324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()), result, dst_path,
135324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(dst_len), result);
13630fdc8d8SChris Lattner 
137cfd1acedSGreg Clayton   if (result == 0 && dst_path && dst_len > 0)
13830fdc8d8SChris Lattner     *dst_path = '\0';
139cfd1acedSGreg Clayton   return result;
14030fdc8d8SChris Lattner }
14130fdc8d8SChris Lattner 
142b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::operator->() const {
1436611103cSGreg Clayton   return m_opaque_ap.get();
14430fdc8d8SChris Lattner }
14530fdc8d8SChris Lattner 
146b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::get() const {
1476611103cSGreg Clayton   return m_opaque_ap.get();
14830fdc8d8SChris Lattner }
14930fdc8d8SChris Lattner 
150b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::operator*() const {
1516611103cSGreg Clayton   return *m_opaque_ap.get();
15230fdc8d8SChris Lattner }
15330fdc8d8SChris Lattner 
154b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::ref() const {
1556611103cSGreg Clayton   return *m_opaque_ap.get();
15630fdc8d8SChris Lattner }
15730fdc8d8SChris Lattner 
158b9c1b51eSKate Stone void SBFileSpec::SetFileSpec(const lldb_private::FileSpec &fs) {
1596611103cSGreg Clayton   *m_opaque_ap = fs;
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
162b9c1b51eSKate Stone bool SBFileSpec::GetDescription(SBStream &description) const {
163da7bc7d0SGreg Clayton   Stream &strm = description.ref();
164cfd1acedSGreg Clayton   char path[PATH_MAX];
165cfd1acedSGreg Clayton   if (m_opaque_ap->GetPath(path, sizeof(path)))
166da7bc7d0SGreg Clayton     strm.PutCString(path);
167ceb6b139SCaroline Tice   return true;
168ceb6b139SCaroline Tice }
169878ae018SJason Molenda 
170b9c1b51eSKate Stone void SBFileSpec::AppendPathComponent(const char *fn) {
171878ae018SJason Molenda   m_opaque_ap->AppendPathComponent(fn);
172878ae018SJason Molenda }
173