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 
10*8acdbb8aSStephen Wilson #include <limits.h>
11*8acdbb8aSStephen Wilson 
1230fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h"
13dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1453239f00SGreg Clayton #include "lldb/Host/FileSpec.h"
15ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
1630fdc8d8SChris Lattner 
1730fdc8d8SChris Lattner using namespace lldb;
1830fdc8d8SChris Lattner using namespace lldb_private;
1930fdc8d8SChris Lattner 
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner SBFileSpec::SBFileSpec () :
236611103cSGreg Clayton     m_opaque_ap()
2430fdc8d8SChris Lattner {
2530fdc8d8SChris Lattner }
2630fdc8d8SChris Lattner 
2730fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const SBFileSpec &rhs) :
286611103cSGreg Clayton     m_opaque_ap()
2930fdc8d8SChris Lattner {
302d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
31750cd175SCaroline Tice 
32750cd175SCaroline Tice     if (rhs.m_opaque_ap.get())
33750cd175SCaroline Tice         m_opaque_ap.reset (new FileSpec (rhs.get()));
34ceb6b139SCaroline Tice 
35ceb6b139SCaroline Tice     if (log)
36ceb6b139SCaroline Tice     {
37ceb6b139SCaroline Tice         SBStream sstr;
38750cd175SCaroline Tice         GetDescription (sstr);
39cfd1acedSGreg Clayton         log->Printf ("SBFileSpec::SBFileSpec (const SBFileSpec rhs.ap=%p) => SBFileSpec(%p): %s",
40750cd175SCaroline Tice                      rhs.m_opaque_ap.get(), m_opaque_ap.get(), sstr.GetData());
41ceb6b139SCaroline Tice     }
4230fdc8d8SChris Lattner }
4330fdc8d8SChris Lattner 
44274060b6SGreg Clayton // Deprected!!!
4530fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const char *path) :
46274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, true))
47274060b6SGreg Clayton {
48274060b6SGreg Clayton }
49274060b6SGreg Clayton 
50274060b6SGreg Clayton SBFileSpec::SBFileSpec (const char *path, bool resolve) :
51274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, resolve))
5230fdc8d8SChris Lattner {
532d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
54ceb6b139SCaroline Tice 
55ceb6b139SCaroline Tice     if (log)
56cfd1acedSGreg Clayton         log->Printf ("SBFileSpec::SBFileSpec (path=\"%s\", resolve=%i) => SBFileSpec(%p)", path,
5793aa84e8SGreg Clayton                      resolve, m_opaque_ap.get());
5830fdc8d8SChris Lattner }
5930fdc8d8SChris Lattner 
6030fdc8d8SChris Lattner SBFileSpec::~SBFileSpec ()
6130fdc8d8SChris Lattner {
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner 
6430fdc8d8SChris Lattner const SBFileSpec &
6530fdc8d8SChris Lattner SBFileSpec::operator = (const SBFileSpec &rhs)
6630fdc8d8SChris Lattner {
6730fdc8d8SChris Lattner     if (this != &rhs)
6830fdc8d8SChris Lattner     {
6930fdc8d8SChris Lattner         if (rhs.IsValid())
706611103cSGreg Clayton             m_opaque_ap.reset (new lldb_private::FileSpec(*rhs.m_opaque_ap.get()));
7130fdc8d8SChris Lattner     }
7230fdc8d8SChris Lattner     return *this;
7330fdc8d8SChris Lattner }
7430fdc8d8SChris Lattner 
7530fdc8d8SChris Lattner bool
7630fdc8d8SChris Lattner SBFileSpec::IsValid() const
7730fdc8d8SChris Lattner {
786611103cSGreg Clayton     return m_opaque_ap.get() != NULL;
7930fdc8d8SChris Lattner }
8030fdc8d8SChris Lattner 
8130fdc8d8SChris Lattner bool
8230fdc8d8SChris Lattner SBFileSpec::Exists () const
8330fdc8d8SChris Lattner {
842d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
85ceb6b139SCaroline Tice 
86ceb6b139SCaroline Tice     bool result = false;
876611103cSGreg Clayton     if (m_opaque_ap.get())
88ceb6b139SCaroline Tice         result = m_opaque_ap->Exists();
89ceb6b139SCaroline Tice 
90ceb6b139SCaroline Tice     if (log)
9193aa84e8SGreg Clayton         log->Printf ("SBFileSpec(%p)::Exists () => %s", m_opaque_ap.get(), (result ? "true" : "false"));
92ceb6b139SCaroline Tice 
93ceb6b139SCaroline Tice     return result;
9430fdc8d8SChris Lattner }
9530fdc8d8SChris Lattner 
96428a9a58SCaroline Tice bool
97428a9a58SCaroline Tice SBFileSpec::ResolveExecutableLocation ()
98428a9a58SCaroline Tice {
99428a9a58SCaroline Tice     if (m_opaque_ap.get())
100428a9a58SCaroline Tice         return m_opaque_ap->ResolveExecutableLocation ();
101428a9a58SCaroline Tice     return false;
102428a9a58SCaroline Tice }
10330fdc8d8SChris Lattner 
10430fdc8d8SChris Lattner int
10530fdc8d8SChris Lattner SBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)
10630fdc8d8SChris Lattner {
10730fdc8d8SChris Lattner     return lldb_private::FileSpec::Resolve (src_path, dst_path, dst_len);
10830fdc8d8SChris Lattner }
10930fdc8d8SChris Lattner 
11030fdc8d8SChris Lattner const char *
11123fd10cbSJohnny Chen SBFileSpec::GetFilename() const
11230fdc8d8SChris Lattner {
1134838131bSGreg Clayton     const char *s = NULL;
1146611103cSGreg Clayton     if (m_opaque_ap.get())
1154838131bSGreg Clayton         s = m_opaque_ap->GetFilename().AsCString();
1164838131bSGreg Clayton 
1172d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
118ceb6b139SCaroline Tice     if (log)
119cfd1acedSGreg Clayton     {
120cfd1acedSGreg Clayton         if (s)
121cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetFilename () => \"%s\"", m_opaque_ap.get(), s);
122cfd1acedSGreg Clayton         else
123cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetFilename () => NULL", m_opaque_ap.get());
124cfd1acedSGreg Clayton     }
125750cd175SCaroline Tice 
1264838131bSGreg Clayton     return s;
12730fdc8d8SChris Lattner }
12830fdc8d8SChris Lattner 
12930fdc8d8SChris Lattner const char *
13030fdc8d8SChris Lattner SBFileSpec::GetDirectory() const
13130fdc8d8SChris Lattner {
1324838131bSGreg Clayton     const char *s = NULL;
1336611103cSGreg Clayton     if (m_opaque_ap.get())
1344838131bSGreg Clayton         s = m_opaque_ap->GetDirectory().AsCString();
1352d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1364838131bSGreg Clayton     if (log)
137cfd1acedSGreg Clayton     {
138cfd1acedSGreg Clayton         if (s)
139cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetDirectory () => \"%s\"", m_opaque_ap.get(), s);
140cfd1acedSGreg Clayton         else
141cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetDirectory () => NULL", m_opaque_ap.get());
142cfd1acedSGreg Clayton     }
1434838131bSGreg Clayton     return s;
14430fdc8d8SChris Lattner }
14530fdc8d8SChris Lattner 
14630fdc8d8SChris Lattner uint32_t
14730fdc8d8SChris Lattner SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
14830fdc8d8SChris Lattner {
1492d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
150ceb6b139SCaroline Tice 
151cfd1acedSGreg Clayton     uint32_t result = 0;
1526611103cSGreg Clayton     if (m_opaque_ap.get())
153ceb6b139SCaroline Tice         result = m_opaque_ap->GetPath (dst_path, dst_len);
154ceb6b139SCaroline Tice 
155ceb6b139SCaroline Tice     if (log)
156cfd1acedSGreg Clayton         log->Printf ("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%zu) => %u",
157cfd1acedSGreg Clayton                      m_opaque_ap.get(), result, dst_path, dst_len, result);
15830fdc8d8SChris Lattner 
159cfd1acedSGreg Clayton     if (result == 0 && dst_path && dst_len > 0)
16030fdc8d8SChris Lattner         *dst_path = '\0';
161cfd1acedSGreg Clayton     return result;
16230fdc8d8SChris Lattner }
16330fdc8d8SChris Lattner 
16430fdc8d8SChris Lattner 
16530fdc8d8SChris Lattner const lldb_private::FileSpec *
16630fdc8d8SChris Lattner SBFileSpec::operator->() const
16730fdc8d8SChris Lattner {
1686611103cSGreg Clayton     return m_opaque_ap.get();
16930fdc8d8SChris Lattner }
17030fdc8d8SChris Lattner 
17130fdc8d8SChris Lattner const lldb_private::FileSpec *
17230fdc8d8SChris Lattner SBFileSpec::get() const
17330fdc8d8SChris Lattner {
1746611103cSGreg Clayton     return m_opaque_ap.get();
17530fdc8d8SChris Lattner }
17630fdc8d8SChris Lattner 
17730fdc8d8SChris Lattner 
17830fdc8d8SChris Lattner const lldb_private::FileSpec &
17930fdc8d8SChris Lattner SBFileSpec::operator*() const
18030fdc8d8SChris Lattner {
1816611103cSGreg Clayton     return *m_opaque_ap.get();
18230fdc8d8SChris Lattner }
18330fdc8d8SChris Lattner 
18430fdc8d8SChris Lattner const lldb_private::FileSpec &
18530fdc8d8SChris Lattner SBFileSpec::ref() const
18630fdc8d8SChris Lattner {
1876611103cSGreg Clayton     return *m_opaque_ap.get();
18830fdc8d8SChris Lattner }
18930fdc8d8SChris Lattner 
19030fdc8d8SChris Lattner 
19130fdc8d8SChris Lattner void
19230fdc8d8SChris Lattner SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
19330fdc8d8SChris Lattner {
1946611103cSGreg Clayton     if (m_opaque_ap.get())
1956611103cSGreg Clayton         *m_opaque_ap = fs;
19630fdc8d8SChris Lattner     else
1976611103cSGreg Clayton         m_opaque_ap.reset (new FileSpec (fs));
19830fdc8d8SChris Lattner }
19930fdc8d8SChris Lattner 
200dde9cff3SCaroline Tice bool
201ceb6b139SCaroline Tice SBFileSpec::GetDescription (SBStream &description) const
202ceb6b139SCaroline Tice {
203ceb6b139SCaroline Tice     if (m_opaque_ap.get())
204ceb6b139SCaroline Tice     {
205cfd1acedSGreg Clayton         char path[PATH_MAX];
206cfd1acedSGreg Clayton         if (m_opaque_ap->GetPath(path, sizeof(path)))
207cfd1acedSGreg Clayton             description.Printf ("%s", path);
208ceb6b139SCaroline Tice     }
209ceb6b139SCaroline Tice     else
210ceb6b139SCaroline Tice         description.Printf ("No value");
211ceb6b139SCaroline Tice 
212ceb6b139SCaroline Tice     return true;
213ceb6b139SCaroline Tice }
214