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"
16*da7bc7d0SGreg 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 () :
246611103cSGreg Clayton     m_opaque_ap()
2530fdc8d8SChris Lattner {
2630fdc8d8SChris Lattner }
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const SBFileSpec &rhs) :
296611103cSGreg Clayton     m_opaque_ap()
3030fdc8d8SChris Lattner {
312d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
32750cd175SCaroline Tice 
33750cd175SCaroline Tice     if (rhs.m_opaque_ap.get())
34750cd175SCaroline Tice         m_opaque_ap.reset (new FileSpec (rhs.get()));
35ceb6b139SCaroline Tice 
36ceb6b139SCaroline Tice     if (log)
37ceb6b139SCaroline Tice     {
38ceb6b139SCaroline Tice         SBStream sstr;
39750cd175SCaroline Tice         GetDescription (sstr);
40cfd1acedSGreg Clayton         log->Printf ("SBFileSpec::SBFileSpec (const SBFileSpec rhs.ap=%p) => SBFileSpec(%p): %s",
41750cd175SCaroline Tice                      rhs.m_opaque_ap.get(), m_opaque_ap.get(), sstr.GetData());
42ceb6b139SCaroline Tice     }
4330fdc8d8SChris Lattner }
4430fdc8d8SChris Lattner 
45274060b6SGreg Clayton // Deprected!!!
4630fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const char *path) :
47274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, true))
48274060b6SGreg Clayton {
49274060b6SGreg Clayton }
50274060b6SGreg Clayton 
51274060b6SGreg Clayton SBFileSpec::SBFileSpec (const char *path, bool resolve) :
52274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, resolve))
5330fdc8d8SChris Lattner {
542d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
55ceb6b139SCaroline Tice 
56ceb6b139SCaroline Tice     if (log)
57cfd1acedSGreg Clayton         log->Printf ("SBFileSpec::SBFileSpec (path=\"%s\", resolve=%i) => SBFileSpec(%p)", path,
5893aa84e8SGreg Clayton                      resolve, m_opaque_ap.get());
5930fdc8d8SChris Lattner }
6030fdc8d8SChris Lattner 
6130fdc8d8SChris Lattner SBFileSpec::~SBFileSpec ()
6230fdc8d8SChris Lattner {
6330fdc8d8SChris Lattner }
6430fdc8d8SChris Lattner 
6530fdc8d8SChris Lattner const SBFileSpec &
6630fdc8d8SChris Lattner SBFileSpec::operator = (const SBFileSpec &rhs)
6730fdc8d8SChris Lattner {
6830fdc8d8SChris Lattner     if (this != &rhs)
6930fdc8d8SChris Lattner     {
7030fdc8d8SChris Lattner         if (rhs.IsValid())
716611103cSGreg Clayton             m_opaque_ap.reset (new lldb_private::FileSpec(*rhs.m_opaque_ap.get()));
7230fdc8d8SChris Lattner     }
7330fdc8d8SChris Lattner     return *this;
7430fdc8d8SChris Lattner }
7530fdc8d8SChris Lattner 
7630fdc8d8SChris Lattner bool
7730fdc8d8SChris Lattner SBFileSpec::IsValid() const
7830fdc8d8SChris Lattner {
796611103cSGreg Clayton     return m_opaque_ap.get() != NULL;
8030fdc8d8SChris Lattner }
8130fdc8d8SChris Lattner 
8230fdc8d8SChris Lattner bool
8330fdc8d8SChris Lattner SBFileSpec::Exists () const
8430fdc8d8SChris Lattner {
852d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
86ceb6b139SCaroline Tice 
87ceb6b139SCaroline Tice     bool result = false;
886611103cSGreg Clayton     if (m_opaque_ap.get())
89ceb6b139SCaroline Tice         result = m_opaque_ap->Exists();
90ceb6b139SCaroline Tice 
91ceb6b139SCaroline Tice     if (log)
9293aa84e8SGreg Clayton         log->Printf ("SBFileSpec(%p)::Exists () => %s", m_opaque_ap.get(), (result ? "true" : "false"));
93ceb6b139SCaroline Tice 
94ceb6b139SCaroline Tice     return result;
9530fdc8d8SChris Lattner }
9630fdc8d8SChris Lattner 
97428a9a58SCaroline Tice bool
98428a9a58SCaroline Tice SBFileSpec::ResolveExecutableLocation ()
99428a9a58SCaroline Tice {
100428a9a58SCaroline Tice     if (m_opaque_ap.get())
101428a9a58SCaroline Tice         return m_opaque_ap->ResolveExecutableLocation ();
102428a9a58SCaroline Tice     return false;
103428a9a58SCaroline Tice }
10430fdc8d8SChris Lattner 
10530fdc8d8SChris Lattner int
10630fdc8d8SChris Lattner SBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)
10730fdc8d8SChris Lattner {
10830fdc8d8SChris Lattner     return lldb_private::FileSpec::Resolve (src_path, dst_path, dst_len);
10930fdc8d8SChris Lattner }
11030fdc8d8SChris Lattner 
11130fdc8d8SChris Lattner const char *
11223fd10cbSJohnny Chen SBFileSpec::GetFilename() const
11330fdc8d8SChris Lattner {
1144838131bSGreg Clayton     const char *s = NULL;
1156611103cSGreg Clayton     if (m_opaque_ap.get())
1164838131bSGreg Clayton         s = m_opaque_ap->GetFilename().AsCString();
1174838131bSGreg Clayton 
1182d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
119ceb6b139SCaroline Tice     if (log)
120cfd1acedSGreg Clayton     {
121cfd1acedSGreg Clayton         if (s)
122cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetFilename () => \"%s\"", m_opaque_ap.get(), s);
123cfd1acedSGreg Clayton         else
124cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetFilename () => NULL", m_opaque_ap.get());
125cfd1acedSGreg Clayton     }
126750cd175SCaroline Tice 
1274838131bSGreg Clayton     return s;
12830fdc8d8SChris Lattner }
12930fdc8d8SChris Lattner 
13030fdc8d8SChris Lattner const char *
13130fdc8d8SChris Lattner SBFileSpec::GetDirectory() const
13230fdc8d8SChris Lattner {
1334838131bSGreg Clayton     const char *s = NULL;
1346611103cSGreg Clayton     if (m_opaque_ap.get())
1354838131bSGreg Clayton         s = m_opaque_ap->GetDirectory().AsCString();
1362d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1374838131bSGreg Clayton     if (log)
138cfd1acedSGreg Clayton     {
139cfd1acedSGreg Clayton         if (s)
140cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetDirectory () => \"%s\"", m_opaque_ap.get(), s);
141cfd1acedSGreg Clayton         else
142cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetDirectory () => NULL", m_opaque_ap.get());
143cfd1acedSGreg Clayton     }
1444838131bSGreg Clayton     return s;
14530fdc8d8SChris Lattner }
14630fdc8d8SChris Lattner 
14730fdc8d8SChris Lattner uint32_t
14830fdc8d8SChris Lattner SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
14930fdc8d8SChris Lattner {
1502d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
151ceb6b139SCaroline Tice 
152cfd1acedSGreg Clayton     uint32_t result = 0;
1536611103cSGreg Clayton     if (m_opaque_ap.get())
154ceb6b139SCaroline Tice         result = m_opaque_ap->GetPath (dst_path, dst_len);
155ceb6b139SCaroline Tice 
156ceb6b139SCaroline Tice     if (log)
157cfd1acedSGreg Clayton         log->Printf ("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%zu) => %u",
158cfd1acedSGreg Clayton                      m_opaque_ap.get(), result, dst_path, 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     if (m_opaque_ap.get())
1966611103cSGreg Clayton         *m_opaque_ap = fs;
19730fdc8d8SChris Lattner     else
1986611103cSGreg Clayton         m_opaque_ap.reset (new FileSpec (fs));
19930fdc8d8SChris Lattner }
20030fdc8d8SChris Lattner 
201dde9cff3SCaroline Tice bool
202ceb6b139SCaroline Tice SBFileSpec::GetDescription (SBStream &description) const
203ceb6b139SCaroline Tice {
204*da7bc7d0SGreg Clayton     Stream &strm = description.ref();
205ceb6b139SCaroline Tice     if (m_opaque_ap.get())
206ceb6b139SCaroline Tice     {
207cfd1acedSGreg Clayton         char path[PATH_MAX];
208cfd1acedSGreg Clayton         if (m_opaque_ap->GetPath(path, sizeof(path)))
209*da7bc7d0SGreg Clayton             strm.PutCString (path);
210ceb6b139SCaroline Tice     }
211ceb6b139SCaroline Tice     else
212*da7bc7d0SGreg Clayton         strm.PutCString ("No value");
213ceb6b139SCaroline Tice 
214ceb6b139SCaroline Tice     return true;
215ceb6b139SCaroline Tice }
216