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*672d2c12SJonas Devlieghere #include <inttypes.h> 118acdbb8aSStephen Wilson #include <limits.h> 128acdbb8aSStephen Wilson 1330fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h" 14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 152c22c800SJonas Devlieghere #include "lldb/Host/FileSystem.h" 168d48cd60SZachary Turner #include "lldb/Host/PosixApi.h" 175713a05bSZachary Turner #include "lldb/Utility/FileSpec.h" 186f9e6901SZachary Turner #include "lldb/Utility/Log.h" 19bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 2030fdc8d8SChris Lattner 213f559740SZachary Turner #include "llvm/ADT/SmallString.h" 223f559740SZachary Turner 2330fdc8d8SChris Lattner using namespace lldb; 2430fdc8d8SChris Lattner using namespace lldb_private; 2530fdc8d8SChris Lattner 26b9c1b51eSKate Stone SBFileSpec::SBFileSpec() : m_opaque_ap(new lldb_private::FileSpec()) {} 2730fdc8d8SChris Lattner 28b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const SBFileSpec &rhs) 29b9c1b51eSKate Stone : m_opaque_ap(new lldb_private::FileSpec(*rhs.m_opaque_ap)) {} 3030fdc8d8SChris Lattner 31b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const lldb_private::FileSpec &fspec) 32b9c1b51eSKate Stone : m_opaque_ap(new lldb_private::FileSpec(fspec)) {} 3330fdc8d8SChris Lattner 34d93c4a33SBruce Mitchener // Deprecated!!! 358f3be7a3SJonas Devlieghere SBFileSpec::SBFileSpec(const char *path) : m_opaque_ap(new FileSpec(path)) { 368f3be7a3SJonas Devlieghere FileSystem::Instance().Resolve(*m_opaque_ap); 378f3be7a3SJonas Devlieghere } 38274060b6SGreg Clayton 39b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const char *path, bool resolve) 408f3be7a3SJonas Devlieghere : m_opaque_ap(new FileSpec(path)) { 418f3be7a3SJonas Devlieghere if (resolve) 428f3be7a3SJonas Devlieghere FileSystem::Instance().Resolve(*m_opaque_ap); 438f3be7a3SJonas Devlieghere } 4430fdc8d8SChris Lattner 45b9c1b51eSKate Stone SBFileSpec::~SBFileSpec() {} 4630fdc8d8SChris Lattner 47b9c1b51eSKate Stone const SBFileSpec &SBFileSpec::operator=(const SBFileSpec &rhs) { 4830fdc8d8SChris Lattner if (this != &rhs) 49226cce25SGreg Clayton *m_opaque_ap = *rhs.m_opaque_ap; 5030fdc8d8SChris Lattner return *this; 5130fdc8d8SChris Lattner } 5230fdc8d8SChris Lattner 53b9c1b51eSKate Stone bool SBFileSpec::IsValid() const { return m_opaque_ap->operator bool(); } 5430fdc8d8SChris Lattner 55b9c1b51eSKate Stone bool SBFileSpec::Exists() const { 565160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 57ceb6b139SCaroline Tice 58dbd7fabaSJonas Devlieghere bool result = FileSystem::Instance().Exists(*m_opaque_ap); 59ceb6b139SCaroline Tice 60ceb6b139SCaroline Tice if (log) 61324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::Exists () => %s", 62324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get()), 63324a1036SSaleem Abdulrasool (result ? "true" : "false")); 64ceb6b139SCaroline Tice 65ceb6b139SCaroline Tice return result; 6630fdc8d8SChris Lattner } 6730fdc8d8SChris Lattner 68b9c1b51eSKate Stone bool SBFileSpec::ResolveExecutableLocation() { 692c22c800SJonas Devlieghere return FileSystem::Instance().ResolveExecutableLocation(*m_opaque_ap); 70428a9a58SCaroline Tice } 7130fdc8d8SChris Lattner 72b9c1b51eSKate Stone int SBFileSpec::ResolvePath(const char *src_path, char *dst_path, 73b9c1b51eSKate Stone size_t dst_len) { 743f559740SZachary Turner llvm::SmallString<64> result(src_path); 758f3be7a3SJonas Devlieghere FileSystem::Instance().Resolve(result); 76686b1fe6SIlia K ::snprintf(dst_path, dst_len, "%s", result.c_str()); 77686b1fe6SIlia K return std::min(dst_len - 1, result.size()); 7830fdc8d8SChris Lattner } 7930fdc8d8SChris Lattner 80b9c1b51eSKate Stone const char *SBFileSpec::GetFilename() const { 81226cce25SGreg Clayton const char *s = m_opaque_ap->GetFilename().AsCString(); 824838131bSGreg Clayton 835160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 84b9c1b51eSKate Stone if (log) { 85cfd1acedSGreg Clayton if (s) 86324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetFilename () => \"%s\"", 87324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get()), s); 88cfd1acedSGreg Clayton else 89324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetFilename () => NULL", 90324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get())); 91cfd1acedSGreg Clayton } 92750cd175SCaroline Tice 934838131bSGreg Clayton return s; 9430fdc8d8SChris Lattner } 9530fdc8d8SChris Lattner 96b9c1b51eSKate Stone const char *SBFileSpec::GetDirectory() const { 977d2f62daSChaoren Lin FileSpec directory{*m_opaque_ap}; 987d2f62daSChaoren Lin directory.GetFilename().Clear(); 995160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 100b9c1b51eSKate Stone if (log) { 1017d2f62daSChaoren Lin if (directory) 102324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetDirectory () => \"%s\"", 103b9c1b51eSKate Stone static_cast<void *>(m_opaque_ap.get()), 104b9c1b51eSKate Stone directory.GetCString()); 105cfd1acedSGreg Clayton else 106324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetDirectory () => NULL", 107324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get())); 108cfd1acedSGreg Clayton } 1097d2f62daSChaoren Lin return directory.GetCString(); 11030fdc8d8SChris Lattner } 11130fdc8d8SChris Lattner 112b9c1b51eSKate Stone void SBFileSpec::SetFilename(const char *filename) { 113fbb76349SGreg Clayton if (filename && filename[0]) 114fbb76349SGreg Clayton m_opaque_ap->GetFilename().SetCString(filename); 115fbb76349SGreg Clayton else 116fbb76349SGreg Clayton m_opaque_ap->GetFilename().Clear(); 117fbb76349SGreg Clayton } 118fbb76349SGreg Clayton 119b9c1b51eSKate Stone void SBFileSpec::SetDirectory(const char *directory) { 120fbb76349SGreg Clayton if (directory && directory[0]) 121fbb76349SGreg Clayton m_opaque_ap->GetDirectory().SetCString(directory); 122fbb76349SGreg Clayton else 123fbb76349SGreg Clayton m_opaque_ap->GetDirectory().Clear(); 124fbb76349SGreg Clayton } 125fbb76349SGreg Clayton 126b9c1b51eSKate Stone uint32_t SBFileSpec::GetPath(char *dst_path, size_t dst_len) const { 1275160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 128ceb6b139SCaroline Tice 129226cce25SGreg Clayton uint32_t result = m_opaque_ap->GetPath(dst_path, dst_len); 130ceb6b139SCaroline Tice 131ceb6b139SCaroline Tice if (log) 132b9c1b51eSKate Stone log->Printf("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%" PRIu64 133b9c1b51eSKate Stone ") => %u", 134324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get()), result, dst_path, 135324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), result); 13630fdc8d8SChris Lattner 137cfd1acedSGreg Clayton if (result == 0 && dst_path && dst_len > 0) 13830fdc8d8SChris Lattner *dst_path = '\0'; 139cfd1acedSGreg Clayton return result; 14030fdc8d8SChris Lattner } 14130fdc8d8SChris Lattner 142b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::operator->() const { 1436611103cSGreg Clayton return m_opaque_ap.get(); 14430fdc8d8SChris Lattner } 14530fdc8d8SChris Lattner 146b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::get() const { 1476611103cSGreg Clayton return m_opaque_ap.get(); 14830fdc8d8SChris Lattner } 14930fdc8d8SChris Lattner 150b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::operator*() const { 1516611103cSGreg Clayton return *m_opaque_ap.get(); 15230fdc8d8SChris Lattner } 15330fdc8d8SChris Lattner 154b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::ref() const { 1556611103cSGreg Clayton return *m_opaque_ap.get(); 15630fdc8d8SChris Lattner } 15730fdc8d8SChris Lattner 158b9c1b51eSKate Stone void SBFileSpec::SetFileSpec(const lldb_private::FileSpec &fs) { 1596611103cSGreg Clayton *m_opaque_ap = fs; 16030fdc8d8SChris Lattner } 16130fdc8d8SChris Lattner 162b9c1b51eSKate Stone bool SBFileSpec::GetDescription(SBStream &description) const { 163da7bc7d0SGreg Clayton Stream &strm = description.ref(); 164cfd1acedSGreg Clayton char path[PATH_MAX]; 165cfd1acedSGreg Clayton if (m_opaque_ap->GetPath(path, sizeof(path))) 166da7bc7d0SGreg Clayton strm.PutCString(path); 167ceb6b139SCaroline Tice return true; 168ceb6b139SCaroline Tice } 169878ae018SJason Molenda 170b9c1b51eSKate Stone void SBFileSpec::AppendPathComponent(const char *fn) { 171878ae018SJason Molenda m_opaque_ap->AppendPathComponent(fn); 172878ae018SJason Molenda } 173