SBFileSpec.cpp revision 7826c8894803dc729f29789ebc038956a94d3e7a
130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng//===-- SBFileSpec.cpp ------------------------------------------*- C++ -*-===//
230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng//
330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng//                     The LLVM Compiler Infrastructure
430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng//
530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng// This file is distributed under the University of Illinois Open Source
630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng// License. See LICENSE.TXT for details.
730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng//
830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng//===----------------------------------------------------------------------===//
930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
1030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include "lldb/API/SBFileSpec.h"
1130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include "lldb/API/SBStream.h"
1230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include "lldb/Core/FileSpec.h"
1330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include "lldb/Core/Log.h"
1430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
1530692c65c4174412c90e79489e98ab85c1a7412fBen Chengusing namespace lldb;
1630692c65c4174412c90e79489e98ab85c1a7412fBen Chengusing namespace lldb_private;
1730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
1830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
1930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2030692c65c4174412c90e79489e98ab85c1a7412fBen ChengSBFileSpec::SBFileSpec () :
2130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng    m_opaque_ap()
2230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng{
2330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
2430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng    if (log)
2630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng        log->Printf ("SBFileSpec::SBFileSpec () ==> this = %p", this);
2730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng}
2830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2930692c65c4174412c90e79489e98ab85c1a7412fBen ChengSBFileSpec::SBFileSpec (const SBFileSpec &rhs) :
30e87eaf040ab639e94ed0a58ff0eac68d1d38fb0aEd Heyl    m_opaque_ap()
31e87eaf040ab639e94ed0a58ff0eac68d1d38fb0aEd Heyl{
3230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
3330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
3430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng    if (log)
35    {
36        SBStream sstr;
37        rhs.GetDescription (sstr);
38        log->Printf ("SBFileSpec::SBFileSpec (const SBFileSpec &rhs) rhs.m_opaque_ap.get() = %p (%s) ==> this = %p",
39                     rhs.m_opaque_ap.get(), sstr.GetData(), this);
40    }
41
42    if (rhs.m_opaque_ap.get())
43        m_opaque_ap.reset (new FileSpec (rhs.get()));
44}
45
46// Deprected!!!
47SBFileSpec::SBFileSpec (const char *path) :
48    m_opaque_ap(new FileSpec (path, true))
49{
50}
51
52SBFileSpec::SBFileSpec (const char *path, bool resolve) :
53    m_opaque_ap(new FileSpec (path, resolve))
54{
55    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
56
57    if (log)
58        log->Printf ("SBFileSpec::SBFileSpec (const char *path, bool resolve) path = '%s', resolve = %s ==> "
59                     "this = %p (m_opaque_ap.get() = %p)", path, (resolve ? "true" : "false"), this,
60                     m_opaque_ap.get());
61}
62
63SBFileSpec::~SBFileSpec ()
64{
65}
66
67const SBFileSpec &
68SBFileSpec::operator = (const SBFileSpec &rhs)
69{
70    if (this != &rhs)
71    {
72        if (rhs.IsValid())
73            m_opaque_ap.reset (new lldb_private::FileSpec(*rhs.m_opaque_ap.get()));
74    }
75    return *this;
76}
77
78bool
79SBFileSpec::IsValid() const
80{
81    return m_opaque_ap.get() != NULL;
82}
83
84bool
85SBFileSpec::Exists () const
86{
87    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
88
89    if (log)
90        log->Printf ("SBFileSpec::Exists ()");
91
92    bool result = false;
93    if (m_opaque_ap.get())
94        result = m_opaque_ap->Exists();
95
96    if (log)
97        log->Printf ("SBFileSpec::Exists ==> %s", (result ? "true" : "false"));
98
99    return result;
100}
101
102bool
103SBFileSpec::ResolveExecutableLocation ()
104{
105    if (m_opaque_ap.get())
106        return m_opaque_ap->ResolveExecutableLocation ();
107    return false;
108}
109
110int
111SBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)
112{
113    return lldb_private::FileSpec::Resolve (src_path, dst_path, dst_len);
114}
115
116const char *
117SBFileSpec::GetFilename() const
118{
119    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
120
121    if (log)
122        log->Printf ("SBFileSpec::GetFilename ()");
123
124    if (m_opaque_ap.get())
125    {
126        if (log)
127            log->Printf ("SBFileSpec::GetFilename ==> %s", m_opaque_ap->GetFilename().AsCString());
128        return m_opaque_ap->GetFilename().AsCString();
129    }
130
131    if (log)
132        log->Printf ("SBFileSpec::GetFilename ==> NULL");
133
134    return NULL;
135}
136
137const char *
138SBFileSpec::GetDirectory() const
139{
140    if (m_opaque_ap.get())
141        return m_opaque_ap->GetDirectory().AsCString();
142    return NULL;
143}
144
145uint32_t
146SBFileSpec::GetPath (char *dst_path, size_t dst_len) const
147{
148    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
149
150    if (log)
151        log->Printf ("SBFileSpec::GetPath (dst_path, dst_len)");
152
153    uint32_t result;
154    if (m_opaque_ap.get())
155    {
156        result = m_opaque_ap->GetPath (dst_path, dst_len);
157        if (log)
158            log->Printf ("SBFileSpec::GetPath ==> %s (%d)", dst_path, result);
159        return result;
160    }
161
162    if (log)
163        log->Printf ("SBFileSpec::GetPath ==> NULL (0)");
164
165    if (dst_path && dst_len)
166        *dst_path = '\0';
167    return 0;
168}
169
170
171const lldb_private::FileSpec *
172SBFileSpec::operator->() const
173{
174    return m_opaque_ap.get();
175}
176
177const lldb_private::FileSpec *
178SBFileSpec::get() const
179{
180    return m_opaque_ap.get();
181}
182
183
184const lldb_private::FileSpec &
185SBFileSpec::operator*() const
186{
187    return *m_opaque_ap.get();
188}
189
190const lldb_private::FileSpec &
191SBFileSpec::ref() const
192{
193    return *m_opaque_ap.get();
194}
195
196
197void
198SBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
199{
200    if (m_opaque_ap.get())
201        *m_opaque_ap = fs;
202    else
203        m_opaque_ap.reset (new FileSpec (fs));
204}
205
206bool
207SBFileSpec::GetDescription (SBStream &description)
208{
209    if (m_opaque_ap.get())
210    {
211        const char *filename = GetFilename();
212        const char *dir_name = GetDirectory();
213        if (!filename && !dir_name)
214            description.Printf ("No value");
215        else if (!dir_name)
216            description.Printf ("%s", filename);
217        else
218            description.Printf ("%s/%s", dir_name, filename);
219    }
220    else
221        description.Printf ("No value");
222
223    return true;
224}
225
226bool
227SBFileSpec::GetDescription (SBStream &description) const
228{
229    if (m_opaque_ap.get())
230    {
231        const char *filename = GetFilename();
232        const char *dir_name = GetDirectory();
233        if (!filename && !dir_name)
234            description.Printf ("No value");
235        else if (!dir_name)
236            description.Printf ("%s", filename);
237        else
238            description.Printf ("%s/%s", dir_name, filename);
239    }
240    else
241        description.Printf ("No value");
242
243    return true;
244}
245