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"
13*ceb6b139SCaroline 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 {
23*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
24*ceb6b139SCaroline Tice 
25*ceb6b139SCaroline Tice     if (log)
26*ceb6b139SCaroline Tice         log->Printf ("SBFileSpec::SBFileSpec () ==> this = %p", this);
2730fdc8d8SChris Lattner }
2830fdc8d8SChris Lattner 
2930fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const SBFileSpec &rhs) :
306611103cSGreg Clayton     m_opaque_ap()
3130fdc8d8SChris Lattner {
32*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
33*ceb6b139SCaroline Tice 
34*ceb6b139SCaroline Tice     if (log)
35*ceb6b139SCaroline Tice     {
36*ceb6b139SCaroline Tice         SBStream sstr;
37*ceb6b139SCaroline Tice         rhs.GetDescription (sstr);
38*ceb6b139SCaroline Tice         log->Printf ("SBFileSpec::SBFileSpec (const SBFileSpec &rhs) rhs.m_opaque_ap.get() = %p (%s) ==> this = %p",
39*ceb6b139SCaroline Tice                      rhs.m_opaque_ap.get(), sstr.GetData(), this);
40*ceb6b139SCaroline Tice     }
41*ceb6b139SCaroline Tice 
426611103cSGreg Clayton     if (rhs.m_opaque_ap.get())
4323fd10cbSJohnny Chen         m_opaque_ap.reset (new FileSpec (rhs.get()));
4430fdc8d8SChris Lattner }
4530fdc8d8SChris Lattner 
46274060b6SGreg Clayton // Deprected!!!
4730fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const char *path) :
48274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, true))
49274060b6SGreg Clayton {
50274060b6SGreg Clayton }
51274060b6SGreg Clayton 
52274060b6SGreg Clayton SBFileSpec::SBFileSpec (const char *path, bool resolve) :
53274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, resolve))
5430fdc8d8SChris Lattner {
55*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
56*ceb6b139SCaroline Tice 
57*ceb6b139SCaroline Tice     if (log)
58*ceb6b139SCaroline Tice         log->Printf ("SBFileSpec::SBFileSpec (const char *path, bool resolve) path = '%s', resolve = %s ==> "
59*ceb6b139SCaroline Tice                      "this = %p (m_opaque_ap.get() = %p)", path, (resolve ? "true" : "false"), this,
60*ceb6b139SCaroline Tice                      m_opaque_ap.get());
6130fdc8d8SChris Lattner }
6230fdc8d8SChris Lattner 
6330fdc8d8SChris Lattner SBFileSpec::~SBFileSpec ()
6430fdc8d8SChris Lattner {
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner const SBFileSpec &
6830fdc8d8SChris Lattner SBFileSpec::operator = (const SBFileSpec &rhs)
6930fdc8d8SChris Lattner {
7030fdc8d8SChris Lattner     if (this != &rhs)
7130fdc8d8SChris Lattner     {
7230fdc8d8SChris Lattner         if (rhs.IsValid())
736611103cSGreg Clayton             m_opaque_ap.reset (new lldb_private::FileSpec(*rhs.m_opaque_ap.get()));
7430fdc8d8SChris Lattner     }
7530fdc8d8SChris Lattner     return *this;
7630fdc8d8SChris Lattner }
7730fdc8d8SChris Lattner 
7830fdc8d8SChris Lattner bool
7930fdc8d8SChris Lattner SBFileSpec::IsValid() const
8030fdc8d8SChris Lattner {
816611103cSGreg Clayton     return m_opaque_ap.get() != NULL;
8230fdc8d8SChris Lattner }
8330fdc8d8SChris Lattner 
8430fdc8d8SChris Lattner bool
8530fdc8d8SChris Lattner SBFileSpec::Exists () const
8630fdc8d8SChris Lattner {
87*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
88*ceb6b139SCaroline Tice 
89*ceb6b139SCaroline Tice     if (log)
90*ceb6b139SCaroline Tice         log->Printf ("SBFileSpec::Exists ()");
91*ceb6b139SCaroline Tice 
92*ceb6b139SCaroline Tice     bool result = false;
936611103cSGreg Clayton     if (m_opaque_ap.get())
94*ceb6b139SCaroline Tice         result = m_opaque_ap->Exists();
95*ceb6b139SCaroline Tice 
96*ceb6b139SCaroline Tice     if (log)
97*ceb6b139SCaroline Tice         log->Printf ("SBFileSpec::Exists ==> %s", (result ? "true" : "false"));
98*ceb6b139SCaroline Tice 
99*ceb6b139SCaroline Tice     return result;
10030fdc8d8SChris Lattner }
10130fdc8d8SChris Lattner 
102428a9a58SCaroline Tice bool
103428a9a58SCaroline Tice SBFileSpec::ResolveExecutableLocation ()
104428a9a58SCaroline Tice {
105428a9a58SCaroline Tice     if (m_opaque_ap.get())
106428a9a58SCaroline Tice         return m_opaque_ap->ResolveExecutableLocation ();
107428a9a58SCaroline Tice     return false;
108428a9a58SCaroline Tice }
10930fdc8d8SChris Lattner 
11030fdc8d8SChris Lattner int
11130fdc8d8SChris Lattner SBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)
11230fdc8d8SChris Lattner {
11330fdc8d8SChris Lattner     return lldb_private::FileSpec::Resolve (src_path, dst_path, dst_len);
11430fdc8d8SChris Lattner }
11530fdc8d8SChris Lattner 
11630fdc8d8SChris Lattner const char *
11723fd10cbSJohnny Chen SBFileSpec::GetFilename() const
11830fdc8d8SChris Lattner {
119*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
120*ceb6b139SCaroline Tice 
121*ceb6b139SCaroline Tice     if (log)
122*ceb6b139SCaroline Tice         log->Printf ("SBFileSpec::GetFilename ()");
123*ceb6b139SCaroline Tice 
1246611103cSGreg Clayton     if (m_opaque_ap.get())
125*ceb6b139SCaroline Tice     {
126*ceb6b139SCaroline Tice         if (log)
127*ceb6b139SCaroline Tice             log->Printf ("SBFileSpec::GetFilename ==> %s", m_opaque_ap->GetFilename().AsCString());
1286611103cSGreg Clayton         return m_opaque_ap->GetFilename().AsCString();
129*ceb6b139SCaroline Tice     }
130*ceb6b139SCaroline Tice 
131*ceb6b139SCaroline Tice     if (log)
132*ceb6b139SCaroline Tice         log->Printf ("SBFileSpec::GetFilename ==> NULL");
133*ceb6b139SCaroline Tice 
13430fdc8d8SChris Lattner     return NULL;
13530fdc8d8SChris Lattner }
13630fdc8d8SChris Lattner 
13730fdc8d8SChris Lattner const char *
13830fdc8d8SChris Lattner SBFileSpec::GetDirectory() const
13930fdc8d8SChris Lattner {
1406611103cSGreg Clayton     if (m_opaque_ap.get())
1416611103cSGreg Clayton         return m_opaque_ap->GetDirectory().AsCString();
14230fdc8d8SChris Lattner     return NULL;
14330fdc8d8SChris Lattner }
14430fdc8d8SChris Lattner 
14530fdc8d8SChris Lattner uint32_t
14630fdc8d8SChris Lattner SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
14730fdc8d8SChris Lattner {
148*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
149*ceb6b139SCaroline Tice 
150*ceb6b139SCaroline Tice     if (log)
151*ceb6b139SCaroline Tice         log->Printf ("SBFileSpec::GetPath (dst_path, dst_len)");
152*ceb6b139SCaroline Tice 
153*ceb6b139SCaroline Tice     uint32_t result;
1546611103cSGreg Clayton     if (m_opaque_ap.get())
155*ceb6b139SCaroline Tice     {
156*ceb6b139SCaroline Tice         result = m_opaque_ap->GetPath (dst_path, dst_len);
157*ceb6b139SCaroline Tice         if (log)
158*ceb6b139SCaroline Tice             log->Printf ("SBFileSpec::GetPath ==> %s (%d)", dst_path, result);
159*ceb6b139SCaroline Tice         return result;
160*ceb6b139SCaroline Tice     }
161*ceb6b139SCaroline Tice 
162*ceb6b139SCaroline Tice     if (log)
163*ceb6b139SCaroline Tice         log->Printf ("SBFileSpec::GetPath ==> NULL (0)");
16430fdc8d8SChris Lattner 
16530fdc8d8SChris Lattner     if (dst_path && dst_len)
16630fdc8d8SChris Lattner         *dst_path = '\0';
16730fdc8d8SChris Lattner     return 0;
16830fdc8d8SChris Lattner }
16930fdc8d8SChris Lattner 
17030fdc8d8SChris Lattner 
17130fdc8d8SChris Lattner const lldb_private::FileSpec *
17230fdc8d8SChris Lattner SBFileSpec::operator->() const
17330fdc8d8SChris Lattner {
1746611103cSGreg Clayton     return m_opaque_ap.get();
17530fdc8d8SChris Lattner }
17630fdc8d8SChris Lattner 
17730fdc8d8SChris Lattner const lldb_private::FileSpec *
17830fdc8d8SChris Lattner SBFileSpec::get() const
17930fdc8d8SChris Lattner {
1806611103cSGreg Clayton     return m_opaque_ap.get();
18130fdc8d8SChris Lattner }
18230fdc8d8SChris Lattner 
18330fdc8d8SChris Lattner 
18430fdc8d8SChris Lattner const lldb_private::FileSpec &
18530fdc8d8SChris Lattner SBFileSpec::operator*() const
18630fdc8d8SChris Lattner {
1876611103cSGreg Clayton     return *m_opaque_ap.get();
18830fdc8d8SChris Lattner }
18930fdc8d8SChris Lattner 
19030fdc8d8SChris Lattner const lldb_private::FileSpec &
19130fdc8d8SChris Lattner SBFileSpec::ref() const
19230fdc8d8SChris Lattner {
1936611103cSGreg Clayton     return *m_opaque_ap.get();
19430fdc8d8SChris Lattner }
19530fdc8d8SChris Lattner 
19630fdc8d8SChris Lattner 
19730fdc8d8SChris Lattner void
19830fdc8d8SChris Lattner SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
19930fdc8d8SChris Lattner {
2006611103cSGreg Clayton     if (m_opaque_ap.get())
2016611103cSGreg Clayton         *m_opaque_ap = fs;
20230fdc8d8SChris Lattner     else
2036611103cSGreg Clayton         m_opaque_ap.reset (new FileSpec (fs));
20430fdc8d8SChris Lattner }
20530fdc8d8SChris Lattner 
206dde9cff3SCaroline Tice bool
207dde9cff3SCaroline Tice SBFileSpec::GetDescription (SBStream &description)
208dde9cff3SCaroline Tice {
209dde9cff3SCaroline Tice     if (m_opaque_ap.get())
210dde9cff3SCaroline Tice     {
211dde9cff3SCaroline Tice         const char *filename = GetFilename();
212dde9cff3SCaroline Tice         const char *dir_name = GetDirectory();
213dde9cff3SCaroline Tice         if (!filename && !dir_name)
214dde9cff3SCaroline Tice             description.Printf ("No value");
215dde9cff3SCaroline Tice         else if (!dir_name)
216dde9cff3SCaroline Tice             description.Printf ("%s", filename);
217dde9cff3SCaroline Tice         else
218dde9cff3SCaroline Tice             description.Printf ("%s/%s", dir_name, filename);
219dde9cff3SCaroline Tice     }
220dde9cff3SCaroline Tice     else
221dde9cff3SCaroline Tice         description.Printf ("No value");
222dde9cff3SCaroline Tice 
223dde9cff3SCaroline Tice     return true;
224dde9cff3SCaroline Tice }
225*ceb6b139SCaroline Tice 
226*ceb6b139SCaroline Tice bool
227*ceb6b139SCaroline Tice SBFileSpec::GetDescription (SBStream &description) const
228*ceb6b139SCaroline Tice {
229*ceb6b139SCaroline Tice     if (m_opaque_ap.get())
230*ceb6b139SCaroline Tice     {
231*ceb6b139SCaroline Tice         const char *filename = GetFilename();
232*ceb6b139SCaroline Tice         const char *dir_name = GetDirectory();
233*ceb6b139SCaroline Tice         if (!filename && !dir_name)
234*ceb6b139SCaroline Tice             description.Printf ("No value");
235*ceb6b139SCaroline Tice         else if (!dir_name)
236*ceb6b139SCaroline Tice             description.Printf ("%s", filename);
237*ceb6b139SCaroline Tice         else
238*ceb6b139SCaroline Tice             description.Printf ("%s/%s", dir_name, filename);
239*ceb6b139SCaroline Tice     }
240*ceb6b139SCaroline Tice     else
241*ceb6b139SCaroline Tice         description.Printf ("No value");
242*ceb6b139SCaroline Tice 
243*ceb6b139SCaroline Tice     return true;
244*ceb6b139SCaroline Tice }
245