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 
10af90cf52SSean Callanan #include <inttypes.h> // PRIu64
118acdbb8aSStephen Wilson #include <limits.h>
128acdbb8aSStephen Wilson 
1330fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h"
14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
15b9c1b51eSKate Stone #include "lldb/Host/FileSpec.h"
16*6f9e6901SZachary Turner #include "lldb/Utility/Log.h"
17bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
1830fdc8d8SChris Lattner 
193f559740SZachary Turner #include "llvm/ADT/SmallString.h"
203f559740SZachary Turner 
2130fdc8d8SChris Lattner using namespace lldb;
2230fdc8d8SChris Lattner using namespace lldb_private;
2330fdc8d8SChris Lattner 
24b9c1b51eSKate Stone SBFileSpec::SBFileSpec() : m_opaque_ap(new lldb_private::FileSpec()) {}
2530fdc8d8SChris Lattner 
26b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const SBFileSpec &rhs)
27b9c1b51eSKate Stone     : m_opaque_ap(new lldb_private::FileSpec(*rhs.m_opaque_ap)) {}
2830fdc8d8SChris Lattner 
29b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const lldb_private::FileSpec &fspec)
30b9c1b51eSKate Stone     : m_opaque_ap(new lldb_private::FileSpec(fspec)) {}
3130fdc8d8SChris Lattner 
32d93c4a33SBruce Mitchener // Deprecated!!!
33b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const char *path)
34b9c1b51eSKate Stone     : m_opaque_ap(new FileSpec(path, true)) {}
35274060b6SGreg Clayton 
36b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const char *path, bool resolve)
37b9c1b51eSKate Stone     : m_opaque_ap(new FileSpec(path, resolve)) {}
3830fdc8d8SChris Lattner 
39b9c1b51eSKate Stone SBFileSpec::~SBFileSpec() {}
4030fdc8d8SChris Lattner 
41b9c1b51eSKate Stone const SBFileSpec &SBFileSpec::operator=(const SBFileSpec &rhs) {
4230fdc8d8SChris Lattner   if (this != &rhs)
43226cce25SGreg Clayton     *m_opaque_ap = *rhs.m_opaque_ap;
4430fdc8d8SChris Lattner   return *this;
4530fdc8d8SChris Lattner }
4630fdc8d8SChris Lattner 
47b9c1b51eSKate Stone bool SBFileSpec::IsValid() const { return m_opaque_ap->operator bool(); }
4830fdc8d8SChris Lattner 
49b9c1b51eSKate Stone bool SBFileSpec::Exists() const {
505160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
51ceb6b139SCaroline Tice 
52226cce25SGreg Clayton   bool result = m_opaque_ap->Exists();
53ceb6b139SCaroline Tice 
54ceb6b139SCaroline Tice   if (log)
55324a1036SSaleem Abdulrasool     log->Printf("SBFileSpec(%p)::Exists () => %s",
56324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()),
57324a1036SSaleem Abdulrasool                 (result ? "true" : "false"));
58ceb6b139SCaroline Tice 
59ceb6b139SCaroline Tice   return result;
6030fdc8d8SChris Lattner }
6130fdc8d8SChris Lattner 
62b9c1b51eSKate Stone bool SBFileSpec::ResolveExecutableLocation() {
63428a9a58SCaroline Tice   return m_opaque_ap->ResolveExecutableLocation();
64428a9a58SCaroline Tice }
6530fdc8d8SChris Lattner 
66b9c1b51eSKate Stone int SBFileSpec::ResolvePath(const char *src_path, char *dst_path,
67b9c1b51eSKate Stone                             size_t dst_len) {
683f559740SZachary Turner   llvm::SmallString<64> result(src_path);
693f559740SZachary Turner   lldb_private::FileSpec::Resolve(result);
70686b1fe6SIlia K   ::snprintf(dst_path, dst_len, "%s", result.c_str());
71686b1fe6SIlia K   return std::min(dst_len - 1, result.size());
7230fdc8d8SChris Lattner }
7330fdc8d8SChris Lattner 
74b9c1b51eSKate Stone const char *SBFileSpec::GetFilename() const {
75226cce25SGreg Clayton   const char *s = m_opaque_ap->GetFilename().AsCString();
764838131bSGreg Clayton 
775160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
78b9c1b51eSKate Stone   if (log) {
79cfd1acedSGreg Clayton     if (s)
80324a1036SSaleem Abdulrasool       log->Printf("SBFileSpec(%p)::GetFilename () => \"%s\"",
81324a1036SSaleem Abdulrasool                   static_cast<void *>(m_opaque_ap.get()), s);
82cfd1acedSGreg Clayton     else
83324a1036SSaleem Abdulrasool       log->Printf("SBFileSpec(%p)::GetFilename () => NULL",
84324a1036SSaleem Abdulrasool                   static_cast<void *>(m_opaque_ap.get()));
85cfd1acedSGreg Clayton   }
86750cd175SCaroline Tice 
874838131bSGreg Clayton   return s;
8830fdc8d8SChris Lattner }
8930fdc8d8SChris Lattner 
90b9c1b51eSKate Stone const char *SBFileSpec::GetDirectory() const {
917d2f62daSChaoren Lin   FileSpec directory{*m_opaque_ap};
927d2f62daSChaoren Lin   directory.GetFilename().Clear();
935160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
94b9c1b51eSKate Stone   if (log) {
957d2f62daSChaoren Lin     if (directory)
96324a1036SSaleem Abdulrasool       log->Printf("SBFileSpec(%p)::GetDirectory () => \"%s\"",
97b9c1b51eSKate Stone                   static_cast<void *>(m_opaque_ap.get()),
98b9c1b51eSKate Stone                   directory.GetCString());
99cfd1acedSGreg Clayton     else
100324a1036SSaleem Abdulrasool       log->Printf("SBFileSpec(%p)::GetDirectory () => NULL",
101324a1036SSaleem Abdulrasool                   static_cast<void *>(m_opaque_ap.get()));
102cfd1acedSGreg Clayton   }
1037d2f62daSChaoren Lin   return directory.GetCString();
10430fdc8d8SChris Lattner }
10530fdc8d8SChris Lattner 
106b9c1b51eSKate Stone void SBFileSpec::SetFilename(const char *filename) {
107fbb76349SGreg Clayton   if (filename && filename[0])
108fbb76349SGreg Clayton     m_opaque_ap->GetFilename().SetCString(filename);
109fbb76349SGreg Clayton   else
110fbb76349SGreg Clayton     m_opaque_ap->GetFilename().Clear();
111fbb76349SGreg Clayton }
112fbb76349SGreg Clayton 
113b9c1b51eSKate Stone void SBFileSpec::SetDirectory(const char *directory) {
114fbb76349SGreg Clayton   if (directory && directory[0])
115fbb76349SGreg Clayton     m_opaque_ap->GetDirectory().SetCString(directory);
116fbb76349SGreg Clayton   else
117fbb76349SGreg Clayton     m_opaque_ap->GetDirectory().Clear();
118fbb76349SGreg Clayton }
119fbb76349SGreg Clayton 
120b9c1b51eSKate Stone uint32_t SBFileSpec::GetPath(char *dst_path, size_t dst_len) const {
1215160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
122ceb6b139SCaroline Tice 
123226cce25SGreg Clayton   uint32_t result = m_opaque_ap->GetPath(dst_path, dst_len);
124ceb6b139SCaroline Tice 
125ceb6b139SCaroline Tice   if (log)
126b9c1b51eSKate Stone     log->Printf("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%" PRIu64
127b9c1b51eSKate Stone                 ") => %u",
128324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()), result, dst_path,
129324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(dst_len), result);
13030fdc8d8SChris Lattner 
131cfd1acedSGreg Clayton   if (result == 0 && dst_path && dst_len > 0)
13230fdc8d8SChris Lattner     *dst_path = '\0';
133cfd1acedSGreg Clayton   return result;
13430fdc8d8SChris Lattner }
13530fdc8d8SChris Lattner 
136b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::operator->() const {
1376611103cSGreg Clayton   return m_opaque_ap.get();
13830fdc8d8SChris Lattner }
13930fdc8d8SChris Lattner 
140b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::get() const {
1416611103cSGreg Clayton   return m_opaque_ap.get();
14230fdc8d8SChris Lattner }
14330fdc8d8SChris Lattner 
144b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::operator*() const {
1456611103cSGreg Clayton   return *m_opaque_ap.get();
14630fdc8d8SChris Lattner }
14730fdc8d8SChris Lattner 
148b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::ref() const {
1496611103cSGreg Clayton   return *m_opaque_ap.get();
15030fdc8d8SChris Lattner }
15130fdc8d8SChris Lattner 
152b9c1b51eSKate Stone void SBFileSpec::SetFileSpec(const lldb_private::FileSpec &fs) {
1536611103cSGreg Clayton   *m_opaque_ap = fs;
15430fdc8d8SChris Lattner }
15530fdc8d8SChris Lattner 
156b9c1b51eSKate Stone bool SBFileSpec::GetDescription(SBStream &description) const {
157da7bc7d0SGreg Clayton   Stream &strm = description.ref();
158cfd1acedSGreg Clayton   char path[PATH_MAX];
159cfd1acedSGreg Clayton   if (m_opaque_ap->GetPath(path, sizeof(path)))
160da7bc7d0SGreg Clayton     strm.PutCString(path);
161ceb6b139SCaroline Tice   return true;
162ceb6b139SCaroline Tice }
163878ae018SJason Molenda 
164b9c1b51eSKate Stone void SBFileSpec::AppendPathComponent(const char *fn) {
165878ae018SJason Molenda   m_opaque_ap->AppendPathComponent(fn);
166878ae018SJason Molenda }
167