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"
151755f5b1SJonas 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 
SBFileSpec()26baf5664fSJonas Devlieghere SBFileSpec::SBFileSpec() : m_opaque_up(new lldb_private::FileSpec()) {
271755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
28baf5664fSJonas Devlieghere }
2930fdc8d8SChris Lattner 
SBFileSpec(const SBFileSpec & rhs)30a3436f73SKazu Hirata SBFileSpec::SBFileSpec(const SBFileSpec &rhs) {
311755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
32baf5664fSJonas Devlieghere 
33bd4bf82aSJonas Devlieghere   m_opaque_up = clone(rhs.m_opaque_up);
34bd4bf82aSJonas Devlieghere }
3530fdc8d8SChris Lattner 
SBFileSpec(const lldb_private::FileSpec & fspec)36b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const lldb_private::FileSpec &fspec)
37d5b44036SJonas Devlieghere     : m_opaque_up(new lldb_private::FileSpec(fspec)) {}
3830fdc8d8SChris Lattner 
39d93c4a33SBruce Mitchener // Deprecated!!!
SBFileSpec(const char * path)40d5b44036SJonas Devlieghere SBFileSpec::SBFileSpec(const char *path) : m_opaque_up(new FileSpec(path)) {
411755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, path);
42baf5664fSJonas Devlieghere 
43d5b44036SJonas Devlieghere   FileSystem::Instance().Resolve(*m_opaque_up);
448f3be7a3SJonas Devlieghere }
45274060b6SGreg Clayton 
SBFileSpec(const char * path,bool resolve)46b9c1b51eSKate Stone SBFileSpec::SBFileSpec(const char *path, bool resolve)
47d5b44036SJonas Devlieghere     : m_opaque_up(new FileSpec(path)) {
481755f5b1SJonas 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 
operator =(const SBFileSpec & rhs)56b9c1b51eSKate Stone const SBFileSpec &SBFileSpec::operator=(const SBFileSpec &rhs) {
571755f5b1SJonas 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 
operator ==(const SBFileSpec & rhs) const644bc05006SPavel Labath bool SBFileSpec::operator==(const SBFileSpec &rhs) const {
651755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
664bc05006SPavel Labath 
674bc05006SPavel Labath   return ref() == rhs.ref();
684bc05006SPavel Labath }
694bc05006SPavel Labath 
operator !=(const SBFileSpec & rhs) const704bc05006SPavel Labath bool SBFileSpec::operator!=(const SBFileSpec &rhs) const {
711755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
724bc05006SPavel Labath 
734bc05006SPavel Labath   return !(*this == rhs);
744bc05006SPavel Labath }
754bc05006SPavel Labath 
IsValid() const76baf5664fSJonas Devlieghere bool SBFileSpec::IsValid() const {
771755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
787f5237bcSPavel Labath   return this->operator bool();
797f5237bcSPavel Labath }
operator bool() const807f5237bcSPavel Labath SBFileSpec::operator bool() const {
811755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
82baf5664fSJonas Devlieghere 
83baf5664fSJonas Devlieghere   return m_opaque_up->operator bool();
84baf5664fSJonas Devlieghere }
8530fdc8d8SChris Lattner 
Exists() const86b9c1b51eSKate Stone bool SBFileSpec::Exists() const {
871755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
88baf5664fSJonas Devlieghere 
89581af8b0SJonas Devlieghere   return FileSystem::Instance().Exists(*m_opaque_up);
9030fdc8d8SChris Lattner }
9130fdc8d8SChris Lattner 
ResolveExecutableLocation()92b9c1b51eSKate Stone bool SBFileSpec::ResolveExecutableLocation() {
931755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
94baf5664fSJonas Devlieghere 
95d5b44036SJonas Devlieghere   return FileSystem::Instance().ResolveExecutableLocation(*m_opaque_up);
96428a9a58SCaroline Tice }
9730fdc8d8SChris Lattner 
ResolvePath(const char * src_path,char * dst_path,size_t dst_len)98b9c1b51eSKate Stone int SBFileSpec::ResolvePath(const char *src_path, char *dst_path,
99b9c1b51eSKate Stone                             size_t dst_len) {
1001755f5b1SJonas 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 
GetFilename() const108b9c1b51eSKate Stone const char *SBFileSpec::GetFilename() const {
1091755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
110baf5664fSJonas Devlieghere 
111581af8b0SJonas Devlieghere   return m_opaque_up->GetFilename().AsCString();
11230fdc8d8SChris Lattner }
11330fdc8d8SChris Lattner 
GetDirectory() const114b9c1b51eSKate Stone const char *SBFileSpec::GetDirectory() const {
1151755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
116baf5664fSJonas Devlieghere 
117d5b44036SJonas Devlieghere   FileSpec directory{*m_opaque_up};
118*1b4b12a3SNico Weber   directory.GetFilename().Clear();
119*1b4b12a3SNico Weber   return directory.GetCString();
12030fdc8d8SChris Lattner }
12130fdc8d8SChris Lattner 
SetFilename(const char * filename)122b9c1b51eSKate Stone void SBFileSpec::SetFilename(const char *filename) {
1231755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, filename);
124baf5664fSJonas Devlieghere 
125fbb76349SGreg Clayton   if (filename && filename[0])
126*1b4b12a3SNico Weber     m_opaque_up->GetFilename().SetCString(filename);
127fbb76349SGreg Clayton   else
128*1b4b12a3SNico Weber     m_opaque_up->GetFilename().Clear();
129fbb76349SGreg Clayton }
130fbb76349SGreg Clayton 
SetDirectory(const char * directory)131b9c1b51eSKate Stone void SBFileSpec::SetDirectory(const char *directory) {
1321755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, directory);
133baf5664fSJonas Devlieghere 
134fbb76349SGreg Clayton   if (directory && directory[0])
135*1b4b12a3SNico Weber     m_opaque_up->GetDirectory().SetCString(directory);
136fbb76349SGreg Clayton   else
137*1b4b12a3SNico Weber     m_opaque_up->GetDirectory().Clear();
138fbb76349SGreg Clayton }
139fbb76349SGreg Clayton 
GetPath(char * dst_path,size_t dst_len) const140b9c1b51eSKate Stone uint32_t SBFileSpec::GetPath(char *dst_path, size_t dst_len) const {
1411755f5b1SJonas 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 
operator ->() const150b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::operator->() const {
151d5b44036SJonas Devlieghere   return m_opaque_up.get();
15230fdc8d8SChris Lattner }
15330fdc8d8SChris Lattner 
get() const154b9c1b51eSKate Stone const lldb_private::FileSpec *SBFileSpec::get() const {
155d5b44036SJonas Devlieghere   return m_opaque_up.get();
15630fdc8d8SChris Lattner }
15730fdc8d8SChris Lattner 
operator *() const158b9c1b51eSKate Stone const lldb_private::FileSpec &SBFileSpec::operator*() const {
159d5b44036SJonas Devlieghere   return *m_opaque_up;
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
ref() const162d5b44036SJonas Devlieghere const lldb_private::FileSpec &SBFileSpec::ref() const { return *m_opaque_up; }
16330fdc8d8SChris Lattner 
SetFileSpec(const lldb_private::FileSpec & fs)164b9c1b51eSKate Stone void SBFileSpec::SetFileSpec(const lldb_private::FileSpec &fs) {
165d5b44036SJonas Devlieghere   *m_opaque_up = fs;
16630fdc8d8SChris Lattner }
16730fdc8d8SChris Lattner 
GetDescription(SBStream & description) const168b9c1b51eSKate Stone bool SBFileSpec::GetDescription(SBStream &description) const {
1691755f5b1SJonas 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 
AppendPathComponent(const char * fn)178b9c1b51eSKate Stone void SBFileSpec::AppendPathComponent(const char *fn) {
1791755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, fn);
180baf5664fSJonas Devlieghere 
181d5b44036SJonas Devlieghere   m_opaque_up->AppendPathComponent(fn);
182878ae018SJason Molenda }
183