180814287SRaphael Isemann //===-- SBFileSpec.cpp ----------------------------------------------------===// 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" 10baf5664fSJonas Devlieghere #include "Utils.h" 11dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 122c22c800SJonas Devlieghere #include "lldb/Host/FileSystem.h" 138d48cd60SZachary Turner #include "lldb/Host/PosixApi.h" 145713a05bSZachary Turner #include "lldb/Utility/FileSpec.h" 15*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h" 16bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 1730fdc8d8SChris Lattner 183f559740SZachary Turner #include "llvm/ADT/SmallString.h" 193f559740SZachary Turner 2076e47d48SRaphael Isemann #include <cinttypes> 2176e47d48SRaphael Isemann #include <climits> 22baf5664fSJonas Devlieghere 2330fdc8d8SChris Lattner using namespace lldb; 2430fdc8d8SChris Lattner using namespace lldb_private; 2530fdc8d8SChris Lattner 26baf5664fSJonas Devlieghere SBFileSpec::SBFileSpec() : m_opaque_up(new lldb_private::FileSpec()) { 27*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 28baf5664fSJonas Devlieghere } 2930fdc8d8SChris Lattner 30a3436f73SKazu Hirata SBFileSpec::SBFileSpec(const SBFileSpec &rhs) { 31*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 32baf5664fSJonas Devlieghere 33bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 34bd4bf82aSJonas Devlieghere } 3530fdc8d8SChris Lattner 36b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const lldb_private::FileSpec &fspec) 37d5b44036SJonas Devlieghere : m_opaque_up(new lldb_private::FileSpec(fspec)) {} 3830fdc8d8SChris Lattner 39d93c4a33SBruce Mitchener // Deprecated!!! 40d5b44036SJonas Devlieghere SBFileSpec::SBFileSpec(const char *path) : m_opaque_up(new FileSpec(path)) { 41*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, path); 42baf5664fSJonas Devlieghere 43d5b44036SJonas Devlieghere FileSystem::Instance().Resolve(*m_opaque_up); 448f3be7a3SJonas Devlieghere } 45274060b6SGreg Clayton 46b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const char *path, bool resolve) 47d5b44036SJonas Devlieghere : m_opaque_up(new FileSpec(path)) { 48*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, path, resolve); 49baf5664fSJonas Devlieghere 508f3be7a3SJonas Devlieghere if (resolve) 51d5b44036SJonas Devlieghere FileSystem::Instance().Resolve(*m_opaque_up); 528f3be7a3SJonas Devlieghere } 5330fdc8d8SChris Lattner 54866b7a65SJonas Devlieghere SBFileSpec::~SBFileSpec() = default; 5530fdc8d8SChris Lattner 56b9c1b51eSKate Stone const SBFileSpec &SBFileSpec::operator=(const SBFileSpec &rhs) { 57*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 58baf5664fSJonas Devlieghere 5930fdc8d8SChris Lattner if (this != &rhs) 60bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 61d232abc3SJonas Devlieghere return *this; 6230fdc8d8SChris Lattner } 6330fdc8d8SChris Lattner 644bc05006SPavel Labath bool SBFileSpec::operator==(const SBFileSpec &rhs) const { 65*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 664bc05006SPavel Labath 674bc05006SPavel Labath return ref() == rhs.ref(); 684bc05006SPavel Labath } 694bc05006SPavel Labath 704bc05006SPavel Labath bool SBFileSpec::operator!=(const SBFileSpec &rhs) const { 71*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 724bc05006SPavel Labath 734bc05006SPavel Labath return !(*this == rhs); 744bc05006SPavel Labath } 754bc05006SPavel Labath 76baf5664fSJonas Devlieghere bool SBFileSpec::IsValid() const { 77*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 787f5237bcSPavel Labath return this->operator bool(); 797f5237bcSPavel Labath } 807f5237bcSPavel Labath SBFileSpec::operator bool() const { 81*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 82baf5664fSJonas Devlieghere 83baf5664fSJonas Devlieghere return m_opaque_up->operator bool(); 84baf5664fSJonas Devlieghere } 8530fdc8d8SChris Lattner 86b9c1b51eSKate Stone bool SBFileSpec::Exists() const { 87*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 88baf5664fSJonas Devlieghere 89581af8b0SJonas Devlieghere return FileSystem::Instance().Exists(*m_opaque_up); 9030fdc8d8SChris Lattner } 9130fdc8d8SChris Lattner 92b9c1b51eSKate Stone bool SBFileSpec::ResolveExecutableLocation() { 93*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 94baf5664fSJonas Devlieghere 95d5b44036SJonas Devlieghere return FileSystem::Instance().ResolveExecutableLocation(*m_opaque_up); 96428a9a58SCaroline Tice } 9730fdc8d8SChris Lattner 98b9c1b51eSKate Stone int SBFileSpec::ResolvePath(const char *src_path, char *dst_path, 99b9c1b51eSKate Stone size_t dst_len) { 100*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(src_path, dst_path, dst_len); 101baf5664fSJonas Devlieghere 1023f559740SZachary Turner llvm::SmallString<64> result(src_path); 1038f3be7a3SJonas Devlieghere FileSystem::Instance().Resolve(result); 104686b1fe6SIlia K ::snprintf(dst_path, dst_len, "%s", result.c_str()); 105686b1fe6SIlia K return std::min(dst_len - 1, result.size()); 10630fdc8d8SChris Lattner } 10730fdc8d8SChris Lattner 108b9c1b51eSKate Stone const char *SBFileSpec::GetFilename() const { 109*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 110baf5664fSJonas Devlieghere 111581af8b0SJonas Devlieghere return m_opaque_up->GetFilename().AsCString(); 11230fdc8d8SChris Lattner } 11330fdc8d8SChris Lattner 114b9c1b51eSKate Stone const char *SBFileSpec::GetDirectory() const { 115*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 116baf5664fSJonas Devlieghere 117d5b44036SJonas Devlieghere FileSpec directory{*m_opaque_up}; 1187d2f62daSChaoren Lin directory.GetFilename().Clear(); 1197d2f62daSChaoren Lin return directory.GetCString(); 12030fdc8d8SChris Lattner } 12130fdc8d8SChris Lattner 122b9c1b51eSKate Stone void SBFileSpec::SetFilename(const char *filename) { 123*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, filename); 124baf5664fSJonas Devlieghere 125fbb76349SGreg Clayton if (filename && filename[0]) 126d5b44036SJonas Devlieghere m_opaque_up->GetFilename().SetCString(filename); 127fbb76349SGreg Clayton else 128d5b44036SJonas Devlieghere m_opaque_up->GetFilename().Clear(); 129fbb76349SGreg Clayton } 130fbb76349SGreg Clayton 131b9c1b51eSKate Stone void SBFileSpec::SetDirectory(const char *directory) { 132*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, directory); 133baf5664fSJonas Devlieghere 134fbb76349SGreg Clayton if (directory && directory[0]) 135d5b44036SJonas Devlieghere m_opaque_up->GetDirectory().SetCString(directory); 136fbb76349SGreg Clayton else 137d5b44036SJonas Devlieghere m_opaque_up->GetDirectory().Clear(); 138fbb76349SGreg Clayton } 139fbb76349SGreg Clayton 140b9c1b51eSKate Stone uint32_t SBFileSpec::GetPath(char *dst_path, size_t dst_len) const { 141*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, dst_path, dst_len); 142baf5664fSJonas Devlieghere 143d5b44036SJonas Devlieghere uint32_t result = m_opaque_up->GetPath(dst_path, dst_len); 144ceb6b139SCaroline Tice 145cfd1acedSGreg Clayton if (result == 0 && dst_path && dst_len > 0) 14630fdc8d8SChris Lattner *dst_path = '\0'; 147cfd1acedSGreg Clayton return result; 14830fdc8d8SChris Lattner } 14930fdc8d8SChris Lattner 150b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::operator->() const { 151d5b44036SJonas Devlieghere return m_opaque_up.get(); 15230fdc8d8SChris Lattner } 15330fdc8d8SChris Lattner 154b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::get() const { 155d5b44036SJonas Devlieghere return m_opaque_up.get(); 15630fdc8d8SChris Lattner } 15730fdc8d8SChris Lattner 158b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::operator*() const { 159d5b44036SJonas Devlieghere return *m_opaque_up; 16030fdc8d8SChris Lattner } 16130fdc8d8SChris Lattner 162d5b44036SJonas Devlieghere const lldb_private::FileSpec &SBFileSpec::ref() const { return *m_opaque_up; } 16330fdc8d8SChris Lattner 164b9c1b51eSKate Stone void SBFileSpec::SetFileSpec(const lldb_private::FileSpec &fs) { 165d5b44036SJonas Devlieghere *m_opaque_up = fs; 16630fdc8d8SChris Lattner } 16730fdc8d8SChris Lattner 168b9c1b51eSKate Stone bool SBFileSpec::GetDescription(SBStream &description) const { 169*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, description); 170baf5664fSJonas Devlieghere 171da7bc7d0SGreg Clayton Stream &strm = description.ref(); 172cfd1acedSGreg Clayton char path[PATH_MAX]; 173d5b44036SJonas Devlieghere if (m_opaque_up->GetPath(path, sizeof(path))) 174da7bc7d0SGreg Clayton strm.PutCString(path); 175ceb6b139SCaroline Tice return true; 176ceb6b139SCaroline Tice } 177878ae018SJason Molenda 178b9c1b51eSKate Stone void SBFileSpec::AppendPathComponent(const char *fn) { 179*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, fn); 180baf5664fSJonas Devlieghere 181d5b44036SJonas Devlieghere m_opaque_up->AppendPathComponent(fn); 182878ae018SJason Molenda } 183