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 9672d2c12SJonas Devlieghere #include <inttypes.h> 108acdbb8aSStephen Wilson #include <limits.h> 118acdbb8aSStephen Wilson 12*bd4bf82aSJonas Devlieghere #include "Utils.h" 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 26d5b44036SJonas Devlieghere SBFileSpec::SBFileSpec() : m_opaque_up(new lldb_private::FileSpec()) {} 2730fdc8d8SChris Lattner 28*bd4bf82aSJonas Devlieghere SBFileSpec::SBFileSpec(const SBFileSpec &rhs) : m_opaque_up() { 29*bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 30*bd4bf82aSJonas Devlieghere } 3130fdc8d8SChris Lattner 32b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const lldb_private::FileSpec &fspec) 33d5b44036SJonas Devlieghere : m_opaque_up(new lldb_private::FileSpec(fspec)) {} 3430fdc8d8SChris Lattner 35d93c4a33SBruce Mitchener // Deprecated!!! 36d5b44036SJonas Devlieghere SBFileSpec::SBFileSpec(const char *path) : m_opaque_up(new FileSpec(path)) { 37d5b44036SJonas Devlieghere FileSystem::Instance().Resolve(*m_opaque_up); 388f3be7a3SJonas Devlieghere } 39274060b6SGreg Clayton 40b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const char *path, bool resolve) 41d5b44036SJonas Devlieghere : m_opaque_up(new FileSpec(path)) { 428f3be7a3SJonas Devlieghere if (resolve) 43d5b44036SJonas Devlieghere FileSystem::Instance().Resolve(*m_opaque_up); 448f3be7a3SJonas Devlieghere } 4530fdc8d8SChris Lattner 46b9c1b51eSKate Stone SBFileSpec::~SBFileSpec() {} 4730fdc8d8SChris Lattner 48b9c1b51eSKate Stone const SBFileSpec &SBFileSpec::operator=(const SBFileSpec &rhs) { 4930fdc8d8SChris Lattner if (this != &rhs) 50*bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 5130fdc8d8SChris Lattner return *this; 5230fdc8d8SChris Lattner } 5330fdc8d8SChris Lattner 54d5b44036SJonas Devlieghere bool SBFileSpec::IsValid() const { return m_opaque_up->operator bool(); } 5530fdc8d8SChris Lattner 56b9c1b51eSKate Stone bool SBFileSpec::Exists() const { 575160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 58ceb6b139SCaroline Tice 59d5b44036SJonas Devlieghere bool result = FileSystem::Instance().Exists(*m_opaque_up); 60ceb6b139SCaroline Tice 61ceb6b139SCaroline Tice if (log) 62324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::Exists () => %s", 63d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), 64324a1036SSaleem Abdulrasool (result ? "true" : "false")); 65ceb6b139SCaroline Tice 66ceb6b139SCaroline Tice return result; 6730fdc8d8SChris Lattner } 6830fdc8d8SChris Lattner 69b9c1b51eSKate Stone bool SBFileSpec::ResolveExecutableLocation() { 70d5b44036SJonas Devlieghere return FileSystem::Instance().ResolveExecutableLocation(*m_opaque_up); 71428a9a58SCaroline Tice } 7230fdc8d8SChris Lattner 73b9c1b51eSKate Stone int SBFileSpec::ResolvePath(const char *src_path, char *dst_path, 74b9c1b51eSKate Stone size_t dst_len) { 753f559740SZachary Turner llvm::SmallString<64> result(src_path); 768f3be7a3SJonas Devlieghere FileSystem::Instance().Resolve(result); 77686b1fe6SIlia K ::snprintf(dst_path, dst_len, "%s", result.c_str()); 78686b1fe6SIlia K return std::min(dst_len - 1, result.size()); 7930fdc8d8SChris Lattner } 8030fdc8d8SChris Lattner 81b9c1b51eSKate Stone const char *SBFileSpec::GetFilename() const { 82d5b44036SJonas Devlieghere const char *s = m_opaque_up->GetFilename().AsCString(); 834838131bSGreg Clayton 845160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 85b9c1b51eSKate Stone if (log) { 86cfd1acedSGreg Clayton if (s) 87324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetFilename () => \"%s\"", 88d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), s); 89cfd1acedSGreg Clayton else 90324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetFilename () => NULL", 91d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get())); 92cfd1acedSGreg Clayton } 93750cd175SCaroline Tice 944838131bSGreg Clayton return s; 9530fdc8d8SChris Lattner } 9630fdc8d8SChris Lattner 97b9c1b51eSKate Stone const char *SBFileSpec::GetDirectory() const { 98d5b44036SJonas Devlieghere FileSpec directory{*m_opaque_up}; 997d2f62daSChaoren Lin directory.GetFilename().Clear(); 1005160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 101b9c1b51eSKate Stone if (log) { 1027d2f62daSChaoren Lin if (directory) 103324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetDirectory () => \"%s\"", 104d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), 105b9c1b51eSKate Stone directory.GetCString()); 106cfd1acedSGreg Clayton else 107324a1036SSaleem Abdulrasool log->Printf("SBFileSpec(%p)::GetDirectory () => NULL", 108d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get())); 109cfd1acedSGreg Clayton } 1107d2f62daSChaoren Lin return directory.GetCString(); 11130fdc8d8SChris Lattner } 11230fdc8d8SChris Lattner 113b9c1b51eSKate Stone void SBFileSpec::SetFilename(const char *filename) { 114fbb76349SGreg Clayton if (filename && filename[0]) 115d5b44036SJonas Devlieghere m_opaque_up->GetFilename().SetCString(filename); 116fbb76349SGreg Clayton else 117d5b44036SJonas Devlieghere m_opaque_up->GetFilename().Clear(); 118fbb76349SGreg Clayton } 119fbb76349SGreg Clayton 120b9c1b51eSKate Stone void SBFileSpec::SetDirectory(const char *directory) { 121fbb76349SGreg Clayton if (directory && directory[0]) 122d5b44036SJonas Devlieghere m_opaque_up->GetDirectory().SetCString(directory); 123fbb76349SGreg Clayton else 124d5b44036SJonas Devlieghere m_opaque_up->GetDirectory().Clear(); 125fbb76349SGreg Clayton } 126fbb76349SGreg Clayton 127b9c1b51eSKate Stone uint32_t SBFileSpec::GetPath(char *dst_path, size_t dst_len) const { 1285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 129ceb6b139SCaroline Tice 130d5b44036SJonas Devlieghere uint32_t result = m_opaque_up->GetPath(dst_path, dst_len); 131ceb6b139SCaroline Tice 132ceb6b139SCaroline Tice if (log) 133b9c1b51eSKate Stone log->Printf("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%" PRIu64 134b9c1b51eSKate Stone ") => %u", 135d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), result, dst_path, 136324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), result); 13730fdc8d8SChris Lattner 138cfd1acedSGreg Clayton if (result == 0 && dst_path && dst_len > 0) 13930fdc8d8SChris Lattner *dst_path = '\0'; 140cfd1acedSGreg Clayton return result; 14130fdc8d8SChris Lattner } 14230fdc8d8SChris Lattner 143b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::operator->() const { 144d5b44036SJonas Devlieghere return m_opaque_up.get(); 14530fdc8d8SChris Lattner } 14630fdc8d8SChris Lattner 147b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::get() const { 148d5b44036SJonas Devlieghere return m_opaque_up.get(); 14930fdc8d8SChris Lattner } 15030fdc8d8SChris Lattner 151b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::operator*() const { 152d5b44036SJonas Devlieghere return *m_opaque_up; 15330fdc8d8SChris Lattner } 15430fdc8d8SChris Lattner 155d5b44036SJonas Devlieghere const lldb_private::FileSpec &SBFileSpec::ref() const { return *m_opaque_up; } 15630fdc8d8SChris Lattner 157b9c1b51eSKate Stone void SBFileSpec::SetFileSpec(const lldb_private::FileSpec &fs) { 158d5b44036SJonas Devlieghere *m_opaque_up = fs; 15930fdc8d8SChris Lattner } 16030fdc8d8SChris Lattner 161b9c1b51eSKate Stone bool SBFileSpec::GetDescription(SBStream &description) const { 162da7bc7d0SGreg Clayton Stream &strm = description.ref(); 163cfd1acedSGreg Clayton char path[PATH_MAX]; 164d5b44036SJonas Devlieghere if (m_opaque_up->GetPath(path, sizeof(path))) 165da7bc7d0SGreg Clayton strm.PutCString(path); 166ceb6b139SCaroline Tice return true; 167ceb6b139SCaroline Tice } 168878ae018SJason Molenda 169b9c1b51eSKate Stone void SBFileSpec::AppendPathComponent(const char *fn) { 170d5b44036SJonas Devlieghere m_opaque_up->AppendPathComponent(fn); 171878ae018SJason Molenda } 172