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*cfd1acedSGreg 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*cfd1acedSGreg Clayton         log->Printf ("SBFileSpec::SBFileSpec (path=\"%s\", resolve=%i) => SBFileSpec(%p)", path,
5593aa84e8SGreg 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)
8993aa84e8SGreg 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 {
1114838131bSGreg Clayton     const char *s = NULL;
1126611103cSGreg Clayton     if (m_opaque_ap.get())
1134838131bSGreg Clayton         s = m_opaque_ap->GetFilename().AsCString();
1144838131bSGreg Clayton 
1154838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
116ceb6b139SCaroline Tice     if (log)
117*cfd1acedSGreg Clayton     {
118*cfd1acedSGreg Clayton         if (s)
119*cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetFilename () => \"%s\"", m_opaque_ap.get(), s);
120*cfd1acedSGreg Clayton         else
121*cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetFilename () => NULL", m_opaque_ap.get());
122*cfd1acedSGreg Clayton     }
123750cd175SCaroline Tice 
1244838131bSGreg Clayton     return s;
12530fdc8d8SChris Lattner }
12630fdc8d8SChris Lattner 
12730fdc8d8SChris Lattner const char *
12830fdc8d8SChris Lattner SBFileSpec::GetDirectory() const
12930fdc8d8SChris Lattner {
1304838131bSGreg Clayton     const char *s = NULL;
1316611103cSGreg Clayton     if (m_opaque_ap.get())
1324838131bSGreg Clayton         s = m_opaque_ap->GetDirectory().AsCString();
1334838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
1344838131bSGreg Clayton     if (log)
135*cfd1acedSGreg Clayton     {
136*cfd1acedSGreg Clayton         if (s)
137*cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetDirectory () => \"%s\"", m_opaque_ap.get(), s);
138*cfd1acedSGreg Clayton         else
139*cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetDirectory () => NULL", m_opaque_ap.get());
140*cfd1acedSGreg Clayton     }
1414838131bSGreg Clayton     return s;
14230fdc8d8SChris Lattner }
14330fdc8d8SChris Lattner 
14430fdc8d8SChris Lattner uint32_t
14530fdc8d8SChris Lattner SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
14630fdc8d8SChris Lattner {
147ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
148ceb6b139SCaroline Tice 
149*cfd1acedSGreg Clayton     uint32_t result = 0;
1506611103cSGreg Clayton     if (m_opaque_ap.get())
151ceb6b139SCaroline Tice         result = m_opaque_ap->GetPath (dst_path, dst_len);
152ceb6b139SCaroline Tice 
153ceb6b139SCaroline Tice     if (log)
154*cfd1acedSGreg Clayton         log->Printf ("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%zu) => %u",
155*cfd1acedSGreg Clayton                      m_opaque_ap.get(), result, dst_path, dst_len, result);
15630fdc8d8SChris Lattner 
157*cfd1acedSGreg Clayton     if (result == 0 && dst_path && dst_len > 0)
15830fdc8d8SChris Lattner         *dst_path = '\0';
159*cfd1acedSGreg Clayton     return result;
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
16230fdc8d8SChris Lattner 
16330fdc8d8SChris Lattner const lldb_private::FileSpec *
16430fdc8d8SChris Lattner SBFileSpec::operator->() const
16530fdc8d8SChris Lattner {
1666611103cSGreg Clayton     return m_opaque_ap.get();
16730fdc8d8SChris Lattner }
16830fdc8d8SChris Lattner 
16930fdc8d8SChris Lattner const lldb_private::FileSpec *
17030fdc8d8SChris Lattner SBFileSpec::get() const
17130fdc8d8SChris Lattner {
1726611103cSGreg Clayton     return m_opaque_ap.get();
17330fdc8d8SChris Lattner }
17430fdc8d8SChris Lattner 
17530fdc8d8SChris Lattner 
17630fdc8d8SChris Lattner const lldb_private::FileSpec &
17730fdc8d8SChris Lattner SBFileSpec::operator*() const
17830fdc8d8SChris Lattner {
1796611103cSGreg Clayton     return *m_opaque_ap.get();
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner const lldb_private::FileSpec &
18330fdc8d8SChris Lattner SBFileSpec::ref() const
18430fdc8d8SChris Lattner {
1856611103cSGreg Clayton     return *m_opaque_ap.get();
18630fdc8d8SChris Lattner }
18730fdc8d8SChris Lattner 
18830fdc8d8SChris Lattner 
18930fdc8d8SChris Lattner void
19030fdc8d8SChris Lattner SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
19130fdc8d8SChris Lattner {
1926611103cSGreg Clayton     if (m_opaque_ap.get())
1936611103cSGreg Clayton         *m_opaque_ap = fs;
19430fdc8d8SChris Lattner     else
1956611103cSGreg Clayton         m_opaque_ap.reset (new FileSpec (fs));
19630fdc8d8SChris Lattner }
19730fdc8d8SChris Lattner 
198dde9cff3SCaroline Tice bool
199ceb6b139SCaroline Tice SBFileSpec::GetDescription (SBStream &description) const
200ceb6b139SCaroline Tice {
201ceb6b139SCaroline Tice     if (m_opaque_ap.get())
202ceb6b139SCaroline Tice     {
203*cfd1acedSGreg Clayton         char path[PATH_MAX];
204*cfd1acedSGreg Clayton         if (m_opaque_ap->GetPath(path, sizeof(path)))
205*cfd1acedSGreg Clayton             description.Printf ("%s", path);
206ceb6b139SCaroline Tice     }
207ceb6b139SCaroline Tice     else
208ceb6b139SCaroline Tice         description.Printf ("No value");
209ceb6b139SCaroline Tice 
210ceb6b139SCaroline Tice     return true;
211ceb6b139SCaroline Tice }
212