SBFileSpec.cpp revision e005f2ce03c489ebde9110678a29cbfe8488d5b4
1//===-- 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
10#include "lldb/API/SBFileSpec.h"
11#include "lldb/API/SBStream.h"
12#include "lldb/Core/FileSpec.h"
13#include "lldb/Core/Log.h"
14
15using namespace lldb;
16using namespace lldb_private;
17
18
19
20SBFileSpec::SBFileSpec () :
21    m_opaque_ap()
22{
23}
24
25SBFileSpec::SBFileSpec (const SBFileSpec &rhs) :
26    m_opaque_ap()
27{
28    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
29
30    if (rhs.m_opaque_ap.get())
31        m_opaque_ap.reset (new FileSpec (rhs.get()));
32
33    if (log)
34    {
35        SBStream sstr;
36        GetDescription (sstr);
37        log->Printf ("SBFileSpec::SBFileSpec (const SBFileSpec rhs.ap=%p) => SBFileSpec(%p): %s",
38                     rhs.m_opaque_ap.get(), m_opaque_ap.get(), sstr.GetData());
39    }
40}
41
42// Deprected!!!
43SBFileSpec::SBFileSpec (const char *path) :
44    m_opaque_ap(new FileSpec (path, true))
45{
46}
47
48SBFileSpec::SBFileSpec (const char *path, bool resolve) :
49    m_opaque_ap(new FileSpec (path, resolve))
50{
51    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
52
53    if (log)
54        log->Printf ("SBFileSpec::SBFileSpec (path=\"%s\", resolve=%i) => SBFileSpec(%p)", path,
55                     resolve, m_opaque_ap.get());
56}
57
58SBFileSpec::~SBFileSpec ()
59{
60}
61
62const SBFileSpec &
63SBFileSpec::operator = (const SBFileSpec &rhs)
64{
65    if (this != &rhs)
66    {
67        if (rhs.IsValid())
68            m_opaque_ap.reset (new lldb_private::FileSpec(*rhs.m_opaque_ap.get()));
69    }
70    return *this;
71}
72
73bool
74SBFileSpec::IsValid() const
75{
76    return m_opaque_ap.get() != NULL;
77}
78
79bool
80SBFileSpec::Exists () const
81{
82    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
83
84    bool result = false;
85    if (m_opaque_ap.get())
86        result = m_opaque_ap->Exists();
87
88    if (log)
89        log->Printf ("SBFileSpec(%p)::Exists () => %s", m_opaque_ap.get(), (result ? "true" : "false"));
90
91    return result;
92}
93
94bool
95SBFileSpec::ResolveExecutableLocation ()
96{
97    if (m_opaque_ap.get())
98        return m_opaque_ap->ResolveExecutableLocation ();
99    return false;
100}
101
102int
103SBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)
104{
105    return lldb_private::FileSpec::Resolve (src_path, dst_path, dst_len);
106}
107
108const char *
109SBFileSpec::GetFilename() const
110{
111    const char *s = NULL;
112    if (m_opaque_ap.get())
113        s = m_opaque_ap->GetFilename().AsCString();
114
115    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
116    if (log)
117    {
118        if (s)
119            log->Printf ("SBFileSpec(%p)::GetFilename () => \"%s\"", m_opaque_ap.get(), s);
120        else
121            log->Printf ("SBFileSpec(%p)::GetFilename () => NULL", m_opaque_ap.get());
122    }
123
124    return s;
125}
126
127const char *
128SBFileSpec::GetDirectory() const
129{
130    const char *s = NULL;
131    if (m_opaque_ap.get())
132        s = m_opaque_ap->GetDirectory().AsCString();
133    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
134    if (log)
135    {
136        if (s)
137            log->Printf ("SBFileSpec(%p)::GetDirectory () => \"%s\"", m_opaque_ap.get(), s);
138        else
139            log->Printf ("SBFileSpec(%p)::GetDirectory () => NULL", m_opaque_ap.get());
140    }
141    return s;
142}
143
144uint32_t
145SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
146{
147    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
148
149    uint32_t result = 0;
150    if (m_opaque_ap.get())
151        result = m_opaque_ap->GetPath (dst_path, dst_len);
152
153    if (log)
154        log->Printf ("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%zu) => %u",
155                     m_opaque_ap.get(), result, dst_path, dst_len, result);
156
157    if (result == 0 && dst_path && dst_len > 0)
158        *dst_path = '\0';
159    return result;
160}
161
162
163const lldb_private::FileSpec *
164SBFileSpec::operator->() const
165{
166    return m_opaque_ap.get();
167}
168
169const lldb_private::FileSpec *
170SBFileSpec::get() const
171{
172    return m_opaque_ap.get();
173}
174
175
176const lldb_private::FileSpec &
177SBFileSpec::operator*() const
178{
179    return *m_opaque_ap.get();
180}
181
182const lldb_private::FileSpec &
183SBFileSpec::ref() const
184{
185    return *m_opaque_ap.get();
186}
187
188
189void
190SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
191{
192    if (m_opaque_ap.get())
193        *m_opaque_ap = fs;
194    else
195        m_opaque_ap.reset (new FileSpec (fs));
196}
197
198bool
199SBFileSpec::GetDescription (SBStream &description) const
200{
201    if (m_opaque_ap.get())
202    {
203        char path[PATH_MAX];
204        if (m_opaque_ap->GetPath(path, sizeof(path)))
205            description.Printf ("%s", path);
206    }
207    else
208        description.Printf ("No value");
209
210    return true;
211}
212