130fdc8d8SChris Lattner //===-- SBFileSpec.cpp ------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 930fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h" 10*baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 11*baf5664fSJonas Devlieghere #include "Utils.h" 12dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 132c22c800SJonas Devlieghere #include "lldb/Host/FileSystem.h" 148d48cd60SZachary Turner #include "lldb/Host/PosixApi.h" 155713a05bSZachary Turner #include "lldb/Utility/FileSpec.h" 166f9e6901SZachary Turner #include "lldb/Utility/Log.h" 17bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 1830fdc8d8SChris Lattner 193f559740SZachary Turner #include "llvm/ADT/SmallString.h" 203f559740SZachary Turner 21*baf5664fSJonas Devlieghere #include <inttypes.h> 22*baf5664fSJonas Devlieghere #include <limits.h> 23*baf5664fSJonas Devlieghere 2430fdc8d8SChris Lattner using namespace lldb; 2530fdc8d8SChris Lattner using namespace lldb_private; 2630fdc8d8SChris Lattner 27*baf5664fSJonas Devlieghere SBFileSpec::SBFileSpec() : m_opaque_up(new lldb_private::FileSpec()) { 28*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBFileSpec); 29*baf5664fSJonas Devlieghere } 3030fdc8d8SChris Lattner 31bd4bf82aSJonas Devlieghere SBFileSpec::SBFileSpec(const SBFileSpec &rhs) : m_opaque_up() { 32*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBFileSpec, (const lldb::SBFileSpec &), rhs); 33*baf5664fSJonas Devlieghere 34bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 35bd4bf82aSJonas Devlieghere } 3630fdc8d8SChris Lattner 37b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const lldb_private::FileSpec &fspec) 38d5b44036SJonas Devlieghere : m_opaque_up(new lldb_private::FileSpec(fspec)) {} 3930fdc8d8SChris Lattner 40d93c4a33SBruce Mitchener // Deprecated!!! 41d5b44036SJonas Devlieghere SBFileSpec::SBFileSpec(const char *path) : m_opaque_up(new FileSpec(path)) { 42*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBFileSpec, (const char *), path); 43*baf5664fSJonas Devlieghere 44d5b44036SJonas Devlieghere FileSystem::Instance().Resolve(*m_opaque_up); 458f3be7a3SJonas Devlieghere } 46274060b6SGreg Clayton 47b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const char *path, bool resolve) 48d5b44036SJonas Devlieghere : m_opaque_up(new FileSpec(path)) { 49*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBFileSpec, (const char *, bool), path, resolve); 50*baf5664fSJonas Devlieghere 518f3be7a3SJonas Devlieghere if (resolve) 52d5b44036SJonas Devlieghere FileSystem::Instance().Resolve(*m_opaque_up); 538f3be7a3SJonas Devlieghere } 5430fdc8d8SChris Lattner 55b9c1b51eSKate Stone SBFileSpec::~SBFileSpec() {} 5630fdc8d8SChris Lattner 57b9c1b51eSKate Stone const SBFileSpec &SBFileSpec::operator=(const SBFileSpec &rhs) { 58*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBFileSpec &, 59*baf5664fSJonas Devlieghere SBFileSpec, operator=,(const lldb::SBFileSpec &), rhs); 60*baf5664fSJonas Devlieghere 6130fdc8d8SChris Lattner if (this != &rhs) 62bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 6330fdc8d8SChris Lattner return *this; 6430fdc8d8SChris Lattner } 6530fdc8d8SChris Lattner 66*baf5664fSJonas Devlieghere bool SBFileSpec::IsValid() const { 67*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFileSpec, IsValid); 68*baf5664fSJonas Devlieghere 69*baf5664fSJonas Devlieghere return m_opaque_up->operator bool(); 70*baf5664fSJonas Devlieghere } 7130fdc8d8SChris Lattner 72b9c1b51eSKate Stone bool SBFileSpec::Exists() const { 73*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFileSpec, Exists); 74*baf5664fSJonas Devlieghere 755160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 76ceb6b139SCaroline Tice 77d5b44036SJonas Devlieghere bool result = FileSystem::Instance().Exists(*m_opaque_up); 78ceb6b139SCaroline Tice 79ceb6b139SCaroline Tice if (log) 80324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::Exists () => %s", 81d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), 82324a1036SSaleem Abdulrasool (result ? "true" : "false")); 83ceb6b139SCaroline Tice 84ceb6b139SCaroline Tice return result; 8530fdc8d8SChris Lattner } 8630fdc8d8SChris Lattner 87b9c1b51eSKate Stone bool SBFileSpec::ResolveExecutableLocation() { 88*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFileSpec, ResolveExecutableLocation); 89*baf5664fSJonas Devlieghere 90d5b44036SJonas Devlieghere return FileSystem::Instance().ResolveExecutableLocation(*m_opaque_up); 91428a9a58SCaroline Tice } 9230fdc8d8SChris Lattner 93b9c1b51eSKate Stone int SBFileSpec::ResolvePath(const char *src_path, char *dst_path, 94b9c1b51eSKate Stone size_t dst_len) { 95*baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(int, SBFileSpec, ResolvePath, 96*baf5664fSJonas Devlieghere (const char *, char *, size_t), src_path, dst_path, 97*baf5664fSJonas Devlieghere dst_len); 98*baf5664fSJonas Devlieghere 993f559740SZachary Turner llvm::SmallString<64> result(src_path); 1008f3be7a3SJonas Devlieghere FileSystem::Instance().Resolve(result); 101686b1fe6SIlia K ::snprintf(dst_path, dst_len, "%s", result.c_str()); 102686b1fe6SIlia K return std::min(dst_len - 1, result.size()); 10330fdc8d8SChris Lattner } 10430fdc8d8SChris Lattner 105b9c1b51eSKate Stone const char *SBFileSpec::GetFilename() const { 106*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFileSpec, GetFilename); 107*baf5664fSJonas Devlieghere 108d5b44036SJonas Devlieghere const char *s = m_opaque_up->GetFilename().AsCString(); 1094838131bSGreg Clayton 1105160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 111b9c1b51eSKate Stone if (log) { 112cfd1acedSGreg Clayton if (s) 113324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetFilename () => \"%s\"", 114d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), s); 115cfd1acedSGreg Clayton else 116324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetFilename () => NULL", 117d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get())); 118cfd1acedSGreg Clayton } 119750cd175SCaroline Tice 1204838131bSGreg Clayton return s; 12130fdc8d8SChris Lattner } 12230fdc8d8SChris Lattner 123b9c1b51eSKate Stone const char *SBFileSpec::GetDirectory() const { 124*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFileSpec, GetDirectory); 125*baf5664fSJonas Devlieghere 126d5b44036SJonas Devlieghere FileSpec directory{*m_opaque_up}; 1277d2f62daSChaoren Lin directory.GetFilename().Clear(); 1285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 129b9c1b51eSKate Stone if (log) { 1307d2f62daSChaoren Lin if (directory) 131324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetDirectory () => \"%s\"", 132d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), 133b9c1b51eSKate Stone directory.GetCString()); 134cfd1acedSGreg Clayton else 135324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetDirectory () => NULL", 136d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get())); 137cfd1acedSGreg Clayton } 1387d2f62daSChaoren Lin return directory.GetCString(); 13930fdc8d8SChris Lattner } 14030fdc8d8SChris Lattner 141b9c1b51eSKate Stone void SBFileSpec::SetFilename(const char *filename) { 142*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBFileSpec, SetFilename, (const char *), filename); 143*baf5664fSJonas Devlieghere 144fbb76349SGreg Clayton if (filename && filename[0]) 145d5b44036SJonas Devlieghere m_opaque_up->GetFilename().SetCString(filename); 146fbb76349SGreg Clayton else 147d5b44036SJonas Devlieghere m_opaque_up->GetFilename().Clear(); 148fbb76349SGreg Clayton } 149fbb76349SGreg Clayton 150b9c1b51eSKate Stone void SBFileSpec::SetDirectory(const char *directory) { 151*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBFileSpec, SetDirectory, (const char *), directory); 152*baf5664fSJonas Devlieghere 153fbb76349SGreg Clayton if (directory && directory[0]) 154d5b44036SJonas Devlieghere m_opaque_up->GetDirectory().SetCString(directory); 155fbb76349SGreg Clayton else 156d5b44036SJonas Devlieghere m_opaque_up->GetDirectory().Clear(); 157fbb76349SGreg Clayton } 158fbb76349SGreg Clayton 159b9c1b51eSKate Stone uint32_t SBFileSpec::GetPath(char *dst_path, size_t dst_len) const { 160*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(uint32_t, SBFileSpec, GetPath, (char *, size_t), 161*baf5664fSJonas Devlieghere dst_path, dst_len); 162*baf5664fSJonas Devlieghere 1635160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 164ceb6b139SCaroline Tice 165d5b44036SJonas Devlieghere uint32_t result = m_opaque_up->GetPath(dst_path, dst_len); 166ceb6b139SCaroline Tice 167ceb6b139SCaroline Tice if (log) 168b9c1b51eSKate Stone log->Printf("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%" PRIu64 169b9c1b51eSKate Stone ") => %u", 170d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), result, dst_path, 171324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), result); 17230fdc8d8SChris Lattner 173cfd1acedSGreg Clayton if (result == 0 && dst_path && dst_len > 0) 17430fdc8d8SChris Lattner *dst_path = '\0'; 175cfd1acedSGreg Clayton return result; 17630fdc8d8SChris Lattner } 17730fdc8d8SChris Lattner 178b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::operator->() const { 179d5b44036SJonas Devlieghere return m_opaque_up.get(); 18030fdc8d8SChris Lattner } 18130fdc8d8SChris Lattner 182b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::get() const { 183d5b44036SJonas Devlieghere return m_opaque_up.get(); 18430fdc8d8SChris Lattner } 18530fdc8d8SChris Lattner 186b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::operator*() const { 187d5b44036SJonas Devlieghere return *m_opaque_up; 18830fdc8d8SChris Lattner } 18930fdc8d8SChris Lattner 190d5b44036SJonas Devlieghere const lldb_private::FileSpec &SBFileSpec::ref() const { return *m_opaque_up; } 19130fdc8d8SChris Lattner 192b9c1b51eSKate Stone void SBFileSpec::SetFileSpec(const lldb_private::FileSpec &fs) { 193d5b44036SJonas Devlieghere *m_opaque_up = fs; 19430fdc8d8SChris Lattner } 19530fdc8d8SChris Lattner 196b9c1b51eSKate Stone bool SBFileSpec::GetDescription(SBStream &description) const { 197*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFileSpec, GetDescription, (lldb::SBStream &), 198*baf5664fSJonas Devlieghere description); 199*baf5664fSJonas Devlieghere 200da7bc7d0SGreg Clayton Stream &strm = description.ref(); 201cfd1acedSGreg Clayton char path[PATH_MAX]; 202d5b44036SJonas Devlieghere if (m_opaque_up->GetPath(path, sizeof(path))) 203da7bc7d0SGreg Clayton strm.PutCString(path); 204ceb6b139SCaroline Tice return true; 205ceb6b139SCaroline Tice } 206878ae018SJason Molenda 207b9c1b51eSKate Stone void SBFileSpec::AppendPathComponent(const char *fn) { 208*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBFileSpec, AppendPathComponent, (const char *), fn); 209*baf5664fSJonas Devlieghere 210d5b44036SJonas Devlieghere m_opaque_up->AppendPathComponent(fn); 211878ae018SJason Molenda } 212