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