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