blob: dd7435de1b5bddca82a34bf4092946abf10a338d [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBFileSpec.cpp ------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Sean Callananaf90cf52014-04-19 03:09:28 +000010#include <inttypes.h> // PRIu64
Stephen Wilson8acdbb82011-04-08 13:36:44 +000011#include <limits.h>
12
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013#include "lldb/API/SBFileSpec.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000014#include "lldb/API/SBStream.h"
Greg Clayton53239f02011-02-08 05:05:52 +000015#include "lldb/Host/FileSpec.h"
Caroline Ticeceb6b132010-10-26 03:11:13 +000016#include "lldb/Core/Log.h"
Greg Claytonda7bc7d2011-11-13 06:57:31 +000017#include "lldb/Core/Stream.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000018
Zachary Turner3f559742014-08-07 17:33:36 +000019#include "llvm/ADT/SmallString.h"
20
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021using namespace lldb;
22using namespace lldb_private;
23
24
25
26SBFileSpec::SBFileSpec () :
Greg Clayton226cce22013-07-08 22:22:41 +000027 m_opaque_ap(new lldb_private::FileSpec())
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028{
29}
30
31SBFileSpec::SBFileSpec (const SBFileSpec &rhs) :
Greg Clayton226cce22013-07-08 22:22:41 +000032 m_opaque_ap(new lldb_private::FileSpec(*rhs.m_opaque_ap))
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033{
Greg Clayton226cce22013-07-08 22:22:41 +000034}
Caroline Tice750cd172010-10-26 23:49:36 +000035
Greg Clayton226cce22013-07-08 22:22:41 +000036SBFileSpec::SBFileSpec (const lldb_private::FileSpec& fspec) :
37 m_opaque_ap(new lldb_private::FileSpec(fspec))
38{
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039}
40
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +000041// Deprecated!!!
Chris Lattner30fdc8d2010-06-08 16:52:24 +000042SBFileSpec::SBFileSpec (const char *path) :
Greg Clayton274060b2010-10-20 20:54:39 +000043 m_opaque_ap(new FileSpec (path, true))
44{
45}
46
47SBFileSpec::SBFileSpec (const char *path, bool resolve) :
48 m_opaque_ap(new FileSpec (path, resolve))
Chris Lattner30fdc8d2010-06-08 16:52:24 +000049{
50}
51
52SBFileSpec::~SBFileSpec ()
53{
54}
55
56const SBFileSpec &
57SBFileSpec::operator = (const SBFileSpec &rhs)
58{
59 if (this != &rhs)
Greg Clayton226cce22013-07-08 22:22:41 +000060 *m_opaque_ap = *rhs.m_opaque_ap;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000061 return *this;
62}
63
64bool
65SBFileSpec::IsValid() const
66{
Sean Callanan9076c0f2013-10-04 21:35:29 +000067 return m_opaque_ap->operator bool();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000068}
69
70bool
71SBFileSpec::Exists () const
72{
Greg Clayton5160ce52013-03-27 23:08:40 +000073 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000074
Greg Clayton226cce22013-07-08 22:22:41 +000075 bool result = m_opaque_ap->Exists();
Caroline Ticeceb6b132010-10-26 03:11:13 +000076
77 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000078 log->Printf ("SBFileSpec(%p)::Exists () => %s",
79 static_cast<void*>(m_opaque_ap.get()),
80 (result ? "true" : "false"));
Caroline Ticeceb6b132010-10-26 03:11:13 +000081
82 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000083}
84
Caroline Tice428a9a52010-09-10 04:48:55 +000085bool
86SBFileSpec::ResolveExecutableLocation ()
87{
Greg Clayton226cce22013-07-08 22:22:41 +000088 return m_opaque_ap->ResolveExecutableLocation ();
Caroline Tice428a9a52010-09-10 04:48:55 +000089}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000090
91int
92SBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)
93{
Zachary Turner3f559742014-08-07 17:33:36 +000094 llvm::SmallString<64> result(src_path);
95 lldb_private::FileSpec::Resolve (result);
Ilia K686b1fe2015-02-27 19:43:08 +000096 ::snprintf(dst_path, dst_len, "%s", result.c_str());
97 return std::min(dst_len-1, result.size());
Chris Lattner30fdc8d2010-06-08 16:52:24 +000098}
99
100const char *
Johnny Chen23fd10c2010-08-27 22:35:26 +0000101SBFileSpec::GetFilename() const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000102{
Greg Clayton226cce22013-07-08 22:22:41 +0000103 const char *s = m_opaque_ap->GetFilename().AsCString();
Caroline Tice750cd172010-10-26 23:49:36 +0000104
Greg Clayton5160ce52013-03-27 23:08:40 +0000105 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000106 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000107 {
108 if (s)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000109 log->Printf ("SBFileSpec(%p)::GetFilename () => \"%s\"",
110 static_cast<void*>(m_opaque_ap.get()), s);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000111 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000112 log->Printf ("SBFileSpec(%p)::GetFilename () => NULL",
113 static_cast<void*>(m_opaque_ap.get()));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000114 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000115
Greg Clayton48381312010-10-30 04:51:46 +0000116 return s;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000117}
118
119const char *
120SBFileSpec::GetDirectory() const
121{
Chaoren Lin7d2f62d2015-06-08 22:12:58 +0000122 FileSpec directory{*m_opaque_ap};
123 directory.GetFilename().Clear();
Greg Clayton5160ce52013-03-27 23:08:40 +0000124 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000125 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000126 {
Chaoren Lin7d2f62d2015-06-08 22:12:58 +0000127 if (directory)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000128 log->Printf ("SBFileSpec(%p)::GetDirectory () => \"%s\"",
Chaoren Lin7d2f62d2015-06-08 22:12:58 +0000129 static_cast<void*>(m_opaque_ap.get()), directory.GetCString());
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000130 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000131 log->Printf ("SBFileSpec(%p)::GetDirectory () => NULL",
132 static_cast<void*>(m_opaque_ap.get()));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000133 }
Chaoren Lin7d2f62d2015-06-08 22:12:58 +0000134 return directory.GetCString();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000135}
136
Greg Claytonfbb76342013-11-20 21:07:01 +0000137void
138SBFileSpec::SetFilename(const char *filename)
139{
140 if (filename && filename[0])
141 m_opaque_ap->GetFilename().SetCString(filename);
142 else
143 m_opaque_ap->GetFilename().Clear();
144}
145
146void
147SBFileSpec::SetDirectory(const char *directory)
148{
149 if (directory && directory[0])
150 m_opaque_ap->GetDirectory().SetCString(directory);
151 else
152 m_opaque_ap->GetDirectory().Clear();
153}
154
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000155uint32_t
156SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
157{
Greg Clayton5160ce52013-03-27 23:08:40 +0000158 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000159
Greg Clayton226cce22013-07-08 22:22:41 +0000160 uint32_t result = m_opaque_ap->GetPath (dst_path, dst_len);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000161
162 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000163 log->Printf ("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%" PRIu64 ") => %u",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000164 static_cast<void*>(m_opaque_ap.get()), result, dst_path,
165 static_cast<uint64_t>(dst_len), result);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000166
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000167 if (result == 0 && dst_path && dst_len > 0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000168 *dst_path = '\0';
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000169 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000170}
171
172
173const lldb_private::FileSpec *
174SBFileSpec::operator->() const
175{
Greg Clayton66111032010-06-23 01:19:29 +0000176 return m_opaque_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000177}
178
179const lldb_private::FileSpec *
180SBFileSpec::get() const
181{
Greg Clayton66111032010-06-23 01:19:29 +0000182 return m_opaque_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000183}
184
185
186const lldb_private::FileSpec &
187SBFileSpec::operator*() const
188{
Greg Clayton66111032010-06-23 01:19:29 +0000189 return *m_opaque_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000190}
191
192const lldb_private::FileSpec &
193SBFileSpec::ref() const
194{
Greg Clayton66111032010-06-23 01:19:29 +0000195 return *m_opaque_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000196}
197
198
199void
200SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
201{
Greg Clayton226cce22013-07-08 22:22:41 +0000202 *m_opaque_ap = fs;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000203}
204
Caroline Ticedde9cff2010-09-20 05:20:02 +0000205bool
Caroline Ticeceb6b132010-10-26 03:11:13 +0000206SBFileSpec::GetDescription (SBStream &description) const
207{
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000208 Stream &strm = description.ref();
Greg Clayton226cce22013-07-08 22:22:41 +0000209 char path[PATH_MAX];
210 if (m_opaque_ap->GetPath(path, sizeof(path)))
211 strm.PutCString (path);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000212 return true;
213}