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);
3793aa84e8SGreg 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)
5493aa84e8SGreg 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 {
111*4838131bSGreg Clayton     const char *s = NULL;
1126611103cSGreg Clayton     if (m_opaque_ap.get())
113*4838131bSGreg Clayton         s = m_opaque_ap->GetFilename().AsCString();
114*4838131bSGreg Clayton 
115*4838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
116ceb6b139SCaroline Tice     if (log)
117*4838131bSGreg Clayton         log->Printf ("SBFileSpec(%p)::GetFilename () => \"%s\"", m_opaque_ap.get(), s ? s : "");
118750cd175SCaroline Tice 
119*4838131bSGreg Clayton     return s;
12030fdc8d8SChris Lattner }
12130fdc8d8SChris Lattner 
12230fdc8d8SChris Lattner const char *
12330fdc8d8SChris Lattner SBFileSpec::GetDirectory() const
12430fdc8d8SChris Lattner {
125*4838131bSGreg Clayton     const char *s = NULL;
1266611103cSGreg Clayton     if (m_opaque_ap.get())
127*4838131bSGreg Clayton         s = m_opaque_ap->GetDirectory().AsCString();
128*4838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
129*4838131bSGreg Clayton     if (log)
130*4838131bSGreg Clayton         log->Printf ("SBFileSpec(%p)::GetDirectory () => \"%s\"", m_opaque_ap.get(), s ? s : "");
131*4838131bSGreg Clayton     return s;
13230fdc8d8SChris Lattner }
13330fdc8d8SChris Lattner 
13430fdc8d8SChris Lattner uint32_t
13530fdc8d8SChris Lattner SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
13630fdc8d8SChris Lattner {
137ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
138ceb6b139SCaroline Tice 
139ceb6b139SCaroline Tice     uint32_t result;
1406611103cSGreg Clayton     if (m_opaque_ap.get())
141ceb6b139SCaroline Tice     {
142ceb6b139SCaroline Tice         result = m_opaque_ap->GetPath (dst_path, dst_len);
143ceb6b139SCaroline Tice         if (log)
14493aa84e8SGreg Clayton             log->Printf ("SBFileSpec(%p)::GetPath (dst_path, dst_len) => dst_path='%s', dst_len='%d', "
145750cd175SCaroline Tice                          "result='%d'", m_opaque_ap.get(), dst_path, (uint32_t) dst_len, result);
146ceb6b139SCaroline Tice         return result;
147ceb6b139SCaroline Tice     }
148ceb6b139SCaroline Tice 
149ceb6b139SCaroline Tice     if (log)
15093aa84e8SGreg Clayton         log->Printf ("SBFileSpec(%p)::GetPath (dst_path, dst_len) => NULL (0)", m_opaque_ap.get());
15130fdc8d8SChris Lattner 
15230fdc8d8SChris Lattner     if (dst_path && dst_len)
15330fdc8d8SChris Lattner         *dst_path = '\0';
15430fdc8d8SChris Lattner     return 0;
15530fdc8d8SChris Lattner }
15630fdc8d8SChris Lattner 
15730fdc8d8SChris Lattner 
15830fdc8d8SChris Lattner const lldb_private::FileSpec *
15930fdc8d8SChris Lattner SBFileSpec::operator->() const
16030fdc8d8SChris Lattner {
1616611103cSGreg Clayton     return m_opaque_ap.get();
16230fdc8d8SChris Lattner }
16330fdc8d8SChris Lattner 
16430fdc8d8SChris Lattner const lldb_private::FileSpec *
16530fdc8d8SChris Lattner SBFileSpec::get() const
16630fdc8d8SChris Lattner {
1676611103cSGreg Clayton     return m_opaque_ap.get();
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::ref() const
17930fdc8d8SChris Lattner {
1806611103cSGreg Clayton     return *m_opaque_ap.get();
18130fdc8d8SChris Lattner }
18230fdc8d8SChris Lattner 
18330fdc8d8SChris Lattner 
18430fdc8d8SChris Lattner void
18530fdc8d8SChris Lattner SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
18630fdc8d8SChris Lattner {
1876611103cSGreg Clayton     if (m_opaque_ap.get())
1886611103cSGreg Clayton         *m_opaque_ap = fs;
18930fdc8d8SChris Lattner     else
1906611103cSGreg Clayton         m_opaque_ap.reset (new FileSpec (fs));
19130fdc8d8SChris Lattner }
19230fdc8d8SChris Lattner 
193dde9cff3SCaroline Tice bool
194ceb6b139SCaroline Tice SBFileSpec::GetDescription (SBStream &description) const
195ceb6b139SCaroline Tice {
196ceb6b139SCaroline Tice     if (m_opaque_ap.get())
197ceb6b139SCaroline Tice     {
198ceb6b139SCaroline Tice         const char *filename = GetFilename();
199ceb6b139SCaroline Tice         const char *dir_name = GetDirectory();
200ceb6b139SCaroline Tice         if (!filename && !dir_name)
201ceb6b139SCaroline Tice             description.Printf ("No value");
202ceb6b139SCaroline Tice         else if (!dir_name)
203ceb6b139SCaroline Tice             description.Printf ("%s", filename);
204ceb6b139SCaroline Tice         else
205ceb6b139SCaroline Tice             description.Printf ("%s/%s", dir_name, filename);
206ceb6b139SCaroline Tice     }
207ceb6b139SCaroline Tice     else
208ceb6b139SCaroline Tice         description.Printf ("No value");
209ceb6b139SCaroline Tice 
210ceb6b139SCaroline Tice     return true;
211ceb6b139SCaroline Tice }
212