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 
108acdbb8aSStephen Wilson #include <limits.h>
118acdbb8aSStephen Wilson 
1230fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h"
13dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1453239f00SGreg Clayton #include "lldb/Host/FileSpec.h"
15ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
16da7bc7d0SGreg Clayton #include "lldb/Core/Stream.h"
1730fdc8d8SChris Lattner 
1830fdc8d8SChris Lattner using namespace lldb;
1930fdc8d8SChris Lattner using namespace lldb_private;
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner 
2330fdc8d8SChris Lattner SBFileSpec::SBFileSpec () :
24226cce25SGreg Clayton     m_opaque_ap(new lldb_private::FileSpec())
2530fdc8d8SChris Lattner {
2630fdc8d8SChris Lattner }
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const SBFileSpec &rhs) :
29226cce25SGreg Clayton     m_opaque_ap(new lldb_private::FileSpec(*rhs.m_opaque_ap))
3030fdc8d8SChris Lattner {
31ceb6b139SCaroline Tice }
32226cce25SGreg Clayton 
33226cce25SGreg Clayton SBFileSpec::SBFileSpec (const lldb_private::FileSpec& fspec) :
34226cce25SGreg Clayton     m_opaque_ap(new lldb_private::FileSpec(fspec))
35226cce25SGreg Clayton {
3630fdc8d8SChris Lattner }
3730fdc8d8SChris Lattner 
38274060b6SGreg Clayton // Deprected!!!
3930fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const char *path) :
40274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, true))
41274060b6SGreg Clayton {
42274060b6SGreg Clayton }
43274060b6SGreg Clayton 
44274060b6SGreg Clayton SBFileSpec::SBFileSpec (const char *path, bool resolve) :
45274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, resolve))
4630fdc8d8SChris Lattner {
4730fdc8d8SChris Lattner }
4830fdc8d8SChris Lattner 
4930fdc8d8SChris Lattner SBFileSpec::~SBFileSpec ()
5030fdc8d8SChris Lattner {
5130fdc8d8SChris Lattner }
5230fdc8d8SChris Lattner 
5330fdc8d8SChris Lattner const SBFileSpec &
5430fdc8d8SChris Lattner SBFileSpec::operator = (const SBFileSpec &rhs)
5530fdc8d8SChris Lattner {
5630fdc8d8SChris Lattner     if (this != &rhs)
57226cce25SGreg Clayton         *m_opaque_ap = *rhs.m_opaque_ap;
5830fdc8d8SChris Lattner     return *this;
5930fdc8d8SChris Lattner }
6030fdc8d8SChris Lattner 
6130fdc8d8SChris Lattner bool
6230fdc8d8SChris Lattner SBFileSpec::IsValid() const
6330fdc8d8SChris Lattner {
649076c0ffSSean Callanan     return m_opaque_ap->operator bool();
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner bool
6830fdc8d8SChris Lattner SBFileSpec::Exists () const
6930fdc8d8SChris Lattner {
705160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
71ceb6b139SCaroline Tice 
72226cce25SGreg Clayton     bool result = m_opaque_ap->Exists();
73ceb6b139SCaroline Tice 
74ceb6b139SCaroline Tice     if (log)
75*324a1036SSaleem Abdulrasool         log->Printf ("SBFileSpec(%p)::Exists () => %s",
76*324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_ap.get()),
77*324a1036SSaleem Abdulrasool                      (result ? "true" : "false"));
78ceb6b139SCaroline Tice 
79ceb6b139SCaroline Tice     return result;
8030fdc8d8SChris Lattner }
8130fdc8d8SChris Lattner 
82428a9a58SCaroline Tice bool
83428a9a58SCaroline Tice SBFileSpec::ResolveExecutableLocation ()
84428a9a58SCaroline Tice {
85428a9a58SCaroline Tice     return m_opaque_ap->ResolveExecutableLocation ();
86428a9a58SCaroline Tice }
8730fdc8d8SChris Lattner 
8830fdc8d8SChris Lattner int
8930fdc8d8SChris Lattner SBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)
9030fdc8d8SChris Lattner {
9130fdc8d8SChris Lattner     return lldb_private::FileSpec::Resolve (src_path, dst_path, dst_len);
9230fdc8d8SChris Lattner }
9330fdc8d8SChris Lattner 
9430fdc8d8SChris Lattner const char *
9523fd10cbSJohnny Chen SBFileSpec::GetFilename() const
9630fdc8d8SChris Lattner {
97226cce25SGreg Clayton     const char *s = m_opaque_ap->GetFilename().AsCString();
984838131bSGreg Clayton 
995160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
100ceb6b139SCaroline Tice     if (log)
101cfd1acedSGreg Clayton     {
102cfd1acedSGreg Clayton         if (s)
103*324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetFilename () => \"%s\"",
104*324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()), s);
105cfd1acedSGreg Clayton         else
106*324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetFilename () => NULL",
107*324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()));
108cfd1acedSGreg Clayton     }
109750cd175SCaroline Tice 
1104838131bSGreg Clayton     return s;
11130fdc8d8SChris Lattner }
11230fdc8d8SChris Lattner 
11330fdc8d8SChris Lattner const char *
11430fdc8d8SChris Lattner SBFileSpec::GetDirectory() const
11530fdc8d8SChris Lattner {
116226cce25SGreg Clayton     const char *s = m_opaque_ap->GetDirectory().AsCString();
1175160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1184838131bSGreg Clayton     if (log)
119cfd1acedSGreg Clayton     {
120cfd1acedSGreg Clayton         if (s)
121*324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetDirectory () => \"%s\"",
122*324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()), s);
123cfd1acedSGreg Clayton         else
124*324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetDirectory () => NULL",
125*324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()));
126cfd1acedSGreg Clayton     }
1274838131bSGreg Clayton     return s;
12830fdc8d8SChris Lattner }
12930fdc8d8SChris Lattner 
130fbb76349SGreg Clayton void
131fbb76349SGreg Clayton SBFileSpec::SetFilename(const char *filename)
132fbb76349SGreg Clayton {
133fbb76349SGreg Clayton     if (filename && filename[0])
134fbb76349SGreg Clayton         m_opaque_ap->GetFilename().SetCString(filename);
135fbb76349SGreg Clayton     else
136fbb76349SGreg Clayton         m_opaque_ap->GetFilename().Clear();
137fbb76349SGreg Clayton }
138fbb76349SGreg Clayton 
139fbb76349SGreg Clayton void
140fbb76349SGreg Clayton SBFileSpec::SetDirectory(const char *directory)
141fbb76349SGreg Clayton {
142fbb76349SGreg Clayton     if (directory && directory[0])
143fbb76349SGreg Clayton         m_opaque_ap->GetDirectory().SetCString(directory);
144fbb76349SGreg Clayton     else
145fbb76349SGreg Clayton         m_opaque_ap->GetDirectory().Clear();
146fbb76349SGreg Clayton }
147fbb76349SGreg Clayton 
14830fdc8d8SChris Lattner uint32_t
14930fdc8d8SChris Lattner SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
15030fdc8d8SChris Lattner {
1515160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
152ceb6b139SCaroline Tice 
153226cce25SGreg Clayton     uint32_t result = m_opaque_ap->GetPath (dst_path, dst_len);
154ceb6b139SCaroline Tice 
155ceb6b139SCaroline Tice     if (log)
156d01b2953SDaniel Malea         log->Printf ("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%" PRIu64 ") => %u",
157*324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_ap.get()), result, dst_path,
158*324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(dst_len), result);
15930fdc8d8SChris Lattner 
160cfd1acedSGreg Clayton     if (result == 0 && dst_path && dst_len > 0)
16130fdc8d8SChris Lattner         *dst_path = '\0';
162cfd1acedSGreg Clayton     return result;
16330fdc8d8SChris Lattner }
16430fdc8d8SChris Lattner 
16530fdc8d8SChris Lattner 
16630fdc8d8SChris Lattner const lldb_private::FileSpec *
16730fdc8d8SChris Lattner SBFileSpec::operator->() const
16830fdc8d8SChris Lattner {
1696611103cSGreg Clayton     return m_opaque_ap.get();
17030fdc8d8SChris Lattner }
17130fdc8d8SChris Lattner 
17230fdc8d8SChris Lattner const lldb_private::FileSpec *
17330fdc8d8SChris Lattner SBFileSpec::get() const
17430fdc8d8SChris Lattner {
1756611103cSGreg Clayton     return m_opaque_ap.get();
17630fdc8d8SChris Lattner }
17730fdc8d8SChris Lattner 
17830fdc8d8SChris Lattner 
17930fdc8d8SChris Lattner const lldb_private::FileSpec &
18030fdc8d8SChris Lattner SBFileSpec::operator*() const
18130fdc8d8SChris Lattner {
1826611103cSGreg Clayton     return *m_opaque_ap.get();
18330fdc8d8SChris Lattner }
18430fdc8d8SChris Lattner 
18530fdc8d8SChris Lattner const lldb_private::FileSpec &
18630fdc8d8SChris Lattner SBFileSpec::ref() const
18730fdc8d8SChris Lattner {
1886611103cSGreg Clayton     return *m_opaque_ap.get();
18930fdc8d8SChris Lattner }
19030fdc8d8SChris Lattner 
19130fdc8d8SChris Lattner 
19230fdc8d8SChris Lattner void
19330fdc8d8SChris Lattner SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
19430fdc8d8SChris Lattner {
1956611103cSGreg Clayton     *m_opaque_ap = fs;
19630fdc8d8SChris Lattner }
19730fdc8d8SChris Lattner 
198dde9cff3SCaroline Tice bool
199ceb6b139SCaroline Tice SBFileSpec::GetDescription (SBStream &description) const
200ceb6b139SCaroline Tice {
201da7bc7d0SGreg Clayton     Stream &strm = description.ref();
202cfd1acedSGreg Clayton     char path[PATH_MAX];
203cfd1acedSGreg Clayton     if (m_opaque_ap->GetPath(path, sizeof(path)))
204da7bc7d0SGreg Clayton         strm.PutCString (path);
205ceb6b139SCaroline Tice     return true;
206ceb6b139SCaroline Tice }
207