1*9128ee2fSEnrico Granata //===-- SBData.cpp ----------------------------------------------*- C++ -*-===//
2*9128ee2fSEnrico Granata //
3*9128ee2fSEnrico Granata //                     The LLVM Compiler Infrastructure
4*9128ee2fSEnrico Granata //
5*9128ee2fSEnrico Granata // This file is distributed under the University of Illinois Open Source
6*9128ee2fSEnrico Granata // License. See LICENSE.TXT for details.
7*9128ee2fSEnrico Granata //
8*9128ee2fSEnrico Granata //===----------------------------------------------------------------------===//
9*9128ee2fSEnrico Granata 
10*9128ee2fSEnrico Granata #include "lldb/API/SBData.h"
11*9128ee2fSEnrico Granata #include "lldb/API/SBError.h"
12*9128ee2fSEnrico Granata #include "lldb/API/SBStream.h"
13*9128ee2fSEnrico Granata 
14*9128ee2fSEnrico Granata #include "lldb/Core/DataExtractor.h"
15*9128ee2fSEnrico Granata #include "lldb/Core/Log.h"
16*9128ee2fSEnrico Granata 
17*9128ee2fSEnrico Granata using namespace lldb;
18*9128ee2fSEnrico Granata using namespace lldb_private;
19*9128ee2fSEnrico Granata 
20*9128ee2fSEnrico Granata SBData::SBData ()
21*9128ee2fSEnrico Granata {
22*9128ee2fSEnrico Granata }
23*9128ee2fSEnrico Granata 
24*9128ee2fSEnrico Granata SBData::SBData (const lldb::DataExtractorSP& data_sp) :
25*9128ee2fSEnrico Granata     m_opaque_sp (data_sp)
26*9128ee2fSEnrico Granata {
27*9128ee2fSEnrico Granata }
28*9128ee2fSEnrico Granata 
29*9128ee2fSEnrico Granata SBData::SBData(const SBData &rhs) :
30*9128ee2fSEnrico Granata     m_opaque_sp (rhs.m_opaque_sp)
31*9128ee2fSEnrico Granata {
32*9128ee2fSEnrico Granata }
33*9128ee2fSEnrico Granata 
34*9128ee2fSEnrico Granata const SBData &
35*9128ee2fSEnrico Granata SBData::operator = (const SBData &rhs)
36*9128ee2fSEnrico Granata {
37*9128ee2fSEnrico Granata     if (this != &rhs)
38*9128ee2fSEnrico Granata         m_opaque_sp = rhs.m_opaque_sp;
39*9128ee2fSEnrico Granata     return *this;
40*9128ee2fSEnrico Granata }
41*9128ee2fSEnrico Granata 
42*9128ee2fSEnrico Granata SBData::~SBData ()
43*9128ee2fSEnrico Granata {
44*9128ee2fSEnrico Granata }
45*9128ee2fSEnrico Granata 
46*9128ee2fSEnrico Granata void
47*9128ee2fSEnrico Granata SBData::SetOpaque (const lldb::DataExtractorSP &data_sp)
48*9128ee2fSEnrico Granata {
49*9128ee2fSEnrico Granata     m_opaque_sp = data_sp;
50*9128ee2fSEnrico Granata }
51*9128ee2fSEnrico Granata 
52*9128ee2fSEnrico Granata lldb_private::DataExtractor *
53*9128ee2fSEnrico Granata SBData::get() const
54*9128ee2fSEnrico Granata {
55*9128ee2fSEnrico Granata     return m_opaque_sp.get();
56*9128ee2fSEnrico Granata }
57*9128ee2fSEnrico Granata 
58*9128ee2fSEnrico Granata lldb_private::DataExtractor *
59*9128ee2fSEnrico Granata SBData::operator->() const
60*9128ee2fSEnrico Granata {
61*9128ee2fSEnrico Granata     return m_opaque_sp.operator->();
62*9128ee2fSEnrico Granata }
63*9128ee2fSEnrico Granata 
64*9128ee2fSEnrico Granata lldb::DataExtractorSP &
65*9128ee2fSEnrico Granata SBData::operator*()
66*9128ee2fSEnrico Granata {
67*9128ee2fSEnrico Granata     return m_opaque_sp;
68*9128ee2fSEnrico Granata }
69*9128ee2fSEnrico Granata 
70*9128ee2fSEnrico Granata const lldb::DataExtractorSP &
71*9128ee2fSEnrico Granata SBData::operator*() const
72*9128ee2fSEnrico Granata {
73*9128ee2fSEnrico Granata     return m_opaque_sp;
74*9128ee2fSEnrico Granata }
75*9128ee2fSEnrico Granata 
76*9128ee2fSEnrico Granata bool
77*9128ee2fSEnrico Granata SBData::IsValid()
78*9128ee2fSEnrico Granata {
79*9128ee2fSEnrico Granata     return m_opaque_sp.get() != NULL;
80*9128ee2fSEnrico Granata }
81*9128ee2fSEnrico Granata 
82*9128ee2fSEnrico Granata uint8_t
83*9128ee2fSEnrico Granata SBData::GetAddressByteSize ()
84*9128ee2fSEnrico Granata {
85*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
86*9128ee2fSEnrico Granata     uint8_t value = 0;
87*9128ee2fSEnrico Granata     if (m_opaque_sp.get())
88*9128ee2fSEnrico Granata         value = m_opaque_sp->GetAddressByteSize();
89*9128ee2fSEnrico Granata     if (log)
90*9128ee2fSEnrico Granata         log->Printf ("SBData::GetAddressByteSize () => "
91*9128ee2fSEnrico Granata                      "(%i)", value);
92*9128ee2fSEnrico Granata     return value;
93*9128ee2fSEnrico Granata }
94*9128ee2fSEnrico Granata 
95*9128ee2fSEnrico Granata void
96*9128ee2fSEnrico Granata SBData::Clear ()
97*9128ee2fSEnrico Granata {
98*9128ee2fSEnrico Granata     if (m_opaque_sp.get())
99*9128ee2fSEnrico Granata         m_opaque_sp->Clear();
100*9128ee2fSEnrico Granata }
101*9128ee2fSEnrico Granata 
102*9128ee2fSEnrico Granata size_t
103*9128ee2fSEnrico Granata SBData::GetByteSize ()
104*9128ee2fSEnrico Granata {
105*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
106*9128ee2fSEnrico Granata     size_t value = 0;
107*9128ee2fSEnrico Granata     if (m_opaque_sp.get())
108*9128ee2fSEnrico Granata         value = m_opaque_sp->GetByteSize();
109*9128ee2fSEnrico Granata     if (log)
110*9128ee2fSEnrico Granata         log->Printf ("SBData::GetByteSize () => "
111*9128ee2fSEnrico Granata                      "(%i)", value);
112*9128ee2fSEnrico Granata     return value;
113*9128ee2fSEnrico Granata }
114*9128ee2fSEnrico Granata 
115*9128ee2fSEnrico Granata lldb::ByteOrder
116*9128ee2fSEnrico Granata SBData::GetByteOrder ()
117*9128ee2fSEnrico Granata {
118*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
119*9128ee2fSEnrico Granata     lldb::ByteOrder value = eByteOrderInvalid;
120*9128ee2fSEnrico Granata     if (m_opaque_sp.get())
121*9128ee2fSEnrico Granata         value = m_opaque_sp->GetByteOrder();
122*9128ee2fSEnrico Granata     if (log)
123*9128ee2fSEnrico Granata         log->Printf ("SBData::GetByteOrder () => "
124*9128ee2fSEnrico Granata                      "(%i)", value);
125*9128ee2fSEnrico Granata     return value;
126*9128ee2fSEnrico Granata }
127*9128ee2fSEnrico Granata 
128*9128ee2fSEnrico Granata float
129*9128ee2fSEnrico Granata SBData::GetFloat (lldb::SBError& error, uint32_t offset)
130*9128ee2fSEnrico Granata {
131*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
132*9128ee2fSEnrico Granata     float value = 0;
133*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
134*9128ee2fSEnrico Granata     {
135*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
136*9128ee2fSEnrico Granata     }
137*9128ee2fSEnrico Granata     else
138*9128ee2fSEnrico Granata     {
139*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
140*9128ee2fSEnrico Granata         value = m_opaque_sp->GetFloat(&offset);
141*9128ee2fSEnrico Granata         if (offset == old_offset)
142*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
143*9128ee2fSEnrico Granata     }
144*9128ee2fSEnrico Granata     if (log)
145*9128ee2fSEnrico Granata         log->Printf ("SBData::GetFloat (error=%p,offset=%d) => "
146*9128ee2fSEnrico Granata                      "(%f)", error.get(), offset, value);
147*9128ee2fSEnrico Granata     return value;
148*9128ee2fSEnrico Granata }
149*9128ee2fSEnrico Granata 
150*9128ee2fSEnrico Granata double
151*9128ee2fSEnrico Granata SBData::GetDouble (lldb::SBError& error, uint32_t offset)
152*9128ee2fSEnrico Granata {
153*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
154*9128ee2fSEnrico Granata     double value = 0;
155*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
156*9128ee2fSEnrico Granata     {
157*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
158*9128ee2fSEnrico Granata     }
159*9128ee2fSEnrico Granata     else
160*9128ee2fSEnrico Granata     {
161*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
162*9128ee2fSEnrico Granata         value = m_opaque_sp->GetDouble(&offset);
163*9128ee2fSEnrico Granata         if (offset == old_offset)
164*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
165*9128ee2fSEnrico Granata     }
166*9128ee2fSEnrico Granata     if (log)
167*9128ee2fSEnrico Granata         log->Printf ("SBData::GetDouble (error=%p,offset=%d) => "
168*9128ee2fSEnrico Granata                      "(%f)", error.get(), offset, value);
169*9128ee2fSEnrico Granata     return value;
170*9128ee2fSEnrico Granata }
171*9128ee2fSEnrico Granata 
172*9128ee2fSEnrico Granata long double
173*9128ee2fSEnrico Granata SBData::GetLongDouble (lldb::SBError& error, uint32_t offset)
174*9128ee2fSEnrico Granata {
175*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
176*9128ee2fSEnrico Granata     long double value = 0;
177*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
178*9128ee2fSEnrico Granata     {
179*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
180*9128ee2fSEnrico Granata     }
181*9128ee2fSEnrico Granata     else
182*9128ee2fSEnrico Granata     {
183*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
184*9128ee2fSEnrico Granata         value = m_opaque_sp->GetLongDouble(&offset);
185*9128ee2fSEnrico Granata         if (offset == old_offset)
186*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
187*9128ee2fSEnrico Granata     }
188*9128ee2fSEnrico Granata     if (log)
189*9128ee2fSEnrico Granata         log->Printf ("SBData::GetLongDouble (error=%p,offset=%d) => "
190*9128ee2fSEnrico Granata                      "(%lf)", error.get(), offset, value);
191*9128ee2fSEnrico Granata     return value;
192*9128ee2fSEnrico Granata }
193*9128ee2fSEnrico Granata 
194*9128ee2fSEnrico Granata lldb::addr_t
195*9128ee2fSEnrico Granata SBData::GetAddress (lldb::SBError& error, uint32_t offset)
196*9128ee2fSEnrico Granata {
197*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
198*9128ee2fSEnrico Granata     lldb::addr_t value = 0;
199*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
200*9128ee2fSEnrico Granata     {
201*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
202*9128ee2fSEnrico Granata     }
203*9128ee2fSEnrico Granata     else
204*9128ee2fSEnrico Granata     {
205*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
206*9128ee2fSEnrico Granata         value = m_opaque_sp->GetAddress(&offset);
207*9128ee2fSEnrico Granata         if (offset == old_offset)
208*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
209*9128ee2fSEnrico Granata     }
210*9128ee2fSEnrico Granata     if (log)
211*9128ee2fSEnrico Granata         log->Printf ("SBData::GetAddress (error=%p,offset=%d) => "
212*9128ee2fSEnrico Granata                      "(%p)", error.get(), offset, (void*)value);
213*9128ee2fSEnrico Granata     return value;
214*9128ee2fSEnrico Granata }
215*9128ee2fSEnrico Granata 
216*9128ee2fSEnrico Granata uint8_t
217*9128ee2fSEnrico Granata SBData::GetUnsignedInt8 (lldb::SBError& error, uint32_t offset)
218*9128ee2fSEnrico Granata {
219*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
220*9128ee2fSEnrico Granata     uint8_t value = 0;
221*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
222*9128ee2fSEnrico Granata     {
223*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
224*9128ee2fSEnrico Granata     }
225*9128ee2fSEnrico Granata     else
226*9128ee2fSEnrico Granata     {
227*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
228*9128ee2fSEnrico Granata         value = m_opaque_sp->GetU8(&offset);
229*9128ee2fSEnrico Granata         if (offset == old_offset)
230*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
231*9128ee2fSEnrico Granata     }
232*9128ee2fSEnrico Granata     if (log)
233*9128ee2fSEnrico Granata         log->Printf ("SBData::GetUnsignedInt8 (error=%p,offset=%d) => "
234*9128ee2fSEnrico Granata                      "(%c)", error.get(), offset, value);
235*9128ee2fSEnrico Granata     return value;
236*9128ee2fSEnrico Granata }
237*9128ee2fSEnrico Granata 
238*9128ee2fSEnrico Granata uint16_t
239*9128ee2fSEnrico Granata SBData::GetUnsignedInt16 (lldb::SBError& error, uint32_t offset)
240*9128ee2fSEnrico Granata {
241*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
242*9128ee2fSEnrico Granata     uint16_t value = 0;
243*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
244*9128ee2fSEnrico Granata     {
245*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
246*9128ee2fSEnrico Granata     }
247*9128ee2fSEnrico Granata     else
248*9128ee2fSEnrico Granata     {
249*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
250*9128ee2fSEnrico Granata         value = m_opaque_sp->GetU16(&offset);
251*9128ee2fSEnrico Granata         if (offset == old_offset)
252*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
253*9128ee2fSEnrico Granata     }
254*9128ee2fSEnrico Granata     if (log)
255*9128ee2fSEnrico Granata         log->Printf ("SBData::GetUnsignedInt16 (error=%p,offset=%d) => "
256*9128ee2fSEnrico Granata                      "(%hd)", error.get(), offset, value);
257*9128ee2fSEnrico Granata     return value;
258*9128ee2fSEnrico Granata }
259*9128ee2fSEnrico Granata 
260*9128ee2fSEnrico Granata uint32_t
261*9128ee2fSEnrico Granata SBData::GetUnsignedInt32 (lldb::SBError& error, uint32_t offset)
262*9128ee2fSEnrico Granata {
263*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
264*9128ee2fSEnrico Granata     uint32_t value = 0;
265*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
266*9128ee2fSEnrico Granata     {
267*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
268*9128ee2fSEnrico Granata     }
269*9128ee2fSEnrico Granata     else
270*9128ee2fSEnrico Granata     {
271*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
272*9128ee2fSEnrico Granata         value = m_opaque_sp->GetU32(&offset);
273*9128ee2fSEnrico Granata         if (offset == old_offset)
274*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
275*9128ee2fSEnrico Granata     }
276*9128ee2fSEnrico Granata     if (log)
277*9128ee2fSEnrico Granata         log->Printf ("SBData::GetUnsignedInt32 (error=%p,offset=%d) => "
278*9128ee2fSEnrico Granata                      "(%d)", error.get(), offset, value);
279*9128ee2fSEnrico Granata     return value;
280*9128ee2fSEnrico Granata }
281*9128ee2fSEnrico Granata 
282*9128ee2fSEnrico Granata uint64_t
283*9128ee2fSEnrico Granata SBData::GetUnsignedInt64 (lldb::SBError& error, uint32_t offset)
284*9128ee2fSEnrico Granata {
285*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
286*9128ee2fSEnrico Granata     uint64_t value = 0;
287*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
288*9128ee2fSEnrico Granata     {
289*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
290*9128ee2fSEnrico Granata     }
291*9128ee2fSEnrico Granata     else
292*9128ee2fSEnrico Granata     {
293*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
294*9128ee2fSEnrico Granata         value = m_opaque_sp->GetU64(&offset);
295*9128ee2fSEnrico Granata         if (offset == old_offset)
296*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
297*9128ee2fSEnrico Granata     }
298*9128ee2fSEnrico Granata     if (log)
299*9128ee2fSEnrico Granata         log->Printf ("SBData::GetUnsignedInt64 (error=%p,offset=%d) => "
300*9128ee2fSEnrico Granata                      "(%q)", error.get(), offset, value);
301*9128ee2fSEnrico Granata     return value;
302*9128ee2fSEnrico Granata }
303*9128ee2fSEnrico Granata 
304*9128ee2fSEnrico Granata int8_t
305*9128ee2fSEnrico Granata SBData::GetSignedInt8 (lldb::SBError& error, uint32_t offset)
306*9128ee2fSEnrico Granata {
307*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
308*9128ee2fSEnrico Granata     int8_t value = 0;
309*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
310*9128ee2fSEnrico Granata     {
311*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
312*9128ee2fSEnrico Granata     }
313*9128ee2fSEnrico Granata     else
314*9128ee2fSEnrico Granata     {
315*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
316*9128ee2fSEnrico Granata         value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1);
317*9128ee2fSEnrico Granata         if (offset == old_offset)
318*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
319*9128ee2fSEnrico Granata     }
320*9128ee2fSEnrico Granata     if (log)
321*9128ee2fSEnrico Granata         log->Printf ("SBData::GetSignedInt8 (error=%p,offset=%d) => "
322*9128ee2fSEnrico Granata                      "(%c)", error.get(), offset, value);
323*9128ee2fSEnrico Granata     return value;
324*9128ee2fSEnrico Granata }
325*9128ee2fSEnrico Granata 
326*9128ee2fSEnrico Granata int16_t
327*9128ee2fSEnrico Granata SBData::GetSignedInt16 (lldb::SBError& error, uint32_t offset)
328*9128ee2fSEnrico Granata {
329*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
330*9128ee2fSEnrico Granata     int16_t value = 0;
331*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
332*9128ee2fSEnrico Granata     {
333*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
334*9128ee2fSEnrico Granata     }
335*9128ee2fSEnrico Granata     else
336*9128ee2fSEnrico Granata     {
337*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
338*9128ee2fSEnrico Granata         value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2);
339*9128ee2fSEnrico Granata         if (offset == old_offset)
340*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
341*9128ee2fSEnrico Granata     }
342*9128ee2fSEnrico Granata     if (log)
343*9128ee2fSEnrico Granata         log->Printf ("SBData::GetSignedInt16 (error=%p,offset=%d) => "
344*9128ee2fSEnrico Granata                      "(%hd)", error.get(), offset, value);
345*9128ee2fSEnrico Granata     return value;
346*9128ee2fSEnrico Granata }
347*9128ee2fSEnrico Granata 
348*9128ee2fSEnrico Granata int32_t
349*9128ee2fSEnrico Granata SBData::GetSignedInt32 (lldb::SBError& error, uint32_t offset)
350*9128ee2fSEnrico Granata {
351*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
352*9128ee2fSEnrico Granata     int32_t value = 0;
353*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
354*9128ee2fSEnrico Granata     {
355*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
356*9128ee2fSEnrico Granata     }
357*9128ee2fSEnrico Granata     else
358*9128ee2fSEnrico Granata     {
359*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
360*9128ee2fSEnrico Granata         value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4);
361*9128ee2fSEnrico Granata         if (offset == old_offset)
362*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
363*9128ee2fSEnrico Granata     }
364*9128ee2fSEnrico Granata     if (log)
365*9128ee2fSEnrico Granata         log->Printf ("SBData::GetSignedInt32 (error=%p,offset=%d) => "
366*9128ee2fSEnrico Granata                      "(%d)", error.get(), offset, value);
367*9128ee2fSEnrico Granata     return value;
368*9128ee2fSEnrico Granata }
369*9128ee2fSEnrico Granata 
370*9128ee2fSEnrico Granata int64_t
371*9128ee2fSEnrico Granata SBData::GetSignedInt64 (lldb::SBError& error, uint32_t offset)
372*9128ee2fSEnrico Granata {
373*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
374*9128ee2fSEnrico Granata     int64_t value = 0;
375*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
376*9128ee2fSEnrico Granata     {
377*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
378*9128ee2fSEnrico Granata     }
379*9128ee2fSEnrico Granata     else
380*9128ee2fSEnrico Granata     {
381*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
382*9128ee2fSEnrico Granata         value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8);
383*9128ee2fSEnrico Granata         if (offset == old_offset)
384*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
385*9128ee2fSEnrico Granata     }
386*9128ee2fSEnrico Granata     if (log)
387*9128ee2fSEnrico Granata         log->Printf ("SBData::GetSignedInt64 (error=%p,offset=%d) => "
388*9128ee2fSEnrico Granata                      "(%q)", error.get(), offset, value);
389*9128ee2fSEnrico Granata     return value;
390*9128ee2fSEnrico Granata }
391*9128ee2fSEnrico Granata 
392*9128ee2fSEnrico Granata const char*
393*9128ee2fSEnrico Granata SBData::GetString (lldb::SBError& error, uint32_t offset)
394*9128ee2fSEnrico Granata {
395*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
396*9128ee2fSEnrico Granata     const char* value = 0;
397*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
398*9128ee2fSEnrico Granata     {
399*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
400*9128ee2fSEnrico Granata     }
401*9128ee2fSEnrico Granata     else
402*9128ee2fSEnrico Granata     {
403*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
404*9128ee2fSEnrico Granata         value = m_opaque_sp->GetCStr(&offset);
405*9128ee2fSEnrico Granata         if (offset == old_offset || (value == NULL))
406*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
407*9128ee2fSEnrico Granata     }
408*9128ee2fSEnrico Granata     if (log)
409*9128ee2fSEnrico Granata         log->Printf ("SBData::GetString (error=%p,offset=%d) => "
410*9128ee2fSEnrico Granata                      "(%p)", error.get(), offset, value);
411*9128ee2fSEnrico Granata     return value;
412*9128ee2fSEnrico Granata }
413*9128ee2fSEnrico Granata 
414*9128ee2fSEnrico Granata bool
415*9128ee2fSEnrico Granata SBData::GetDescription (lldb::SBStream &description)
416*9128ee2fSEnrico Granata {
417*9128ee2fSEnrico Granata     if (m_opaque_sp)
418*9128ee2fSEnrico Granata     {
419*9128ee2fSEnrico Granata         description.ref();
420*9128ee2fSEnrico Granata         m_opaque_sp->Dump(description.get(),
421*9128ee2fSEnrico Granata                           0,
422*9128ee2fSEnrico Granata                           lldb::eFormatBytesWithASCII,
423*9128ee2fSEnrico Granata                           1,
424*9128ee2fSEnrico Granata                           m_opaque_sp->GetByteSize(),
425*9128ee2fSEnrico Granata                           16,
426*9128ee2fSEnrico Granata                           LLDB_INVALID_ADDRESS,
427*9128ee2fSEnrico Granata                           0,
428*9128ee2fSEnrico Granata                           0);
429*9128ee2fSEnrico Granata     }
430*9128ee2fSEnrico Granata     else
431*9128ee2fSEnrico Granata         description.Printf ("No Value");
432*9128ee2fSEnrico Granata 
433*9128ee2fSEnrico Granata     return true;
434*9128ee2fSEnrico Granata }
435*9128ee2fSEnrico Granata 
436*9128ee2fSEnrico Granata size_t
437*9128ee2fSEnrico Granata SBData::ReadRawData (lldb::SBError& error,
438*9128ee2fSEnrico Granata                      uint32_t offset,
439*9128ee2fSEnrico Granata                      void *buf,
440*9128ee2fSEnrico Granata                      size_t size)
441*9128ee2fSEnrico Granata {
442*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
443*9128ee2fSEnrico Granata     void* ok = NULL;
444*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
445*9128ee2fSEnrico Granata     {
446*9128ee2fSEnrico Granata         error.SetErrorString("no value to read from");
447*9128ee2fSEnrico Granata     }
448*9128ee2fSEnrico Granata     else
449*9128ee2fSEnrico Granata     {
450*9128ee2fSEnrico Granata         uint32_t old_offset = offset;
451*9128ee2fSEnrico Granata         ok = m_opaque_sp->GetU8(&offset, buf, size);
452*9128ee2fSEnrico Granata         if ((offset == old_offset) || (ok == NULL))
453*9128ee2fSEnrico Granata             error.SetErrorString("unable to read data");
454*9128ee2fSEnrico Granata     }
455*9128ee2fSEnrico Granata     if (log)
456*9128ee2fSEnrico Granata         log->Printf ("SBData::ReadRawData (error=%p,offset=%d,buf=%p,size=%d) => "
457*9128ee2fSEnrico Granata                      "(%p)", error.get(), offset, buf, size, ok);
458*9128ee2fSEnrico Granata     return ok ? size : 0;
459*9128ee2fSEnrico Granata }
460*9128ee2fSEnrico Granata 
461*9128ee2fSEnrico Granata void
462*9128ee2fSEnrico Granata SBData::SetData(lldb::SBError& error,
463*9128ee2fSEnrico Granata                 const void *buf,
464*9128ee2fSEnrico Granata                 size_t size,
465*9128ee2fSEnrico Granata                 lldb::ByteOrder endian,
466*9128ee2fSEnrico Granata                 uint8_t addr_size)
467*9128ee2fSEnrico Granata {
468*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
469*9128ee2fSEnrico Granata     if (!m_opaque_sp.get())
470*9128ee2fSEnrico Granata         m_opaque_sp.reset(new DataExtractor(buf, size, endian, addr_size));
471*9128ee2fSEnrico Granata     else
472*9128ee2fSEnrico Granata         m_opaque_sp->SetData(buf, size, endian);
473*9128ee2fSEnrico Granata     if (log)
474*9128ee2fSEnrico Granata         log->Printf ("SBData::SetData (error=%p,buf=%p,size=%d,endian=%d,addr_size=%c) => "
475*9128ee2fSEnrico Granata                      "(%p)", error.get(), buf, size, endian, addr_size, m_opaque_sp.get());
476*9128ee2fSEnrico Granata }
477*9128ee2fSEnrico Granata 
478*9128ee2fSEnrico Granata bool
479*9128ee2fSEnrico Granata SBData::Append(const SBData& rhs)
480*9128ee2fSEnrico Granata {
481*9128ee2fSEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
482*9128ee2fSEnrico Granata     bool value = false;
483*9128ee2fSEnrico Granata     if (m_opaque_sp.get() && rhs.m_opaque_sp.get())
484*9128ee2fSEnrico Granata         value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp);
485*9128ee2fSEnrico Granata     if (log)
486*9128ee2fSEnrico Granata         log->Printf ("SBData::Append (rhs=%p) => "
487*9128ee2fSEnrico Granata                      "(%s)", rhs.get(), value ? "true" : "false");
488*9128ee2fSEnrico Granata     return value;
489*9128ee2fSEnrico Granata }