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 
1030fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h"
11dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1230fdc8d8SChris Lattner #include "lldb/Core/FileSpec.h"
13ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
1430fdc8d8SChris Lattner 
1530fdc8d8SChris Lattner using namespace lldb;
1630fdc8d8SChris Lattner using namespace lldb_private;
1730fdc8d8SChris Lattner 
1830fdc8d8SChris Lattner 
1930fdc8d8SChris Lattner 
2030fdc8d8SChris Lattner SBFileSpec::SBFileSpec () :
216611103cSGreg Clayton     m_opaque_ap()
2230fdc8d8SChris Lattner {
2330fdc8d8SChris Lattner }
2430fdc8d8SChris Lattner 
2530fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const SBFileSpec &rhs) :
266611103cSGreg Clayton     m_opaque_ap()
2730fdc8d8SChris Lattner {
28750cd175SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
29750cd175SCaroline Tice 
30750cd175SCaroline Tice     if (rhs.m_opaque_ap.get())
31750cd175SCaroline Tice         m_opaque_ap.reset (new FileSpec (rhs.get()));
32ceb6b139SCaroline Tice 
33ceb6b139SCaroline Tice     if (log)
34ceb6b139SCaroline Tice     {
35ceb6b139SCaroline Tice         SBStream sstr;
36750cd175SCaroline Tice         GetDescription (sstr);
37*93aa84e8SGreg Clayton         log->Printf ("SBFileSpec::SBFileSpec (const SBFileSpec rhs.ap=%p) => SBFileSpec(%p) ('%s')",
38750cd175SCaroline Tice                      rhs.m_opaque_ap.get(), m_opaque_ap.get(), sstr.GetData());
39ceb6b139SCaroline Tice     }
4030fdc8d8SChris Lattner }
4130fdc8d8SChris Lattner 
42274060b6SGreg Clayton // Deprected!!!
4330fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const char *path) :
44274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, true))
45274060b6SGreg Clayton {
46274060b6SGreg Clayton }
47274060b6SGreg Clayton 
48274060b6SGreg Clayton SBFileSpec::SBFileSpec (const char *path, bool resolve) :
49274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, resolve))
5030fdc8d8SChris Lattner {
51750cd175SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
52ceb6b139SCaroline Tice 
53ceb6b139SCaroline Tice     if (log)
54*93aa84e8SGreg Clayton         log->Printf ("SBFileSpec::SBFileSpec (path='%s', resolve=%i) => SBFileSpec(%p)", path,
55*93aa84e8SGreg Clayton                      resolve, m_opaque_ap.get());
5630fdc8d8SChris Lattner }
5730fdc8d8SChris Lattner 
5830fdc8d8SChris Lattner SBFileSpec::~SBFileSpec ()
5930fdc8d8SChris Lattner {
6030fdc8d8SChris Lattner }
6130fdc8d8SChris Lattner 
6230fdc8d8SChris Lattner const SBFileSpec &
6330fdc8d8SChris Lattner SBFileSpec::operator = (const SBFileSpec &rhs)
6430fdc8d8SChris Lattner {
6530fdc8d8SChris Lattner     if (this != &rhs)
6630fdc8d8SChris Lattner     {
6730fdc8d8SChris Lattner         if (rhs.IsValid())
686611103cSGreg Clayton             m_opaque_ap.reset (new lldb_private::FileSpec(*rhs.m_opaque_ap.get()));
6930fdc8d8SChris Lattner     }
7030fdc8d8SChris Lattner     return *this;
7130fdc8d8SChris Lattner }
7230fdc8d8SChris Lattner 
7330fdc8d8SChris Lattner bool
7430fdc8d8SChris Lattner SBFileSpec::IsValid() const
7530fdc8d8SChris Lattner {
766611103cSGreg Clayton     return m_opaque_ap.get() != NULL;
7730fdc8d8SChris Lattner }
7830fdc8d8SChris Lattner 
7930fdc8d8SChris Lattner bool
8030fdc8d8SChris Lattner SBFileSpec::Exists () const
8130fdc8d8SChris Lattner {
82ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
83ceb6b139SCaroline Tice 
84ceb6b139SCaroline Tice     bool result = false;
856611103cSGreg Clayton     if (m_opaque_ap.get())
86ceb6b139SCaroline Tice         result = m_opaque_ap->Exists();
87ceb6b139SCaroline Tice 
88ceb6b139SCaroline Tice     if (log)
89*93aa84e8SGreg Clayton         log->Printf ("SBFileSpec(%p)::Exists () => %s", m_opaque_ap.get(), (result ? "true" : "false"));
90ceb6b139SCaroline Tice 
91ceb6b139SCaroline Tice     return result;
9230fdc8d8SChris Lattner }
9330fdc8d8SChris Lattner 
94428a9a58SCaroline Tice bool
95428a9a58SCaroline Tice SBFileSpec::ResolveExecutableLocation ()
96428a9a58SCaroline Tice {
97428a9a58SCaroline Tice     if (m_opaque_ap.get())
98428a9a58SCaroline Tice         return m_opaque_ap->ResolveExecutableLocation ();
99428a9a58SCaroline Tice     return false;
100428a9a58SCaroline Tice }
10130fdc8d8SChris Lattner 
10230fdc8d8SChris Lattner int
10330fdc8d8SChris Lattner SBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)
10430fdc8d8SChris Lattner {
10530fdc8d8SChris Lattner     return lldb_private::FileSpec::Resolve (src_path, dst_path, dst_len);
10630fdc8d8SChris Lattner }
10730fdc8d8SChris Lattner 
10830fdc8d8SChris Lattner const char *
10923fd10cbSJohnny Chen SBFileSpec::GetFilename() const
11030fdc8d8SChris Lattner {
111ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
112ceb6b139SCaroline Tice 
1136611103cSGreg Clayton     if (m_opaque_ap.get())
114ceb6b139SCaroline Tice     {
115ceb6b139SCaroline Tice         if (log)
116*93aa84e8SGreg Clayton             log->Printf ("SBFileSpec(%p)::GetFilename () => %s", m_opaque_ap.get(),
117750cd175SCaroline Tice                          m_opaque_ap->GetFilename().AsCString());
118750cd175SCaroline Tice 
1196611103cSGreg Clayton         return m_opaque_ap->GetFilename().AsCString();
120ceb6b139SCaroline Tice     }
121ceb6b139SCaroline Tice 
122ceb6b139SCaroline Tice     if (log)
123*93aa84e8SGreg Clayton         log->Printf ("SBFileSpec(%p)::GetFilename () => NULL", m_opaque_ap.get());
124ceb6b139SCaroline Tice 
12530fdc8d8SChris Lattner     return NULL;
12630fdc8d8SChris Lattner }
12730fdc8d8SChris Lattner 
12830fdc8d8SChris Lattner const char *
12930fdc8d8SChris Lattner SBFileSpec::GetDirectory() const
13030fdc8d8SChris Lattner {
1316611103cSGreg Clayton     if (m_opaque_ap.get())
1326611103cSGreg Clayton         return m_opaque_ap->GetDirectory().AsCString();
13330fdc8d8SChris Lattner     return NULL;
13430fdc8d8SChris Lattner }
13530fdc8d8SChris Lattner 
13630fdc8d8SChris Lattner uint32_t
13730fdc8d8SChris Lattner SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
13830fdc8d8SChris Lattner {
139ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
140ceb6b139SCaroline Tice 
141ceb6b139SCaroline Tice     uint32_t result;
1426611103cSGreg Clayton     if (m_opaque_ap.get())
143ceb6b139SCaroline Tice     {
144ceb6b139SCaroline Tice         result = m_opaque_ap->GetPath (dst_path, dst_len);
145ceb6b139SCaroline Tice         if (log)
146*93aa84e8SGreg Clayton             log->Printf ("SBFileSpec(%p)::GetPath (dst_path, dst_len) => dst_path='%s', dst_len='%d', "
147750cd175SCaroline Tice                          "result='%d'", m_opaque_ap.get(), dst_path, (uint32_t) dst_len, result);
148ceb6b139SCaroline Tice         return result;
149ceb6b139SCaroline Tice     }
150ceb6b139SCaroline Tice 
151ceb6b139SCaroline Tice     if (log)
152*93aa84e8SGreg Clayton         log->Printf ("SBFileSpec(%p)::GetPath (dst_path, dst_len) => NULL (0)", m_opaque_ap.get());
15330fdc8d8SChris Lattner 
15430fdc8d8SChris Lattner     if (dst_path && dst_len)
15530fdc8d8SChris Lattner         *dst_path = '\0';
15630fdc8d8SChris Lattner     return 0;
15730fdc8d8SChris Lattner }
15830fdc8d8SChris Lattner 
15930fdc8d8SChris Lattner 
16030fdc8d8SChris Lattner const lldb_private::FileSpec *
16130fdc8d8SChris Lattner SBFileSpec::operator->() const
16230fdc8d8SChris Lattner {
1636611103cSGreg Clayton     return m_opaque_ap.get();
16430fdc8d8SChris Lattner }
16530fdc8d8SChris Lattner 
16630fdc8d8SChris Lattner const lldb_private::FileSpec *
16730fdc8d8SChris Lattner SBFileSpec::get() const
16830fdc8d8SChris Lattner {
1696611103cSGreg Clayton     return m_opaque_ap.get();
17030fdc8d8SChris Lattner }
17130fdc8d8SChris Lattner 
17230fdc8d8SChris Lattner 
17330fdc8d8SChris Lattner const lldb_private::FileSpec &
17430fdc8d8SChris Lattner SBFileSpec::operator*() const
17530fdc8d8SChris Lattner {
1766611103cSGreg Clayton     return *m_opaque_ap.get();
17730fdc8d8SChris Lattner }
17830fdc8d8SChris Lattner 
17930fdc8d8SChris Lattner const lldb_private::FileSpec &
18030fdc8d8SChris Lattner SBFileSpec::ref() const
18130fdc8d8SChris Lattner {
1826611103cSGreg Clayton     return *m_opaque_ap.get();
18330fdc8d8SChris Lattner }
18430fdc8d8SChris Lattner 
18530fdc8d8SChris Lattner 
18630fdc8d8SChris Lattner void
18730fdc8d8SChris Lattner SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
18830fdc8d8SChris Lattner {
1896611103cSGreg Clayton     if (m_opaque_ap.get())
1906611103cSGreg Clayton         *m_opaque_ap = fs;
19130fdc8d8SChris Lattner     else
1926611103cSGreg Clayton         m_opaque_ap.reset (new FileSpec (fs));
19330fdc8d8SChris Lattner }
19430fdc8d8SChris Lattner 
195dde9cff3SCaroline Tice bool
196ceb6b139SCaroline Tice SBFileSpec::GetDescription (SBStream &description) const
197ceb6b139SCaroline Tice {
198ceb6b139SCaroline Tice     if (m_opaque_ap.get())
199ceb6b139SCaroline Tice     {
200ceb6b139SCaroline Tice         const char *filename = GetFilename();
201ceb6b139SCaroline Tice         const char *dir_name = GetDirectory();
202ceb6b139SCaroline Tice         if (!filename && !dir_name)
203ceb6b139SCaroline Tice             description.Printf ("No value");
204ceb6b139SCaroline Tice         else if (!dir_name)
205ceb6b139SCaroline Tice             description.Printf ("%s", filename);
206ceb6b139SCaroline Tice         else
207ceb6b139SCaroline Tice             description.Printf ("%s/%s", dir_name, filename);
208ceb6b139SCaroline Tice     }
209ceb6b139SCaroline Tice     else
210ceb6b139SCaroline Tice         description.Printf ("No value");
211ceb6b139SCaroline Tice 
212ceb6b139SCaroline Tice     return true;
213ceb6b139SCaroline Tice }
214