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*af90cf52SSean Callanan #include <inttypes.h> // PRIu64
118acdbb8aSStephen Wilson #include <limits.h>
128acdbb8aSStephen Wilson 
1330fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h"
14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1553239f00SGreg Clayton #include "lldb/Host/FileSpec.h"
16ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
17da7bc7d0SGreg Clayton #include "lldb/Core/Stream.h"
1830fdc8d8SChris Lattner 
1930fdc8d8SChris Lattner using namespace lldb;
2030fdc8d8SChris Lattner using namespace lldb_private;
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner 
2330fdc8d8SChris Lattner 
2430fdc8d8SChris Lattner SBFileSpec::SBFileSpec () :
25226cce25SGreg Clayton     m_opaque_ap(new lldb_private::FileSpec())
2630fdc8d8SChris Lattner {
2730fdc8d8SChris Lattner }
2830fdc8d8SChris Lattner 
2930fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const SBFileSpec &rhs) :
30226cce25SGreg Clayton     m_opaque_ap(new lldb_private::FileSpec(*rhs.m_opaque_ap))
3130fdc8d8SChris Lattner {
32ceb6b139SCaroline Tice }
33226cce25SGreg Clayton 
34226cce25SGreg Clayton SBFileSpec::SBFileSpec (const lldb_private::FileSpec& fspec) :
35226cce25SGreg Clayton     m_opaque_ap(new lldb_private::FileSpec(fspec))
36226cce25SGreg Clayton {
3730fdc8d8SChris Lattner }
3830fdc8d8SChris Lattner 
39274060b6SGreg Clayton // Deprected!!!
4030fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const char *path) :
41274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, true))
42274060b6SGreg Clayton {
43274060b6SGreg Clayton }
44274060b6SGreg Clayton 
45274060b6SGreg Clayton SBFileSpec::SBFileSpec (const char *path, bool resolve) :
46274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, resolve))
4730fdc8d8SChris Lattner {
4830fdc8d8SChris Lattner }
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner SBFileSpec::~SBFileSpec ()
5130fdc8d8SChris Lattner {
5230fdc8d8SChris Lattner }
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner const SBFileSpec &
5530fdc8d8SChris Lattner SBFileSpec::operator = (const SBFileSpec &rhs)
5630fdc8d8SChris Lattner {
5730fdc8d8SChris Lattner     if (this != &rhs)
58226cce25SGreg Clayton         *m_opaque_ap = *rhs.m_opaque_ap;
5930fdc8d8SChris Lattner     return *this;
6030fdc8d8SChris Lattner }
6130fdc8d8SChris Lattner 
6230fdc8d8SChris Lattner bool
6330fdc8d8SChris Lattner SBFileSpec::IsValid() const
6430fdc8d8SChris Lattner {
659076c0ffSSean Callanan     return m_opaque_ap->operator bool();
6630fdc8d8SChris Lattner }
6730fdc8d8SChris Lattner 
6830fdc8d8SChris Lattner bool
6930fdc8d8SChris Lattner SBFileSpec::Exists () const
7030fdc8d8SChris Lattner {
715160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
72ceb6b139SCaroline Tice 
73226cce25SGreg Clayton     bool result = m_opaque_ap->Exists();
74ceb6b139SCaroline Tice 
75ceb6b139SCaroline Tice     if (log)
76324a1036SSaleem Abdulrasool         log->Printf ("SBFileSpec(%p)::Exists () => %s",
77324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_ap.get()),
78324a1036SSaleem Abdulrasool                      (result ? "true" : "false"));
79ceb6b139SCaroline Tice 
80ceb6b139SCaroline Tice     return result;
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner 
83428a9a58SCaroline Tice bool
84428a9a58SCaroline Tice SBFileSpec::ResolveExecutableLocation ()
85428a9a58SCaroline Tice {
86428a9a58SCaroline Tice     return m_opaque_ap->ResolveExecutableLocation ();
87428a9a58SCaroline Tice }
8830fdc8d8SChris Lattner 
8930fdc8d8SChris Lattner int
9030fdc8d8SChris Lattner SBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)
9130fdc8d8SChris Lattner {
9230fdc8d8SChris Lattner     return lldb_private::FileSpec::Resolve (src_path, dst_path, dst_len);
9330fdc8d8SChris Lattner }
9430fdc8d8SChris Lattner 
9530fdc8d8SChris Lattner const char *
9623fd10cbSJohnny Chen SBFileSpec::GetFilename() const
9730fdc8d8SChris Lattner {
98226cce25SGreg Clayton     const char *s = m_opaque_ap->GetFilename().AsCString();
994838131bSGreg Clayton 
1005160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
101ceb6b139SCaroline Tice     if (log)
102cfd1acedSGreg Clayton     {
103cfd1acedSGreg Clayton         if (s)
104324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetFilename () => \"%s\"",
105324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()), s);
106cfd1acedSGreg Clayton         else
107324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetFilename () => NULL",
108324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()));
109cfd1acedSGreg Clayton     }
110750cd175SCaroline Tice 
1114838131bSGreg Clayton     return s;
11230fdc8d8SChris Lattner }
11330fdc8d8SChris Lattner 
11430fdc8d8SChris Lattner const char *
11530fdc8d8SChris Lattner SBFileSpec::GetDirectory() const
11630fdc8d8SChris Lattner {
117226cce25SGreg Clayton     const char *s = m_opaque_ap->GetDirectory().AsCString();
1185160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1194838131bSGreg Clayton     if (log)
120cfd1acedSGreg Clayton     {
121cfd1acedSGreg Clayton         if (s)
122324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetDirectory () => \"%s\"",
123324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()), s);
124cfd1acedSGreg Clayton         else
125324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetDirectory () => NULL",
126324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()));
127cfd1acedSGreg Clayton     }
1284838131bSGreg Clayton     return s;
12930fdc8d8SChris Lattner }
13030fdc8d8SChris Lattner 
131fbb76349SGreg Clayton void
132fbb76349SGreg Clayton SBFileSpec::SetFilename(const char *filename)
133fbb76349SGreg Clayton {
134fbb76349SGreg Clayton     if (filename && filename[0])
135fbb76349SGreg Clayton         m_opaque_ap->GetFilename().SetCString(filename);
136fbb76349SGreg Clayton     else
137fbb76349SGreg Clayton         m_opaque_ap->GetFilename().Clear();
138fbb76349SGreg Clayton }
139fbb76349SGreg Clayton 
140fbb76349SGreg Clayton void
141fbb76349SGreg Clayton SBFileSpec::SetDirectory(const char *directory)
142fbb76349SGreg Clayton {
143fbb76349SGreg Clayton     if (directory && directory[0])
144fbb76349SGreg Clayton         m_opaque_ap->GetDirectory().SetCString(directory);
145fbb76349SGreg Clayton     else
146fbb76349SGreg Clayton         m_opaque_ap->GetDirectory().Clear();
147fbb76349SGreg Clayton }
148fbb76349SGreg Clayton 
14930fdc8d8SChris Lattner uint32_t
15030fdc8d8SChris Lattner SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
15130fdc8d8SChris Lattner {
1525160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
153ceb6b139SCaroline Tice 
154226cce25SGreg Clayton     uint32_t result = m_opaque_ap->GetPath (dst_path, dst_len);
155ceb6b139SCaroline Tice 
156ceb6b139SCaroline Tice     if (log)
157d01b2953SDaniel Malea         log->Printf ("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%" PRIu64 ") => %u",
158324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_ap.get()), result, dst_path,
159324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(dst_len), result);
16030fdc8d8SChris Lattner 
161cfd1acedSGreg Clayton     if (result == 0 && dst_path && dst_len > 0)
16230fdc8d8SChris Lattner         *dst_path = '\0';
163cfd1acedSGreg Clayton     return result;
16430fdc8d8SChris Lattner }
16530fdc8d8SChris Lattner 
16630fdc8d8SChris Lattner 
16730fdc8d8SChris Lattner const lldb_private::FileSpec *
16830fdc8d8SChris Lattner SBFileSpec::operator->() const
16930fdc8d8SChris Lattner {
1706611103cSGreg Clayton     return m_opaque_ap.get();
17130fdc8d8SChris Lattner }
17230fdc8d8SChris Lattner 
17330fdc8d8SChris Lattner const lldb_private::FileSpec *
17430fdc8d8SChris Lattner SBFileSpec::get() const
17530fdc8d8SChris Lattner {
1766611103cSGreg Clayton     return m_opaque_ap.get();
17730fdc8d8SChris Lattner }
17830fdc8d8SChris Lattner 
17930fdc8d8SChris Lattner 
18030fdc8d8SChris Lattner const lldb_private::FileSpec &
18130fdc8d8SChris Lattner SBFileSpec::operator*() const
18230fdc8d8SChris Lattner {
1836611103cSGreg Clayton     return *m_opaque_ap.get();
18430fdc8d8SChris Lattner }
18530fdc8d8SChris Lattner 
18630fdc8d8SChris Lattner const lldb_private::FileSpec &
18730fdc8d8SChris Lattner SBFileSpec::ref() const
18830fdc8d8SChris Lattner {
1896611103cSGreg Clayton     return *m_opaque_ap.get();
19030fdc8d8SChris Lattner }
19130fdc8d8SChris Lattner 
19230fdc8d8SChris Lattner 
19330fdc8d8SChris Lattner void
19430fdc8d8SChris Lattner SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
19530fdc8d8SChris Lattner {
1966611103cSGreg Clayton     *m_opaque_ap = fs;
19730fdc8d8SChris Lattner }
19830fdc8d8SChris Lattner 
199dde9cff3SCaroline Tice bool
200ceb6b139SCaroline Tice SBFileSpec::GetDescription (SBStream &description) const
201ceb6b139SCaroline Tice {
202da7bc7d0SGreg Clayton     Stream &strm = description.ref();
203cfd1acedSGreg Clayton     char path[PATH_MAX];
204cfd1acedSGreg Clayton     if (m_opaque_ap->GetPath(path, sizeof(path)))
205da7bc7d0SGreg Clayton         strm.PutCString (path);
206ceb6b139SCaroline Tice     return true;
207ceb6b139SCaroline Tice }
208