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