1*0b57cec5SDimitry Andric //===-- SBFileSpec.cpp ----------------------------------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #include "lldb/API/SBFileSpec.h"
10*0b57cec5SDimitry Andric #include "Utils.h"
11*0b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
12*0b57cec5SDimitry Andric #include "lldb/Host/FileSystem.h"
13*0b57cec5SDimitry Andric #include "lldb/Host/PosixApi.h"
14*0b57cec5SDimitry Andric #include "lldb/Utility/FileSpec.h"
15*0b57cec5SDimitry Andric #include "lldb/Utility/Instrumentation.h"
16*0b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
17*0b57cec5SDimitry Andric 
18*0b57cec5SDimitry Andric #include "llvm/ADT/SmallString.h"
19*0b57cec5SDimitry Andric 
20*0b57cec5SDimitry Andric #include <cinttypes>
21*0b57cec5SDimitry Andric #include <climits>
22*0b57cec5SDimitry Andric 
23*0b57cec5SDimitry Andric using namespace lldb;
24*0b57cec5SDimitry Andric using namespace lldb_private;
25*0b57cec5SDimitry Andric 
SBFileSpec()26*0b57cec5SDimitry Andric SBFileSpec::SBFileSpec() : m_opaque_up(new lldb_private::FileSpec()) {
27*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
28*0b57cec5SDimitry Andric }
29*0b57cec5SDimitry Andric 
SBFileSpec(const SBFileSpec & rhs)30*0b57cec5SDimitry Andric SBFileSpec::SBFileSpec(const SBFileSpec &rhs) {
31*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
32*0b57cec5SDimitry Andric 
33*0b57cec5SDimitry Andric   m_opaque_up = clone(rhs.m_opaque_up);
34*0b57cec5SDimitry Andric }
35*0b57cec5SDimitry Andric 
SBFileSpec(const lldb_private::FileSpec & fspec)36*0b57cec5SDimitry Andric SBFileSpec::SBFileSpec(const lldb_private::FileSpec &fspec)
37*0b57cec5SDimitry Andric     : m_opaque_up(new lldb_private::FileSpec(fspec)) {}
38*0b57cec5SDimitry Andric 
39*0b57cec5SDimitry Andric // Deprecated!!!
SBFileSpec(const char * path)40*0b57cec5SDimitry Andric SBFileSpec::SBFileSpec(const char *path) : m_opaque_up(new FileSpec(path)) {
41*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, path);
42*0b57cec5SDimitry Andric 
43*0b57cec5SDimitry Andric   FileSystem::Instance().Resolve(*m_opaque_up);
44*0b57cec5SDimitry Andric }
45*0b57cec5SDimitry Andric 
SBFileSpec(const char * path,bool resolve)46*0b57cec5SDimitry Andric SBFileSpec::SBFileSpec(const char *path, bool resolve)
47*0b57cec5SDimitry Andric     : m_opaque_up(new FileSpec(path)) {
48*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, path, resolve);
49*0b57cec5SDimitry Andric 
50*0b57cec5SDimitry Andric   if (resolve)
51*0b57cec5SDimitry Andric     FileSystem::Instance().Resolve(*m_opaque_up);
52*0b57cec5SDimitry Andric }
53*0b57cec5SDimitry Andric 
54*0b57cec5SDimitry Andric SBFileSpec::~SBFileSpec() = default;
55*0b57cec5SDimitry Andric 
operator =(const SBFileSpec & rhs)56*0b57cec5SDimitry Andric const SBFileSpec &SBFileSpec::operator=(const SBFileSpec &rhs) {
57*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
58*0b57cec5SDimitry Andric 
59*0b57cec5SDimitry Andric   if (this != &rhs)
60*0b57cec5SDimitry Andric     m_opaque_up = clone(rhs.m_opaque_up);
61*0b57cec5SDimitry Andric   return *this;
62*0b57cec5SDimitry Andric }
63*0b57cec5SDimitry Andric 
operator ==(const SBFileSpec & rhs) const64*0b57cec5SDimitry Andric bool SBFileSpec::operator==(const SBFileSpec &rhs) const {
65*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
66*0b57cec5SDimitry Andric 
67*0b57cec5SDimitry Andric   return ref() == rhs.ref();
68*0b57cec5SDimitry Andric }
69*0b57cec5SDimitry Andric 
operator !=(const SBFileSpec & rhs) const70*0b57cec5SDimitry Andric bool SBFileSpec::operator!=(const SBFileSpec &rhs) const {
71*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
72*0b57cec5SDimitry Andric 
73*0b57cec5SDimitry Andric   return !(*this == rhs);
74*0b57cec5SDimitry Andric }
75*0b57cec5SDimitry Andric 
IsValid() const76*0b57cec5SDimitry Andric bool SBFileSpec::IsValid() const {
77*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
78*0b57cec5SDimitry Andric   return this->operator bool();
79*0b57cec5SDimitry Andric }
operator bool() const80*0b57cec5SDimitry Andric SBFileSpec::operator bool() const {
81*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
82*0b57cec5SDimitry Andric 
83*0b57cec5SDimitry Andric   return m_opaque_up->operator bool();
84*0b57cec5SDimitry Andric }
85*0b57cec5SDimitry Andric 
Exists() const86*0b57cec5SDimitry Andric bool SBFileSpec::Exists() const {
87*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
88*0b57cec5SDimitry Andric 
89*0b57cec5SDimitry Andric   return FileSystem::Instance().Exists(*m_opaque_up);
90*0b57cec5SDimitry Andric }
91*0b57cec5SDimitry Andric 
ResolveExecutableLocation()92*0b57cec5SDimitry Andric bool SBFileSpec::ResolveExecutableLocation() {
93*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
94*0b57cec5SDimitry Andric 
95*0b57cec5SDimitry Andric   return FileSystem::Instance().ResolveExecutableLocation(*m_opaque_up);
96*0b57cec5SDimitry Andric }
97*0b57cec5SDimitry Andric 
ResolvePath(const char * src_path,char * dst_path,size_t dst_len)98*0b57cec5SDimitry Andric int SBFileSpec::ResolvePath(const char *src_path, char *dst_path,
99*0b57cec5SDimitry Andric                             size_t dst_len) {
100*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(src_path, dst_path, dst_len);
101*0b57cec5SDimitry Andric 
102*0b57cec5SDimitry Andric   llvm::SmallString<64> result(src_path);
103*0b57cec5SDimitry Andric   FileSystem::Instance().Resolve(result);
104*0b57cec5SDimitry Andric   ::snprintf(dst_path, dst_len, "%s", result.c_str());
105*0b57cec5SDimitry Andric   return std::min(dst_len - 1, result.size());
106*0b57cec5SDimitry Andric }
107*0b57cec5SDimitry Andric 
GetFilename() const108*0b57cec5SDimitry Andric const char *SBFileSpec::GetFilename() const {
109*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
110*0b57cec5SDimitry Andric 
111*0b57cec5SDimitry Andric   return m_opaque_up->GetFilename().AsCString();
112*0b57cec5SDimitry Andric }
113*0b57cec5SDimitry Andric 
GetDirectory() const114*0b57cec5SDimitry Andric const char *SBFileSpec::GetDirectory() const {
115*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
116*0b57cec5SDimitry Andric 
117*0b57cec5SDimitry Andric   FileSpec directory{*m_opaque_up};
118*0b57cec5SDimitry Andric   directory.ClearFilename();
119*0b57cec5SDimitry Andric   return directory.GetPathAsConstString().GetCString();
120*0b57cec5SDimitry Andric }
121*0b57cec5SDimitry Andric 
SetFilename(const char * filename)122*0b57cec5SDimitry Andric void SBFileSpec::SetFilename(const char *filename) {
123*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, filename);
124*0b57cec5SDimitry Andric 
125*0b57cec5SDimitry Andric   if (filename && filename[0])
126*0b57cec5SDimitry Andric     m_opaque_up->SetFilename(filename);
127*0b57cec5SDimitry Andric   else
128*0b57cec5SDimitry Andric     m_opaque_up->ClearFilename();
129*0b57cec5SDimitry Andric }
130*0b57cec5SDimitry Andric 
SetDirectory(const char * directory)131*0b57cec5SDimitry Andric void SBFileSpec::SetDirectory(const char *directory) {
132*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, directory);
133*0b57cec5SDimitry Andric 
134*0b57cec5SDimitry Andric   if (directory && directory[0])
135*0b57cec5SDimitry Andric     m_opaque_up->SetDirectory(directory);
136*0b57cec5SDimitry Andric   else
137*0b57cec5SDimitry Andric     m_opaque_up->ClearDirectory();
138*0b57cec5SDimitry Andric }
139*0b57cec5SDimitry Andric 
GetPath(char * dst_path,size_t dst_len) const140*0b57cec5SDimitry Andric uint32_t SBFileSpec::GetPath(char *dst_path, size_t dst_len) const {
141*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, dst_path, dst_len);
142*0b57cec5SDimitry Andric 
143*0b57cec5SDimitry Andric   uint32_t result = m_opaque_up->GetPath(dst_path, dst_len);
144*0b57cec5SDimitry Andric 
145*0b57cec5SDimitry Andric   if (result == 0 && dst_path && dst_len > 0)
146*0b57cec5SDimitry Andric     *dst_path = '\0';
147*0b57cec5SDimitry Andric   return result;
148*0b57cec5SDimitry Andric }
149*0b57cec5SDimitry Andric 
operator ->() const150*0b57cec5SDimitry Andric const lldb_private::FileSpec *SBFileSpec::operator->() const {
151*0b57cec5SDimitry Andric   return m_opaque_up.get();
152*0b57cec5SDimitry Andric }
153*0b57cec5SDimitry Andric 
get() const154*0b57cec5SDimitry Andric const lldb_private::FileSpec *SBFileSpec::get() const {
155*0b57cec5SDimitry Andric   return m_opaque_up.get();
156*0b57cec5SDimitry Andric }
157*0b57cec5SDimitry Andric 
operator *() const158*0b57cec5SDimitry Andric const lldb_private::FileSpec &SBFileSpec::operator*() const {
159*0b57cec5SDimitry Andric   return *m_opaque_up;
160*0b57cec5SDimitry Andric }
161*0b57cec5SDimitry Andric 
ref() const162*0b57cec5SDimitry Andric const lldb_private::FileSpec &SBFileSpec::ref() const { return *m_opaque_up; }
163*0b57cec5SDimitry Andric 
SetFileSpec(const lldb_private::FileSpec & fs)164*0b57cec5SDimitry Andric void SBFileSpec::SetFileSpec(const lldb_private::FileSpec &fs) {
165*0b57cec5SDimitry Andric   *m_opaque_up = fs;
166*0b57cec5SDimitry Andric }
167*0b57cec5SDimitry Andric 
GetDescription(SBStream & description) const168*0b57cec5SDimitry Andric bool SBFileSpec::GetDescription(SBStream &description) const {
169*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, description);
170*0b57cec5SDimitry Andric 
171*0b57cec5SDimitry Andric   Stream &strm = description.ref();
172*0b57cec5SDimitry Andric   char path[PATH_MAX];
173*0b57cec5SDimitry Andric   if (m_opaque_up->GetPath(path, sizeof(path)))
174*0b57cec5SDimitry Andric     strm.PutCString(path);
175*0b57cec5SDimitry Andric   return true;
176*0b57cec5SDimitry Andric }
177*0b57cec5SDimitry Andric 
AppendPathComponent(const char * fn)178*0b57cec5SDimitry Andric void SBFileSpec::AppendPathComponent(const char *fn) {
179*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, fn);
180*0b57cec5SDimitry Andric 
181*0b57cec5SDimitry Andric   m_opaque_up->AppendPathComponent(fn);
182*0b57cec5SDimitry Andric }
183*0b57cec5SDimitry Andric