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 
10af90cf52SSean 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 
193f559740SZachary Turner #include "llvm/ADT/SmallString.h"
203f559740SZachary Turner 
2130fdc8d8SChris Lattner using namespace lldb;
2230fdc8d8SChris Lattner using namespace lldb_private;
2330fdc8d8SChris Lattner 
2430fdc8d8SChris Lattner 
2530fdc8d8SChris Lattner 
2630fdc8d8SChris Lattner SBFileSpec::SBFileSpec () :
27226cce25SGreg Clayton     m_opaque_ap(new lldb_private::FileSpec())
2830fdc8d8SChris Lattner {
2930fdc8d8SChris Lattner }
3030fdc8d8SChris Lattner 
3130fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const SBFileSpec &rhs) :
32226cce25SGreg Clayton     m_opaque_ap(new lldb_private::FileSpec(*rhs.m_opaque_ap))
3330fdc8d8SChris Lattner {
34ceb6b139SCaroline Tice }
35226cce25SGreg Clayton 
36226cce25SGreg Clayton SBFileSpec::SBFileSpec (const lldb_private::FileSpec& fspec) :
37226cce25SGreg Clayton     m_opaque_ap(new lldb_private::FileSpec(fspec))
38226cce25SGreg Clayton {
3930fdc8d8SChris Lattner }
4030fdc8d8SChris Lattner 
41d93c4a33SBruce Mitchener // Deprecated!!!
4230fdc8d8SChris Lattner SBFileSpec::SBFileSpec (const char *path) :
43274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, true))
44274060b6SGreg Clayton {
45274060b6SGreg Clayton }
46274060b6SGreg Clayton 
47274060b6SGreg Clayton SBFileSpec::SBFileSpec (const char *path, bool resolve) :
48274060b6SGreg Clayton     m_opaque_ap(new FileSpec (path, resolve))
4930fdc8d8SChris Lattner {
5030fdc8d8SChris Lattner }
5130fdc8d8SChris Lattner 
5230fdc8d8SChris Lattner SBFileSpec::~SBFileSpec ()
5330fdc8d8SChris Lattner {
5430fdc8d8SChris Lattner }
5530fdc8d8SChris Lattner 
5630fdc8d8SChris Lattner const SBFileSpec &
5730fdc8d8SChris Lattner SBFileSpec::operator = (const SBFileSpec &rhs)
5830fdc8d8SChris Lattner {
5930fdc8d8SChris Lattner     if (this != &rhs)
60226cce25SGreg Clayton         *m_opaque_ap = *rhs.m_opaque_ap;
6130fdc8d8SChris Lattner     return *this;
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner 
6430fdc8d8SChris Lattner bool
6530fdc8d8SChris Lattner SBFileSpec::IsValid() const
6630fdc8d8SChris Lattner {
679076c0ffSSean Callanan     return m_opaque_ap->operator bool();
6830fdc8d8SChris Lattner }
6930fdc8d8SChris Lattner 
7030fdc8d8SChris Lattner bool
7130fdc8d8SChris Lattner SBFileSpec::Exists () const
7230fdc8d8SChris Lattner {
735160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
74ceb6b139SCaroline Tice 
75226cce25SGreg Clayton     bool result = m_opaque_ap->Exists();
76ceb6b139SCaroline Tice 
77ceb6b139SCaroline Tice     if (log)
78324a1036SSaleem Abdulrasool         log->Printf ("SBFileSpec(%p)::Exists () => %s",
79324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_ap.get()),
80324a1036SSaleem Abdulrasool                      (result ? "true" : "false"));
81ceb6b139SCaroline Tice 
82ceb6b139SCaroline Tice     return result;
8330fdc8d8SChris Lattner }
8430fdc8d8SChris Lattner 
85428a9a58SCaroline Tice bool
86428a9a58SCaroline Tice SBFileSpec::ResolveExecutableLocation ()
87428a9a58SCaroline Tice {
88428a9a58SCaroline Tice     return m_opaque_ap->ResolveExecutableLocation ();
89428a9a58SCaroline Tice }
9030fdc8d8SChris Lattner 
9130fdc8d8SChris Lattner int
9230fdc8d8SChris Lattner SBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)
9330fdc8d8SChris Lattner {
943f559740SZachary Turner     llvm::SmallString<64> result(src_path);
953f559740SZachary Turner     lldb_private::FileSpec::Resolve (result);
96686b1fe6SIlia K     ::snprintf(dst_path, dst_len, "%s", result.c_str());
97686b1fe6SIlia K     return std::min(dst_len-1, result.size());
9830fdc8d8SChris Lattner }
9930fdc8d8SChris Lattner 
10030fdc8d8SChris Lattner const char *
10123fd10cbSJohnny Chen SBFileSpec::GetFilename() const
10230fdc8d8SChris Lattner {
103226cce25SGreg Clayton     const char *s = m_opaque_ap->GetFilename().AsCString();
1044838131bSGreg Clayton 
1055160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
106ceb6b139SCaroline Tice     if (log)
107cfd1acedSGreg Clayton     {
108cfd1acedSGreg Clayton         if (s)
109324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetFilename () => \"%s\"",
110324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()), s);
111cfd1acedSGreg Clayton         else
112324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetFilename () => NULL",
113324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()));
114cfd1acedSGreg Clayton     }
115750cd175SCaroline Tice 
1164838131bSGreg Clayton     return s;
11730fdc8d8SChris Lattner }
11830fdc8d8SChris Lattner 
11930fdc8d8SChris Lattner const char *
12030fdc8d8SChris Lattner SBFileSpec::GetDirectory() const
12130fdc8d8SChris Lattner {
122*7d2f62daSChaoren Lin     FileSpec directory{*m_opaque_ap};
123*7d2f62daSChaoren Lin     directory.GetFilename().Clear();
1245160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1254838131bSGreg Clayton     if (log)
126cfd1acedSGreg Clayton     {
127*7d2f62daSChaoren Lin         if (directory)
128324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetDirectory () => \"%s\"",
129*7d2f62daSChaoren Lin                          static_cast<void*>(m_opaque_ap.get()), directory.GetCString());
130cfd1acedSGreg Clayton         else
131324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetDirectory () => NULL",
132324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()));
133cfd1acedSGreg Clayton     }
134*7d2f62daSChaoren Lin     return directory.GetCString();
13530fdc8d8SChris Lattner }
13630fdc8d8SChris Lattner 
137fbb76349SGreg Clayton void
138fbb76349SGreg Clayton SBFileSpec::SetFilename(const char *filename)
139fbb76349SGreg Clayton {
140fbb76349SGreg Clayton     if (filename && filename[0])
141fbb76349SGreg Clayton         m_opaque_ap->GetFilename().SetCString(filename);
142fbb76349SGreg Clayton     else
143fbb76349SGreg Clayton         m_opaque_ap->GetFilename().Clear();
144fbb76349SGreg Clayton }
145fbb76349SGreg Clayton 
146fbb76349SGreg Clayton void
147fbb76349SGreg Clayton SBFileSpec::SetDirectory(const char *directory)
148fbb76349SGreg Clayton {
149fbb76349SGreg Clayton     if (directory && directory[0])
150fbb76349SGreg Clayton         m_opaque_ap->GetDirectory().SetCString(directory);
151fbb76349SGreg Clayton     else
152fbb76349SGreg Clayton         m_opaque_ap->GetDirectory().Clear();
153fbb76349SGreg Clayton }
154fbb76349SGreg Clayton 
15530fdc8d8SChris Lattner uint32_t
15630fdc8d8SChris Lattner SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
15730fdc8d8SChris Lattner {
1585160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
159ceb6b139SCaroline Tice 
160226cce25SGreg Clayton     uint32_t result = m_opaque_ap->GetPath (dst_path, dst_len);
161ceb6b139SCaroline Tice 
162ceb6b139SCaroline Tice     if (log)
163d01b2953SDaniel Malea         log->Printf ("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%" PRIu64 ") => %u",
164324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_ap.get()), result, dst_path,
165324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(dst_len), result);
16630fdc8d8SChris Lattner 
167cfd1acedSGreg Clayton     if (result == 0 && dst_path && dst_len > 0)
16830fdc8d8SChris Lattner         *dst_path = '\0';
169cfd1acedSGreg Clayton     return result;
17030fdc8d8SChris Lattner }
17130fdc8d8SChris Lattner 
17230fdc8d8SChris Lattner 
17330fdc8d8SChris Lattner const lldb_private::FileSpec *
17430fdc8d8SChris Lattner SBFileSpec::operator->() const
17530fdc8d8SChris Lattner {
1766611103cSGreg Clayton     return m_opaque_ap.get();
17730fdc8d8SChris Lattner }
17830fdc8d8SChris Lattner 
17930fdc8d8SChris Lattner const lldb_private::FileSpec *
18030fdc8d8SChris Lattner SBFileSpec::get() const
18130fdc8d8SChris Lattner {
1826611103cSGreg Clayton     return m_opaque_ap.get();
18330fdc8d8SChris Lattner }
18430fdc8d8SChris Lattner 
18530fdc8d8SChris Lattner 
18630fdc8d8SChris Lattner const lldb_private::FileSpec &
18730fdc8d8SChris Lattner SBFileSpec::operator*() const
18830fdc8d8SChris Lattner {
1896611103cSGreg Clayton     return *m_opaque_ap.get();
19030fdc8d8SChris Lattner }
19130fdc8d8SChris Lattner 
19230fdc8d8SChris Lattner const lldb_private::FileSpec &
19330fdc8d8SChris Lattner SBFileSpec::ref() const
19430fdc8d8SChris Lattner {
1956611103cSGreg Clayton     return *m_opaque_ap.get();
19630fdc8d8SChris Lattner }
19730fdc8d8SChris Lattner 
19830fdc8d8SChris Lattner 
19930fdc8d8SChris Lattner void
20030fdc8d8SChris Lattner SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
20130fdc8d8SChris Lattner {
2026611103cSGreg Clayton     *m_opaque_ap = fs;
20330fdc8d8SChris Lattner }
20430fdc8d8SChris Lattner 
205dde9cff3SCaroline Tice bool
206ceb6b139SCaroline Tice SBFileSpec::GetDescription (SBStream &description) const
207ceb6b139SCaroline Tice {
208da7bc7d0SGreg Clayton     Stream &strm = description.ref();
209cfd1acedSGreg Clayton     char path[PATH_MAX];
210cfd1acedSGreg Clayton     if (m_opaque_ap->GetPath(path, sizeof(path)))
211da7bc7d0SGreg Clayton         strm.PutCString (path);
212ceb6b139SCaroline Tice     return true;
213ceb6b139SCaroline Tice }
214