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 
108acdbb8aSStephen Wilson #include <limits.h>
118acdbb8aSStephen 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"
16da7bc7d0SGreg Clayton #include "lldb/Core/Stream.h"
1730fdc8d8SChris Lattner 
1830fdc8d8SChris Lattner using namespace lldb;
1930fdc8d8SChris Lattner using namespace lldb_private;
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner 
2330fdc8d8SChris Lattner SBFileSpec::SBFileSpec () :
24226cce25SGreg Clayton     m_opaque_ap(new lldb_private::FileSpec())
2530fdc8d8SChris Lattner {
2630fdc8d8SChris Lattner }
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const SBFileSpec &rhs) :
29226cce25SGreg Clayton     m_opaque_ap(new lldb_private::FileSpec(*rhs.m_opaque_ap))
3030fdc8d8SChris Lattner {
31ceb6b139SCaroline Tice }
32226cce25SGreg Clayton 
33226cce25SGreg Clayton SBFileSpec::SBFileSpec (const lldb_private::FileSpec& fspec) :
34226cce25SGreg Clayton     m_opaque_ap(new lldb_private::FileSpec(fspec))
35226cce25SGreg Clayton {
3630fdc8d8SChris Lattner }
3730fdc8d8SChris Lattner 
38274060b6SGreg Clayton // Deprected!!!
3930fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const char *path) :
40274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, true))
41274060b6SGreg Clayton {
42274060b6SGreg Clayton }
43274060b6SGreg Clayton 
44274060b6SGreg Clayton SBFileSpec::SBFileSpec (const char *path, bool resolve) :
45274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, resolve))
4630fdc8d8SChris Lattner {
4730fdc8d8SChris Lattner }
4830fdc8d8SChris Lattner 
4930fdc8d8SChris Lattner SBFileSpec::~SBFileSpec ()
5030fdc8d8SChris Lattner {
5130fdc8d8SChris Lattner }
5230fdc8d8SChris Lattner 
5330fdc8d8SChris Lattner const SBFileSpec &
5430fdc8d8SChris Lattner SBFileSpec::operator = (const SBFileSpec &rhs)
5530fdc8d8SChris Lattner {
5630fdc8d8SChris Lattner     if (this != &rhs)
57226cce25SGreg Clayton         *m_opaque_ap = *rhs.m_opaque_ap;
5830fdc8d8SChris Lattner     return *this;
5930fdc8d8SChris Lattner }
6030fdc8d8SChris Lattner 
6130fdc8d8SChris Lattner bool
6230fdc8d8SChris Lattner SBFileSpec::IsValid() const
6330fdc8d8SChris Lattner {
649076c0ffSSean Callanan     return m_opaque_ap->operator bool();
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner bool
6830fdc8d8SChris Lattner SBFileSpec::Exists () const
6930fdc8d8SChris Lattner {
705160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
71ceb6b139SCaroline Tice 
72226cce25SGreg Clayton     bool result = m_opaque_ap->Exists();
73ceb6b139SCaroline Tice 
74ceb6b139SCaroline Tice     if (log)
7593aa84e8SGreg Clayton         log->Printf ("SBFileSpec(%p)::Exists () => %s", m_opaque_ap.get(), (result ? "true" : "false"));
76ceb6b139SCaroline Tice 
77ceb6b139SCaroline Tice     return result;
7830fdc8d8SChris Lattner }
7930fdc8d8SChris Lattner 
80428a9a58SCaroline Tice bool
81428a9a58SCaroline Tice SBFileSpec::ResolveExecutableLocation ()
82428a9a58SCaroline Tice {
83428a9a58SCaroline Tice     return m_opaque_ap->ResolveExecutableLocation ();
84428a9a58SCaroline Tice }
8530fdc8d8SChris Lattner 
8630fdc8d8SChris Lattner int
8730fdc8d8SChris Lattner SBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)
8830fdc8d8SChris Lattner {
8930fdc8d8SChris Lattner     return lldb_private::FileSpec::Resolve (src_path, dst_path, dst_len);
9030fdc8d8SChris Lattner }
9130fdc8d8SChris Lattner 
9230fdc8d8SChris Lattner const char *
9323fd10cbSJohnny Chen SBFileSpec::GetFilename() const
9430fdc8d8SChris Lattner {
95226cce25SGreg Clayton     const char *s = m_opaque_ap->GetFilename().AsCString();
964838131bSGreg Clayton 
975160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
98ceb6b139SCaroline Tice     if (log)
99cfd1acedSGreg Clayton     {
100cfd1acedSGreg Clayton         if (s)
101cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetFilename () => \"%s\"", m_opaque_ap.get(), s);
102cfd1acedSGreg Clayton         else
103cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetFilename () => NULL", m_opaque_ap.get());
104cfd1acedSGreg Clayton     }
105750cd175SCaroline Tice 
1064838131bSGreg Clayton     return s;
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner 
10930fdc8d8SChris Lattner const char *
11030fdc8d8SChris Lattner SBFileSpec::GetDirectory() const
11130fdc8d8SChris Lattner {
112226cce25SGreg Clayton     const char *s = m_opaque_ap->GetDirectory().AsCString();
1135160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1144838131bSGreg Clayton     if (log)
115cfd1acedSGreg Clayton     {
116cfd1acedSGreg Clayton         if (s)
117cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetDirectory () => \"%s\"", m_opaque_ap.get(), s);
118cfd1acedSGreg Clayton         else
119cfd1acedSGreg Clayton             log->Printf ("SBFileSpec(%p)::GetDirectory () => NULL", m_opaque_ap.get());
120cfd1acedSGreg Clayton     }
1214838131bSGreg Clayton     return s;
12230fdc8d8SChris Lattner }
12330fdc8d8SChris Lattner 
124*fbb76349SGreg Clayton void
125*fbb76349SGreg Clayton SBFileSpec::SetFilename(const char *filename)
126*fbb76349SGreg Clayton {
127*fbb76349SGreg Clayton     if (filename && filename[0])
128*fbb76349SGreg Clayton         m_opaque_ap->GetFilename().SetCString(filename);
129*fbb76349SGreg Clayton     else
130*fbb76349SGreg Clayton         m_opaque_ap->GetFilename().Clear();
131*fbb76349SGreg Clayton }
132*fbb76349SGreg Clayton 
133*fbb76349SGreg Clayton void
134*fbb76349SGreg Clayton SBFileSpec::SetDirectory(const char *directory)
135*fbb76349SGreg Clayton {
136*fbb76349SGreg Clayton     if (directory && directory[0])
137*fbb76349SGreg Clayton         m_opaque_ap->GetDirectory().SetCString(directory);
138*fbb76349SGreg Clayton     else
139*fbb76349SGreg Clayton         m_opaque_ap->GetDirectory().Clear();
140*fbb76349SGreg Clayton }
141*fbb76349SGreg Clayton 
14230fdc8d8SChris Lattner uint32_t
14330fdc8d8SChris Lattner SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
14430fdc8d8SChris Lattner {
1455160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
146ceb6b139SCaroline Tice 
147226cce25SGreg Clayton     uint32_t result = m_opaque_ap->GetPath (dst_path, dst_len);
148ceb6b139SCaroline Tice 
149ceb6b139SCaroline Tice     if (log)
150d01b2953SDaniel Malea         log->Printf ("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%" PRIu64 ") => %u",
15143e0af06SGreg Clayton                      m_opaque_ap.get(), result, dst_path, (uint64_t)dst_len, result);
15230fdc8d8SChris Lattner 
153cfd1acedSGreg Clayton     if (result == 0 && dst_path && dst_len > 0)
15430fdc8d8SChris Lattner         *dst_path = '\0';
155cfd1acedSGreg Clayton     return result;
15630fdc8d8SChris Lattner }
15730fdc8d8SChris Lattner 
15830fdc8d8SChris Lattner 
15930fdc8d8SChris Lattner const lldb_private::FileSpec *
16030fdc8d8SChris Lattner SBFileSpec::operator->() const
16130fdc8d8SChris Lattner {
1626611103cSGreg Clayton     return m_opaque_ap.get();
16330fdc8d8SChris Lattner }
16430fdc8d8SChris Lattner 
16530fdc8d8SChris Lattner const lldb_private::FileSpec *
16630fdc8d8SChris Lattner SBFileSpec::get() const
16730fdc8d8SChris Lattner {
1686611103cSGreg Clayton     return m_opaque_ap.get();
16930fdc8d8SChris Lattner }
17030fdc8d8SChris Lattner 
17130fdc8d8SChris Lattner 
17230fdc8d8SChris Lattner const lldb_private::FileSpec &
17330fdc8d8SChris Lattner SBFileSpec::operator*() const
17430fdc8d8SChris Lattner {
1756611103cSGreg Clayton     return *m_opaque_ap.get();
17630fdc8d8SChris Lattner }
17730fdc8d8SChris Lattner 
17830fdc8d8SChris Lattner const lldb_private::FileSpec &
17930fdc8d8SChris Lattner SBFileSpec::ref() const
18030fdc8d8SChris Lattner {
1816611103cSGreg Clayton     return *m_opaque_ap.get();
18230fdc8d8SChris Lattner }
18330fdc8d8SChris Lattner 
18430fdc8d8SChris Lattner 
18530fdc8d8SChris Lattner void
18630fdc8d8SChris Lattner SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
18730fdc8d8SChris Lattner {
1886611103cSGreg Clayton     *m_opaque_ap = fs;
18930fdc8d8SChris Lattner }
19030fdc8d8SChris Lattner 
191dde9cff3SCaroline Tice bool
192ceb6b139SCaroline Tice SBFileSpec::GetDescription (SBStream &description) const
193ceb6b139SCaroline Tice {
194da7bc7d0SGreg Clayton     Stream &strm = description.ref();
195cfd1acedSGreg Clayton     char path[PATH_MAX];
196cfd1acedSGreg Clayton     if (m_opaque_ap->GetPath(path, sizeof(path)))
197da7bc7d0SGreg Clayton         strm.PutCString (path);
198ceb6b139SCaroline Tice     return true;
199ceb6b139SCaroline Tice }
200