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" 15b9c1b51eSKate Stone #include "lldb/Host/FileSpec.h" 16*6f9e6901SZachary Turner #include "lldb/Utility/Log.h" 17bf9a7730SZachary Turner #include "lldb/Utility/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 24b9c1b51eSKate Stone SBFileSpec::SBFileSpec() : m_opaque_ap(new lldb_private::FileSpec()) {} 2530fdc8d8SChris Lattner 26b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const SBFileSpec &rhs) 27b9c1b51eSKate Stone : m_opaque_ap(new lldb_private::FileSpec(*rhs.m_opaque_ap)) {} 2830fdc8d8SChris Lattner 29b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const lldb_private::FileSpec &fspec) 30b9c1b51eSKate Stone : m_opaque_ap(new lldb_private::FileSpec(fspec)) {} 3130fdc8d8SChris Lattner 32d93c4a33SBruce Mitchener // Deprecated!!! 33b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const char *path) 34b9c1b51eSKate Stone : m_opaque_ap(new FileSpec(path, true)) {} 35274060b6SGreg Clayton 36b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const char *path, bool resolve) 37b9c1b51eSKate Stone : m_opaque_ap(new FileSpec(path, resolve)) {} 3830fdc8d8SChris Lattner 39b9c1b51eSKate Stone SBFileSpec::~SBFileSpec() {} 4030fdc8d8SChris Lattner 41b9c1b51eSKate Stone const SBFileSpec &SBFileSpec::operator=(const SBFileSpec &rhs) { 4230fdc8d8SChris Lattner if (this != &rhs) 43226cce25SGreg Clayton *m_opaque_ap = *rhs.m_opaque_ap; 4430fdc8d8SChris Lattner return *this; 4530fdc8d8SChris Lattner } 4630fdc8d8SChris Lattner 47b9c1b51eSKate Stone bool SBFileSpec::IsValid() const { return m_opaque_ap->operator bool(); } 4830fdc8d8SChris Lattner 49b9c1b51eSKate Stone bool SBFileSpec::Exists() const { 505160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 51ceb6b139SCaroline Tice 52226cce25SGreg Clayton bool result = m_opaque_ap->Exists(); 53ceb6b139SCaroline Tice 54ceb6b139SCaroline Tice if (log) 55324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::Exists () => %s", 56324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get()), 57324a1036SSaleem Abdulrasool (result ? "true" : "false")); 58ceb6b139SCaroline Tice 59ceb6b139SCaroline Tice return result; 6030fdc8d8SChris Lattner } 6130fdc8d8SChris Lattner 62b9c1b51eSKate Stone bool SBFileSpec::ResolveExecutableLocation() { 63428a9a58SCaroline Tice return m_opaque_ap->ResolveExecutableLocation(); 64428a9a58SCaroline Tice } 6530fdc8d8SChris Lattner 66b9c1b51eSKate Stone int SBFileSpec::ResolvePath(const char *src_path, char *dst_path, 67b9c1b51eSKate Stone size_t dst_len) { 683f559740SZachary Turner llvm::SmallString<64> result(src_path); 693f559740SZachary Turner lldb_private::FileSpec::Resolve(result); 70686b1fe6SIlia K ::snprintf(dst_path, dst_len, "%s", result.c_str()); 71686b1fe6SIlia K return std::min(dst_len - 1, result.size()); 7230fdc8d8SChris Lattner } 7330fdc8d8SChris Lattner 74b9c1b51eSKate Stone const char *SBFileSpec::GetFilename() const { 75226cce25SGreg Clayton const char *s = m_opaque_ap->GetFilename().AsCString(); 764838131bSGreg Clayton 775160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 78b9c1b51eSKate Stone if (log) { 79cfd1acedSGreg Clayton if (s) 80324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetFilename () => \"%s\"", 81324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get()), s); 82cfd1acedSGreg Clayton else 83324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetFilename () => NULL", 84324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get())); 85cfd1acedSGreg Clayton } 86750cd175SCaroline Tice 874838131bSGreg Clayton return s; 8830fdc8d8SChris Lattner } 8930fdc8d8SChris Lattner 90b9c1b51eSKate Stone const char *SBFileSpec::GetDirectory() const { 917d2f62daSChaoren Lin FileSpec directory{*m_opaque_ap}; 927d2f62daSChaoren Lin directory.GetFilename().Clear(); 935160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 94b9c1b51eSKate Stone if (log) { 957d2f62daSChaoren Lin if (directory) 96324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetDirectory () => \"%s\"", 97b9c1b51eSKate Stone static_cast<void *>(m_opaque_ap.get()), 98b9c1b51eSKate Stone directory.GetCString()); 99cfd1acedSGreg Clayton else 100324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetDirectory () => NULL", 101324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get())); 102cfd1acedSGreg Clayton } 1037d2f62daSChaoren Lin return directory.GetCString(); 10430fdc8d8SChris Lattner } 10530fdc8d8SChris Lattner 106b9c1b51eSKate Stone void SBFileSpec::SetFilename(const char *filename) { 107fbb76349SGreg Clayton if (filename && filename[0]) 108fbb76349SGreg Clayton m_opaque_ap->GetFilename().SetCString(filename); 109fbb76349SGreg Clayton else 110fbb76349SGreg Clayton m_opaque_ap->GetFilename().Clear(); 111fbb76349SGreg Clayton } 112fbb76349SGreg Clayton 113b9c1b51eSKate Stone void SBFileSpec::SetDirectory(const char *directory) { 114fbb76349SGreg Clayton if (directory && directory[0]) 115fbb76349SGreg Clayton m_opaque_ap->GetDirectory().SetCString(directory); 116fbb76349SGreg Clayton else 117fbb76349SGreg Clayton m_opaque_ap->GetDirectory().Clear(); 118fbb76349SGreg Clayton } 119fbb76349SGreg Clayton 120b9c1b51eSKate Stone uint32_t SBFileSpec::GetPath(char *dst_path, size_t dst_len) const { 1215160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 122ceb6b139SCaroline Tice 123226cce25SGreg Clayton uint32_t result = m_opaque_ap->GetPath(dst_path, dst_len); 124ceb6b139SCaroline Tice 125ceb6b139SCaroline Tice if (log) 126b9c1b51eSKate Stone log->Printf("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%" PRIu64 127b9c1b51eSKate Stone ") => %u", 128324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.get()), result, dst_path, 129324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), result); 13030fdc8d8SChris Lattner 131cfd1acedSGreg Clayton if (result == 0 && dst_path && dst_len > 0) 13230fdc8d8SChris Lattner *dst_path = '\0'; 133cfd1acedSGreg Clayton return result; 13430fdc8d8SChris Lattner } 13530fdc8d8SChris Lattner 136b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::operator->() const { 1376611103cSGreg Clayton return m_opaque_ap.get(); 13830fdc8d8SChris Lattner } 13930fdc8d8SChris Lattner 140b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::get() const { 1416611103cSGreg Clayton return m_opaque_ap.get(); 14230fdc8d8SChris Lattner } 14330fdc8d8SChris Lattner 144b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::operator*() const { 1456611103cSGreg Clayton return *m_opaque_ap.get(); 14630fdc8d8SChris Lattner } 14730fdc8d8SChris Lattner 148b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::ref() const { 1496611103cSGreg Clayton return *m_opaque_ap.get(); 15030fdc8d8SChris Lattner } 15130fdc8d8SChris Lattner 152b9c1b51eSKate Stone void SBFileSpec::SetFileSpec(const lldb_private::FileSpec &fs) { 1536611103cSGreg Clayton *m_opaque_ap = fs; 15430fdc8d8SChris Lattner } 15530fdc8d8SChris Lattner 156b9c1b51eSKate Stone bool SBFileSpec::GetDescription(SBStream &description) const { 157da7bc7d0SGreg Clayton Stream &strm = description.ref(); 158cfd1acedSGreg Clayton char path[PATH_MAX]; 159cfd1acedSGreg Clayton if (m_opaque_ap->GetPath(path, sizeof(path))) 160da7bc7d0SGreg Clayton strm.PutCString(path); 161ceb6b139SCaroline Tice return true; 162ceb6b139SCaroline Tice } 163878ae018SJason Molenda 164b9c1b51eSKate Stone void SBFileSpec::AppendPathComponent(const char *fn) { 165878ae018SJason Molenda m_opaque_ap->AppendPathComponent(fn); 166878ae018SJason Molenda } 167