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