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);
96*686b1fe6SIlia K     ::snprintf(dst_path, dst_len, "%s", result.c_str());
97*686b1fe6SIlia 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 {
122226cce25SGreg Clayton     const char *s = m_opaque_ap->GetDirectory().AsCString();
1235160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1244838131bSGreg Clayton     if (log)
125cfd1acedSGreg Clayton     {
126cfd1acedSGreg Clayton         if (s)
127324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetDirectory () => \"%s\"",
128324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()), s);
129cfd1acedSGreg Clayton         else
130324a1036SSaleem Abdulrasool             log->Printf ("SBFileSpec(%p)::GetDirectory () => NULL",
131324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ap.get()));
132cfd1acedSGreg Clayton     }
1334838131bSGreg Clayton     return s;
13430fdc8d8SChris Lattner }
13530fdc8d8SChris Lattner 
136fbb76349SGreg Clayton void
137fbb76349SGreg Clayton SBFileSpec::SetFilename(const char *filename)
138fbb76349SGreg Clayton {
139fbb76349SGreg Clayton     if (filename && filename[0])
140fbb76349SGreg Clayton         m_opaque_ap->GetFilename().SetCString(filename);
141fbb76349SGreg Clayton     else
142fbb76349SGreg Clayton         m_opaque_ap->GetFilename().Clear();
143fbb76349SGreg Clayton }
144fbb76349SGreg Clayton 
145fbb76349SGreg Clayton void
146fbb76349SGreg Clayton SBFileSpec::SetDirectory(const char *directory)
147fbb76349SGreg Clayton {
148fbb76349SGreg Clayton     if (directory && directory[0])
149fbb76349SGreg Clayton         m_opaque_ap->GetDirectory().SetCString(directory);
150fbb76349SGreg Clayton     else
151fbb76349SGreg Clayton         m_opaque_ap->GetDirectory().Clear();
152fbb76349SGreg Clayton }
153fbb76349SGreg Clayton 
15430fdc8d8SChris Lattner uint32_t
15530fdc8d8SChris Lattner SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
15630fdc8d8SChris Lattner {
1575160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
158ceb6b139SCaroline Tice 
159226cce25SGreg Clayton     uint32_t result = m_opaque_ap->GetPath (dst_path, dst_len);
160ceb6b139SCaroline Tice 
161ceb6b139SCaroline Tice     if (log)
162d01b2953SDaniel Malea         log->Printf ("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%" PRIu64 ") => %u",
163324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_ap.get()), result, dst_path,
164324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(dst_len), result);
16530fdc8d8SChris Lattner 
166cfd1acedSGreg Clayton     if (result == 0 && dst_path && dst_len > 0)
16730fdc8d8SChris Lattner         *dst_path = '\0';
168cfd1acedSGreg Clayton     return result;
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::get() const
18030fdc8d8SChris Lattner {
1816611103cSGreg Clayton     return m_opaque_ap.get();
18230fdc8d8SChris Lattner }
18330fdc8d8SChris Lattner 
18430fdc8d8SChris Lattner 
18530fdc8d8SChris Lattner const lldb_private::FileSpec &
18630fdc8d8SChris Lattner SBFileSpec::operator*() const
18730fdc8d8SChris Lattner {
1886611103cSGreg Clayton     return *m_opaque_ap.get();
18930fdc8d8SChris Lattner }
19030fdc8d8SChris Lattner 
19130fdc8d8SChris Lattner const lldb_private::FileSpec &
19230fdc8d8SChris Lattner SBFileSpec::ref() const
19330fdc8d8SChris Lattner {
1946611103cSGreg Clayton     return *m_opaque_ap.get();
19530fdc8d8SChris Lattner }
19630fdc8d8SChris Lattner 
19730fdc8d8SChris Lattner 
19830fdc8d8SChris Lattner void
19930fdc8d8SChris Lattner SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
20030fdc8d8SChris Lattner {
2016611103cSGreg Clayton     *m_opaque_ap = fs;
20230fdc8d8SChris Lattner }
20330fdc8d8SChris Lattner 
204dde9cff3SCaroline Tice bool
205ceb6b139SCaroline Tice SBFileSpec::GetDescription (SBStream &description) const
206ceb6b139SCaroline Tice {
207da7bc7d0SGreg Clayton     Stream &strm = description.ref();
208cfd1acedSGreg Clayton     char path[PATH_MAX];
209cfd1acedSGreg Clayton     if (m_opaque_ap->GetPath(path, sizeof(path)))
210da7bc7d0SGreg Clayton         strm.PutCString (path);
211ceb6b139SCaroline Tice     return true;
212ceb6b139SCaroline Tice }
213