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 {
28*750cd175SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
29*750cd175SCaroline Tice 
30*750cd175SCaroline Tice     if (rhs.m_opaque_ap.get())
31*750cd175SCaroline Tice         m_opaque_ap.reset (new FileSpec (rhs.get()));
32ceb6b139SCaroline Tice 
33ceb6b139SCaroline Tice     if (log)
34ceb6b139SCaroline Tice     {
35ceb6b139SCaroline Tice         SBStream sstr;
36*750cd175SCaroline Tice         GetDescription (sstr);
37*750cd175SCaroline Tice         log->Printf ("SBFileSpec::SBFileSpec (const SBFileSpec rhs.ap=%p) => this.ap = %p ('%s')",
38*750cd175SCaroline 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 {
51*750cd175SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
52ceb6b139SCaroline Tice 
53ceb6b139SCaroline Tice     if (log)
54*750cd175SCaroline Tice         log->Printf ("SBFileSpec::SBFileSpec (path='%s', resolve='%s') => this.ap = %p", path,
55*750cd175SCaroline Tice                      (resolve ? "true" : "false"), 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 
84*750cd175SCaroline Tice     //if (log)
85*750cd175SCaroline Tice     //    log->Printf ("SBFileSpec::Exists (this.ap=%p)", m_opaque_ap.get());
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)
92*750cd175SCaroline Tice         log->Printf ("SBFileSpec::Exists (this.ap=%p) => %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 {
114ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
115ceb6b139SCaroline Tice 
116*750cd175SCaroline Tice     //if (log)
117*750cd175SCaroline Tice     //    log->Printf ("SBFileSpec::GetFilename (this.ap=%p)", m_opaque_ap.get());
118ceb6b139SCaroline Tice 
1196611103cSGreg Clayton     if (m_opaque_ap.get())
120ceb6b139SCaroline Tice     {
121ceb6b139SCaroline Tice         if (log)
122*750cd175SCaroline Tice             log->Printf ("SBFileSpec::GetFilename (this.ap=%p) => %s", m_opaque_ap.get(),
123*750cd175SCaroline Tice                          m_opaque_ap->GetFilename().AsCString());
124*750cd175SCaroline Tice 
1256611103cSGreg Clayton         return m_opaque_ap->GetFilename().AsCString();
126ceb6b139SCaroline Tice     }
127ceb6b139SCaroline Tice 
128ceb6b139SCaroline Tice     if (log)
129*750cd175SCaroline Tice         log->Printf ("SBFileSpec::GetFilename (this.ap=%p) => NULL", m_opaque_ap.get());
130ceb6b139SCaroline Tice 
13130fdc8d8SChris Lattner     return NULL;
13230fdc8d8SChris Lattner }
13330fdc8d8SChris Lattner 
13430fdc8d8SChris Lattner const char *
13530fdc8d8SChris Lattner SBFileSpec::GetDirectory() const
13630fdc8d8SChris Lattner {
1376611103cSGreg Clayton     if (m_opaque_ap.get())
1386611103cSGreg Clayton         return m_opaque_ap->GetDirectory().AsCString();
13930fdc8d8SChris Lattner     return NULL;
14030fdc8d8SChris Lattner }
14130fdc8d8SChris Lattner 
14230fdc8d8SChris Lattner uint32_t
14330fdc8d8SChris Lattner SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
14430fdc8d8SChris Lattner {
145ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
146ceb6b139SCaroline Tice 
147*750cd175SCaroline Tice     //if (log)
148*750cd175SCaroline Tice     //    log->Printf ("SBFileSpec::GetPath (dst_path, dst_len)");
149ceb6b139SCaroline Tice 
150ceb6b139SCaroline Tice     uint32_t result;
1516611103cSGreg Clayton     if (m_opaque_ap.get())
152ceb6b139SCaroline Tice     {
153ceb6b139SCaroline Tice         result = m_opaque_ap->GetPath (dst_path, dst_len);
154ceb6b139SCaroline Tice         if (log)
155*750cd175SCaroline Tice             log->Printf ("SBFileSpec::GetPath (this.ap=%p, dst_path, dst_len) => dst_path='%s', dst_len='%d', "
156*750cd175SCaroline Tice                          "result='%d'", m_opaque_ap.get(), dst_path, (uint32_t) dst_len, result);
157ceb6b139SCaroline Tice         return result;
158ceb6b139SCaroline Tice     }
159ceb6b139SCaroline Tice 
160ceb6b139SCaroline Tice     if (log)
161*750cd175SCaroline Tice         log->Printf ("SBFileSpec::GetPath (this.ap=%p, dst_path, dst_len) => NULL (0)", m_opaque_ap.get());
16230fdc8d8SChris Lattner 
16330fdc8d8SChris Lattner     if (dst_path && dst_len)
16430fdc8d8SChris Lattner         *dst_path = '\0';
16530fdc8d8SChris Lattner     return 0;
16630fdc8d8SChris Lattner }
16730fdc8d8SChris Lattner 
16830fdc8d8SChris Lattner 
16930fdc8d8SChris Lattner const lldb_private::FileSpec *
17030fdc8d8SChris Lattner SBFileSpec::operator->() const
17130fdc8d8SChris Lattner {
1726611103cSGreg Clayton     return m_opaque_ap.get();
17330fdc8d8SChris Lattner }
17430fdc8d8SChris Lattner 
17530fdc8d8SChris Lattner const lldb_private::FileSpec *
17630fdc8d8SChris Lattner SBFileSpec::get() const
17730fdc8d8SChris Lattner {
1786611103cSGreg Clayton     return m_opaque_ap.get();
17930fdc8d8SChris Lattner }
18030fdc8d8SChris Lattner 
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner const lldb_private::FileSpec &
18330fdc8d8SChris Lattner SBFileSpec::operator*() const
18430fdc8d8SChris Lattner {
1856611103cSGreg Clayton     return *m_opaque_ap.get();
18630fdc8d8SChris Lattner }
18730fdc8d8SChris Lattner 
18830fdc8d8SChris Lattner const lldb_private::FileSpec &
18930fdc8d8SChris Lattner SBFileSpec::ref() const
19030fdc8d8SChris Lattner {
1916611103cSGreg Clayton     return *m_opaque_ap.get();
19230fdc8d8SChris Lattner }
19330fdc8d8SChris Lattner 
19430fdc8d8SChris Lattner 
19530fdc8d8SChris Lattner void
19630fdc8d8SChris Lattner SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
19730fdc8d8SChris Lattner {
1986611103cSGreg Clayton     if (m_opaque_ap.get())
1996611103cSGreg Clayton         *m_opaque_ap = fs;
20030fdc8d8SChris Lattner     else
2016611103cSGreg Clayton         m_opaque_ap.reset (new FileSpec (fs));
20230fdc8d8SChris Lattner }
20330fdc8d8SChris Lattner 
204dde9cff3SCaroline Tice bool
205dde9cff3SCaroline Tice SBFileSpec::GetDescription (SBStream &description)
206dde9cff3SCaroline Tice {
207dde9cff3SCaroline Tice     if (m_opaque_ap.get())
208dde9cff3SCaroline Tice     {
209dde9cff3SCaroline Tice         const char *filename = GetFilename();
210dde9cff3SCaroline Tice         const char *dir_name = GetDirectory();
211dde9cff3SCaroline Tice         if (!filename && !dir_name)
212dde9cff3SCaroline Tice             description.Printf ("No value");
213dde9cff3SCaroline Tice         else if (!dir_name)
214dde9cff3SCaroline Tice             description.Printf ("%s", filename);
215dde9cff3SCaroline Tice         else
216dde9cff3SCaroline Tice             description.Printf ("%s/%s", dir_name, filename);
217dde9cff3SCaroline Tice     }
218dde9cff3SCaroline Tice     else
219dde9cff3SCaroline Tice         description.Printf ("No value");
220dde9cff3SCaroline Tice 
221dde9cff3SCaroline Tice     return true;
222dde9cff3SCaroline Tice }
223ceb6b139SCaroline Tice 
224ceb6b139SCaroline Tice bool
225ceb6b139SCaroline Tice SBFileSpec::GetDescription (SBStream &description) const
226ceb6b139SCaroline Tice {
227ceb6b139SCaroline Tice     if (m_opaque_ap.get())
228ceb6b139SCaroline Tice     {
229ceb6b139SCaroline Tice         const char *filename = GetFilename();
230ceb6b139SCaroline Tice         const char *dir_name = GetDirectory();
231ceb6b139SCaroline Tice         if (!filename && !dir_name)
232ceb6b139SCaroline Tice             description.Printf ("No value");
233ceb6b139SCaroline Tice         else if (!dir_name)
234ceb6b139SCaroline Tice             description.Printf ("%s", filename);
235ceb6b139SCaroline Tice         else
236ceb6b139SCaroline Tice             description.Printf ("%s/%s", dir_name, filename);
237ceb6b139SCaroline Tice     }
238ceb6b139SCaroline Tice     else
239ceb6b139SCaroline Tice         description.Printf ("No value");
240ceb6b139SCaroline Tice 
241ceb6b139SCaroline Tice     return true;
242ceb6b139SCaroline Tice }
243