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