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" 10baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 11baf5664fSJonas 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" 16bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 1730fdc8d8SChris Lattner 183f559740SZachary Turner #include "llvm/ADT/SmallString.h" 193f559740SZachary Turner 20baf5664fSJonas Devlieghere #include <inttypes.h> 21baf5664fSJonas Devlieghere #include <limits.h> 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()) { 27baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBFileSpec); 28baf5664fSJonas Devlieghere } 2930fdc8d8SChris Lattner 30bd4bf82aSJonas Devlieghere SBFileSpec::SBFileSpec(const SBFileSpec &rhs) : m_opaque_up() { 31baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBFileSpec, (const lldb::SBFileSpec &), 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)) { 41baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBFileSpec, (const char *), 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)) { 48baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBFileSpec, (const char *, bool), path, resolve); 49baf5664fSJonas Devlieghere 508f3be7a3SJonas Devlieghere if (resolve) 51d5b44036SJonas Devlieghere FileSystem::Instance().Resolve(*m_opaque_up); 528f3be7a3SJonas Devlieghere } 5330fdc8d8SChris Lattner 54b9c1b51eSKate Stone SBFileSpec::~SBFileSpec() {} 5530fdc8d8SChris Lattner 56b9c1b51eSKate Stone const SBFileSpec &SBFileSpec::operator=(const SBFileSpec &rhs) { 57baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBFileSpec &, 58baf5664fSJonas Devlieghere SBFileSpec, operator=,(const lldb::SBFileSpec &), rhs); 59baf5664fSJonas Devlieghere 6030fdc8d8SChris Lattner if (this != &rhs) 61bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 6230fdc8d8SChris Lattner return *this; 6330fdc8d8SChris Lattner } 6430fdc8d8SChris Lattner 65baf5664fSJonas Devlieghere bool SBFileSpec::IsValid() const { 66baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFileSpec, IsValid); 677f5237bcSPavel Labath return this->operator bool(); 687f5237bcSPavel Labath } 697f5237bcSPavel Labath SBFileSpec::operator bool() const { 707f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFileSpec, operator bool); 71baf5664fSJonas Devlieghere 72baf5664fSJonas Devlieghere return m_opaque_up->operator bool(); 73baf5664fSJonas Devlieghere } 7430fdc8d8SChris Lattner 75b9c1b51eSKate Stone bool SBFileSpec::Exists() const { 76baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFileSpec, Exists); 77baf5664fSJonas Devlieghere 78581af8b0SJonas Devlieghere return FileSystem::Instance().Exists(*m_opaque_up); 7930fdc8d8SChris Lattner } 8030fdc8d8SChris Lattner 81b9c1b51eSKate Stone bool SBFileSpec::ResolveExecutableLocation() { 82baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFileSpec, ResolveExecutableLocation); 83baf5664fSJonas Devlieghere 84d5b44036SJonas Devlieghere return FileSystem::Instance().ResolveExecutableLocation(*m_opaque_up); 85428a9a58SCaroline Tice } 8630fdc8d8SChris Lattner 87b9c1b51eSKate Stone int SBFileSpec::ResolvePath(const char *src_path, char *dst_path, 88b9c1b51eSKate Stone size_t dst_len) { 89baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(int, SBFileSpec, ResolvePath, 90baf5664fSJonas Devlieghere (const char *, char *, size_t), src_path, dst_path, 91baf5664fSJonas Devlieghere dst_len); 92baf5664fSJonas Devlieghere 933f559740SZachary Turner llvm::SmallString<64> result(src_path); 948f3be7a3SJonas Devlieghere FileSystem::Instance().Resolve(result); 95686b1fe6SIlia K ::snprintf(dst_path, dst_len, "%s", result.c_str()); 96686b1fe6SIlia K return std::min(dst_len - 1, result.size()); 9730fdc8d8SChris Lattner } 9830fdc8d8SChris Lattner 99b9c1b51eSKate Stone const char *SBFileSpec::GetFilename() const { 100baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFileSpec, GetFilename); 101baf5664fSJonas Devlieghere 102581af8b0SJonas Devlieghere return m_opaque_up->GetFilename().AsCString(); 10330fdc8d8SChris Lattner } 10430fdc8d8SChris Lattner 105b9c1b51eSKate Stone const char *SBFileSpec::GetDirectory() const { 106baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFileSpec, GetDirectory); 107baf5664fSJonas Devlieghere 108d5b44036SJonas Devlieghere FileSpec directory{*m_opaque_up}; 1097d2f62daSChaoren Lin directory.GetFilename().Clear(); 1107d2f62daSChaoren Lin return directory.GetCString(); 11130fdc8d8SChris Lattner } 11230fdc8d8SChris Lattner 113b9c1b51eSKate Stone void SBFileSpec::SetFilename(const char *filename) { 114baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBFileSpec, SetFilename, (const char *), filename); 115baf5664fSJonas Devlieghere 116fbb76349SGreg Clayton if (filename && filename[0]) 117d5b44036SJonas Devlieghere m_opaque_up->GetFilename().SetCString(filename); 118fbb76349SGreg Clayton else 119d5b44036SJonas Devlieghere m_opaque_up->GetFilename().Clear(); 120fbb76349SGreg Clayton } 121fbb76349SGreg Clayton 122b9c1b51eSKate Stone void SBFileSpec::SetDirectory(const char *directory) { 123baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBFileSpec, SetDirectory, (const char *), directory); 124baf5664fSJonas Devlieghere 125fbb76349SGreg Clayton if (directory && directory[0]) 126d5b44036SJonas Devlieghere m_opaque_up->GetDirectory().SetCString(directory); 127fbb76349SGreg Clayton else 128d5b44036SJonas Devlieghere m_opaque_up->GetDirectory().Clear(); 129fbb76349SGreg Clayton } 130fbb76349SGreg Clayton 131b9c1b51eSKate Stone uint32_t SBFileSpec::GetPath(char *dst_path, size_t dst_len) const { 132baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(uint32_t, SBFileSpec, GetPath, (char *, size_t), 133baf5664fSJonas Devlieghere dst_path, dst_len); 134baf5664fSJonas Devlieghere 135d5b44036SJonas Devlieghere uint32_t result = m_opaque_up->GetPath(dst_path, dst_len); 136ceb6b139SCaroline Tice 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 { 143d5b44036SJonas Devlieghere return m_opaque_up.get(); 14430fdc8d8SChris Lattner } 14530fdc8d8SChris Lattner 146b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::get() const { 147d5b44036SJonas Devlieghere return m_opaque_up.get(); 14830fdc8d8SChris Lattner } 14930fdc8d8SChris Lattner 150b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::operator*() const { 151d5b44036SJonas Devlieghere return *m_opaque_up; 15230fdc8d8SChris Lattner } 15330fdc8d8SChris Lattner 154d5b44036SJonas Devlieghere const lldb_private::FileSpec &SBFileSpec::ref() const { return *m_opaque_up; } 15530fdc8d8SChris Lattner 156b9c1b51eSKate Stone void SBFileSpec::SetFileSpec(const lldb_private::FileSpec &fs) { 157d5b44036SJonas Devlieghere *m_opaque_up = fs; 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner 160b9c1b51eSKate Stone bool SBFileSpec::GetDescription(SBStream &description) const { 161baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFileSpec, GetDescription, (lldb::SBStream &), 162baf5664fSJonas Devlieghere description); 163baf5664fSJonas Devlieghere 164da7bc7d0SGreg Clayton Stream &strm = description.ref(); 165cfd1acedSGreg Clayton char path[PATH_MAX]; 166d5b44036SJonas Devlieghere if (m_opaque_up->GetPath(path, sizeof(path))) 167da7bc7d0SGreg Clayton strm.PutCString(path); 168ceb6b139SCaroline Tice return true; 169ceb6b139SCaroline Tice } 170878ae018SJason Molenda 171b9c1b51eSKate Stone void SBFileSpec::AppendPathComponent(const char *fn) { 172baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBFileSpec, AppendPathComponent, (const char *), fn); 173baf5664fSJonas Devlieghere 174d5b44036SJonas Devlieghere m_opaque_up->AppendPathComponent(fn); 175878ae018SJason Molenda } 176*ae211eceSMichal Gorny 177*ae211eceSMichal Gorny namespace lldb_private { 178*ae211eceSMichal Gorny namespace repro { 179*ae211eceSMichal Gorny 180*ae211eceSMichal Gorny template <> 181*ae211eceSMichal Gorny void RegisterMethods<SBFileSpec>(Registry &R) { 182*ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFileSpec, ()); 183*ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFileSpec, (const lldb::SBFileSpec &)); 184*ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFileSpec, (const char *)); 185*ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBFileSpec, (const char *, bool)); 186*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const lldb::SBFileSpec &, 187*ae211eceSMichal Gorny SBFileSpec, operator=,(const lldb::SBFileSpec &)); 188*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFileSpec, IsValid, ()); 189*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFileSpec, operator bool, ()); 190*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFileSpec, Exists, ()); 191*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBFileSpec, ResolveExecutableLocation, ()); 192*ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(int, SBFileSpec, ResolvePath, 193*ae211eceSMichal Gorny (const char *, char *, size_t)); 194*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBFileSpec, GetFilename, ()); 195*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBFileSpec, GetDirectory, ()); 196*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBFileSpec, SetFilename, (const char *)); 197*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBFileSpec, SetDirectory, (const char *)); 198*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(uint32_t, SBFileSpec, GetPath, (char *, size_t)); 199*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBFileSpec, GetDescription, 200*ae211eceSMichal Gorny (lldb::SBStream &)); 201*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBFileSpec, AppendPathComponent, (const char *)); 202*ae211eceSMichal Gorny } 203*ae211eceSMichal Gorny 204*ae211eceSMichal Gorny } 205*ae211eceSMichal Gorny } 206