blob: f971a4178dff7adba9117f5916dd085d9b7eee23 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- Stream.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/Core/Stream.h"
Eli Friedman88966972010-06-09 08:50:27 +000011#include <stdio.h>
12#include <string.h>
13#include <stdlib.h>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014
15using namespace lldb;
16using namespace lldb_private;
17
18Stream::Stream (uint32_t flags, uint32_t addr_size, ByteOrder byte_order) :
19 m_flags (flags),
20 m_addr_size (addr_size),
21 m_byte_order (byte_order),
22 m_indent_level(0)
23{
24}
25
26Stream::Stream () :
27 m_flags (0),
28 m_addr_size (4),
29 m_byte_order (eByteOrderHost),
30 m_indent_level(0)
31{
32}
33
34//------------------------------------------------------------------
35// Destructor
36//------------------------------------------------------------------
37Stream::~Stream ()
38{
39}
40
41ByteOrder
42Stream::SetByteOrder (ByteOrder byte_order)
43{
44 ByteOrder old_byte_order = m_byte_order;
45 m_byte_order = byte_order;
46 return old_byte_order;
47}
48
49//------------------------------------------------------------------
50// Put an offset "uval" out to the stream using the printf format
51// in "format".
52//------------------------------------------------------------------
53void
54Stream::Offset (uint32_t uval, const char *format)
55{
56 Printf (format, uval);
57}
58
59//------------------------------------------------------------------
60// Put an SLEB128 "uval" out to the stream using the printf format
61// in "format".
62//------------------------------------------------------------------
63int
64Stream::PutSLEB128 (int64_t sval)
65{
66 int bytes_written = 0;
Greg Clayton73b472d2010-10-27 03:32:59 +000067 if (m_flags.Test(eBinary))
Chris Lattner30fdc8d2010-06-08 16:52:24 +000068 {
69 bool more = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000070 while (more)
71 {
72 uint8_t byte = sval & 0x7fu;
73 sval >>= 7;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000074 /* sign bit of byte is 2nd high order bit (0x40) */
75 if ((sval == 0 && !(byte & 0x40)) ||
76 (sval == -1 && (byte & 0x40)) )
77 more = false;
78 else
79 // more bytes to come
80 byte |= 0x80u;
81 bytes_written += Write(&byte, 1);
82 }
83 }
84 else
85 {
86 bytes_written = Printf ("0x%lli", sval);
87 }
88
89 return bytes_written;
90
91}
92
93//------------------------------------------------------------------
94// Put an ULEB128 "uval" out to the stream using the printf format
95// in "format".
96//------------------------------------------------------------------
97int
98Stream::PutULEB128 (uint64_t uval)
99{
100 int bytes_written = 0;
Greg Clayton73b472d2010-10-27 03:32:59 +0000101 if (m_flags.Test(eBinary))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000102 {
103 do
104 {
105
106 uint8_t byte = uval & 0x7fu;
107 uval >>= 7;
108 if (uval != 0)
109 {
110 // more bytes to come
111 byte |= 0x80u;
112 }
113 bytes_written += Write(&byte, 1);
114 } while (uval != 0);
115 }
116 else
117 {
118 bytes_written = Printf ("0x%llx", uval);
119 }
120 return bytes_written;
121}
122
123//------------------------------------------------------------------
124// Print a raw NULL terminated C string to the stream using the
125// printf format in "format".
126//------------------------------------------------------------------
127int
128Stream::PutCString (const char *cstr)
129{
130 int cstr_len = strlen(cstr);
131 // when in binary mode, emit the NULL terminator
Greg Clayton73b472d2010-10-27 03:32:59 +0000132 if (m_flags.Test(eBinary))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000133 ++cstr_len;
134 return Write (cstr, cstr_len);
135}
136
137//------------------------------------------------------------------
138// Print a double quoted NULL terminated C string to the stream
139// using the printf format in "format".
140//------------------------------------------------------------------
141void
142Stream::QuotedCString (const char *cstr, const char *format)
143{
144 Printf (format, cstr);
145}
146
147//------------------------------------------------------------------
148// Put an address "addr" out to the stream with optional prefix
149// and suffix strings.
150//------------------------------------------------------------------
151void
152Stream::Address (uint64_t addr, int addr_size, const char *prefix, const char *suffix)
153{
154 if (prefix == NULL)
155 prefix = "";
156 if (suffix == NULL)
157 suffix = "";
158// int addr_width = m_addr_size << 1;
159// Printf ("%s0x%0*llx%s", prefix, addr_width, addr, suffix);
160 Printf ("%s0x%0*llx%s", prefix, addr_size * 2, (uint64_t)addr, suffix);
161}
162
163//------------------------------------------------------------------
164// Put an address range out to the stream with optional prefix
165// and suffix strings.
166//------------------------------------------------------------------
167void
168Stream::AddressRange(uint64_t lo_addr, uint64_t hi_addr, int addr_size, const char *prefix, const char *suffix)
169{
170 if (prefix != NULL)
171 PutCString (prefix);
172 Address (lo_addr, addr_size, "[");
173 Address (hi_addr, addr_size, "-", ")");
174}
175
176
177int
178Stream::PutChar (char ch)
179{
180 return Write (&ch, 1);
181}
182
183
184//------------------------------------------------------------------
185// Print some formatted output to the stream.
186//------------------------------------------------------------------
187int
188Stream::Printf (const char *format, ...)
189{
190 va_list args;
191 va_start (args, format);
192 size_t result = PrintfVarArg(format, args);
193 va_end (args);
194 return result;
195}
196
197//------------------------------------------------------------------
198// Print some formatted output to the stream.
199//------------------------------------------------------------------
200int
201Stream::PrintfVarArg (const char *format, va_list args)
202{
203 char str[1024];
204 va_list args_copy;
205
206 va_copy (args_copy, args);
207
208 int bytes_written = 0;
209 // Try and format our string into a fixed buffer first and see if it fits
Greg Claytonc982c762010-07-09 20:39:50 +0000210 size_t length = ::vsnprintf (str, sizeof(str), format, args);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000211 if (length < sizeof(str))
212 {
213 va_end (args);
214 // Include the NULL termination byte for binary output
Greg Clayton73b472d2010-10-27 03:32:59 +0000215 if (m_flags.Test(eBinary))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000216 length += 1;
217 // The formatted string fit into our stack based buffer, so we can just
218 // append that to our packet
219 bytes_written = Write (str, length);
220 }
221 else
222 {
223 // Our stack buffer wasn't big enough to contain the entire formatted
224 // string, so lets let vasprintf create the string for us!
225 char *str_ptr = NULL;
226 length = ::vasprintf (&str_ptr, format, args_copy);
227 if (str_ptr)
228 {
229 // Include the NULL termination byte for binary output
Greg Clayton73b472d2010-10-27 03:32:59 +0000230 if (m_flags.Test(eBinary))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000231 length += 1;
232 bytes_written = Write (str_ptr, length);
233 ::free (str_ptr);
234 }
235 }
236 va_end (args_copy);
237 return bytes_written;
238}
239
240//------------------------------------------------------------------
241// Print and End of Line character to the stream
242//------------------------------------------------------------------
243int
244Stream::EOL()
245{
246 return PutChar ('\n');
247}
248
249//------------------------------------------------------------------
250// Indent the current line using the current indentation level and
251// print an optional string following the idenatation spaces.
252//------------------------------------------------------------------
253int
254Stream::Indent(const char *s)
255{
256 return Printf ("%*.*s%s", m_indent_level, m_indent_level, "", s ? s : "");
257}
258
259//------------------------------------------------------------------
260// Stream a character "ch" out to this stream.
261//------------------------------------------------------------------
262Stream&
263Stream::operator<< (char ch)
264{
265 PutChar (ch);
266 return *this;
267}
268
269//------------------------------------------------------------------
270// Stream the NULL terminated C string out to this stream.
271//------------------------------------------------------------------
272Stream&
273Stream::operator<< (const char *s)
274{
275 Printf ("%s", s);
276 return *this;
277}
278
279//------------------------------------------------------------------
280// Stream the pointer value out to this stream.
281//------------------------------------------------------------------
282Stream&
283Stream::operator<< (void *p)
284{
285 Printf ("0x%.*tx", (int)sizeof(void*) * 2, (ptrdiff_t)p);
286 return *this;
287}
288
289//------------------------------------------------------------------
290// Stream a uint8_t "uval" out to this stream.
291//------------------------------------------------------------------
292Stream&
293Stream::operator<< (uint8_t uval)
294{
295 PutHex8(uval);
296 return *this;
297}
298
299//------------------------------------------------------------------
300// Stream a uint16_t "uval" out to this stream.
301//------------------------------------------------------------------
302Stream&
303Stream::operator<< (uint16_t uval)
304{
305 PutHex16(uval, m_byte_order);
306 return *this;
307}
308
309//------------------------------------------------------------------
310// Stream a uint32_t "uval" out to this stream.
311//------------------------------------------------------------------
312Stream&
313Stream::operator<< (uint32_t uval)
314{
315 PutHex32(uval, m_byte_order);
316 return *this;
317}
318
319//------------------------------------------------------------------
320// Stream a uint64_t "uval" out to this stream.
321//------------------------------------------------------------------
322Stream&
323Stream::operator<< (uint64_t uval)
324{
325 PutHex64(uval, m_byte_order);
326 return *this;
327}
328
329//------------------------------------------------------------------
330// Stream a int8_t "sval" out to this stream.
331//------------------------------------------------------------------
332Stream&
333Stream::operator<< (int8_t sval)
334{
335 Printf ("%i", (int)sval);
336 return *this;
337}
338
339//------------------------------------------------------------------
340// Stream a int16_t "sval" out to this stream.
341//------------------------------------------------------------------
342Stream&
343Stream::operator<< (int16_t sval)
344{
345 Printf ("%i", (int)sval);
346 return *this;
347}
348
349//------------------------------------------------------------------
350// Stream a int32_t "sval" out to this stream.
351//------------------------------------------------------------------
352Stream&
353Stream::operator<< (int32_t sval)
354{
355 Printf ("%i", (int)sval);
356 return *this;
357}
358
359//------------------------------------------------------------------
360// Stream a int64_t "sval" out to this stream.
361//------------------------------------------------------------------
362Stream&
363Stream::operator<< (int64_t sval)
364{
365 Printf ("%lli", sval);
366 return *this;
367}
368
369//------------------------------------------------------------------
370// Get the current indentation level
371//------------------------------------------------------------------
372int
373Stream::GetIndentLevel() const
374{
375 return m_indent_level;
376}
377
378//------------------------------------------------------------------
379// Set the current indentation level
380//------------------------------------------------------------------
381void
382Stream::SetIndentLevel(int indent_level)
383{
384 m_indent_level = indent_level;
385}
386
387//------------------------------------------------------------------
388// Increment the current indentation level
389//------------------------------------------------------------------
390void
391Stream::IndentMore(int amount)
392{
393 m_indent_level += amount;
394}
395
396//------------------------------------------------------------------
397// Decrement the current indentation level
398//------------------------------------------------------------------
399void
400Stream::IndentLess (int amount)
401{
402 if (m_indent_level >= amount)
403 m_indent_level -= amount;
404 else
405 m_indent_level = 0;
406}
407
408//------------------------------------------------------------------
409// Get the address size in bytes
410//------------------------------------------------------------------
411uint8_t
412Stream::GetAddressByteSize() const
413{
414 return m_addr_size;
415}
416
417//------------------------------------------------------------------
418// Set the address size in bytes
419//------------------------------------------------------------------
420void
421Stream::SetAddressByteSize(uint8_t addr_size)
422{
423 m_addr_size = addr_size;
424}
425
426//------------------------------------------------------------------
427// Returns true if the verbose flag bit is set in this stream.
428//------------------------------------------------------------------
429bool
430Stream::GetVerbose() const
431{
Greg Clayton73b472d2010-10-27 03:32:59 +0000432 return m_flags.Test(eVerbose);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000433}
434
435//------------------------------------------------------------------
436// Returns true if the debug flag bit is set in this stream.
437//------------------------------------------------------------------
438bool
439Stream::GetDebug() const
440{
Greg Clayton73b472d2010-10-27 03:32:59 +0000441 return m_flags.Test(eDebug);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000442}
443
444//------------------------------------------------------------------
445// The flags get accessor
446//------------------------------------------------------------------
447Flags&
448Stream::GetFlags()
449{
450 return m_flags;
451}
452
453//------------------------------------------------------------------
454// The flags const get accessor
455//------------------------------------------------------------------
456const Flags&
457Stream::GetFlags() const
458{
459 return m_flags;
460}
461
Sean Callanan609f8c52010-07-02 02:43:42 +0000462//------------------------------------------------------------------
463// The byte order get accessor
464//------------------------------------------------------------------
465
466lldb::ByteOrder
467Stream::GetByteOrder() const
468{
469 return m_byte_order;
470}
471
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000472int
473Stream::PrintfAsRawHex8 (const char *format, ...)
474{
475 va_list args;
476 va_list args_copy;
477 va_start (args, format);
478 va_copy (args, args_copy); // Copy this so we
479
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000480 char str[1024];
481 int bytes_written = 0;
482 // Try and format our string into a fixed buffer first and see if it fits
Greg Claytonc982c762010-07-09 20:39:50 +0000483 size_t length = ::vsnprintf (str, sizeof(str), format, args);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000484 if (length < sizeof(str))
485 {
486 // The formatted string fit into our stack based buffer, so we can just
487 // append that to our packet
Greg Claytonc982c762010-07-09 20:39:50 +0000488 for (size_t i=0; i<length; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000489 bytes_written += _PutHex8 (str[i], false);
490 }
491 else
492 {
493 // Our stack buffer wasn't big enough to contain the entire formatted
494 // string, so lets let vasprintf create the string for us!
495 char *str_ptr = NULL;
496 length = ::vasprintf (&str_ptr, format, args_copy);
497 if (str_ptr)
498 {
Greg Claytonc982c762010-07-09 20:39:50 +0000499 for (size_t i=0; i<length; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000500 bytes_written += _PutHex8 (str_ptr[i], false);
501 ::free (str_ptr);
502 }
503 }
504 va_end (args);
505 va_end (args_copy);
506
507 return bytes_written;
508}
509
510int
511Stream::PutNHex8 (size_t n, uint8_t uvalue)
512{
513 int bytes_written = 0;
Greg Claytonc982c762010-07-09 20:39:50 +0000514 for (size_t i=0; i<n; ++i)
Greg Clayton73b472d2010-10-27 03:32:59 +0000515 bytes_written += _PutHex8 (uvalue, m_flags.Test(eAddPrefix));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000516 return bytes_written;
517}
518
519int
520Stream::_PutHex8 (uint8_t uvalue, bool add_prefix)
521{
522 int bytes_written = 0;
Greg Clayton73b472d2010-10-27 03:32:59 +0000523 if (m_flags.Test(eBinary))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000524 {
525 bytes_written = Write (&uvalue, 1);
526 }
527 else
528 {
529 if (add_prefix)
530 PutCString("0x");
531
532 static char g_hex_to_ascii_hex_char[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
533 char nibble_chars[2];
534 nibble_chars[0] = g_hex_to_ascii_hex_char[(uvalue >> 4) & 0xf];
535 nibble_chars[1] = g_hex_to_ascii_hex_char[(uvalue >> 0) & 0xf];
536 bytes_written = Write (nibble_chars, sizeof(nibble_chars));
537 }
538 return bytes_written;
539}
540
541int
542Stream::PutHex8 (uint8_t uvalue)
543{
Greg Clayton73b472d2010-10-27 03:32:59 +0000544 return _PutHex8 (uvalue, m_flags.Test(eAddPrefix));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000545}
546
547int
548Stream::PutHex16 (uint16_t uvalue, ByteOrder byte_order)
549{
550 if (byte_order == eByteOrderInvalid)
551 byte_order = m_byte_order;
552
Greg Clayton73b472d2010-10-27 03:32:59 +0000553 bool add_prefix = m_flags.Test(eAddPrefix);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000554 int bytes_written = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000555 if (byte_order == eByteOrderLittle)
556 {
Greg Claytonc982c762010-07-09 20:39:50 +0000557 for (size_t byte = 0; byte < sizeof(uvalue); ++byte, add_prefix = false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000558 bytes_written += _PutHex8 (uvalue >> (byte * 8), add_prefix);
559 }
560 else
561 {
Greg Claytonc982c762010-07-09 20:39:50 +0000562 for (size_t byte = sizeof(uvalue)-1; byte < sizeof(uvalue); --byte, add_prefix = false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000563 bytes_written += _PutHex8 (uvalue >> (byte * 8), add_prefix);
564 }
565 return bytes_written;
566}
567
568int
569Stream::PutHex32(uint32_t uvalue, ByteOrder byte_order)
570{
571 if (byte_order == eByteOrderInvalid)
572 byte_order = m_byte_order;
573
Greg Clayton73b472d2010-10-27 03:32:59 +0000574 bool add_prefix = m_flags.Test(eAddPrefix);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000575 int bytes_written = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000576 if (byte_order == eByteOrderLittle)
577 {
Greg Claytonc982c762010-07-09 20:39:50 +0000578 for (size_t byte = 0; byte < sizeof(uvalue); ++byte, add_prefix = false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000579 bytes_written += _PutHex8 (uvalue >> (byte * 8), add_prefix);
580 }
581 else
582 {
Greg Claytonc982c762010-07-09 20:39:50 +0000583 for (size_t byte = sizeof(uvalue)-1; byte < sizeof(uvalue); --byte, add_prefix = false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000584 bytes_written += _PutHex8 (uvalue >> (byte * 8), add_prefix);
585 }
586 return bytes_written;
587}
588
589int
590Stream::PutHex64(uint64_t uvalue, ByteOrder byte_order)
591{
592 if (byte_order == eByteOrderInvalid)
593 byte_order = m_byte_order;
594
Greg Clayton73b472d2010-10-27 03:32:59 +0000595 bool add_prefix = m_flags.Test(eAddPrefix);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000596 int bytes_written = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000597 if (byte_order == eByteOrderLittle)
598 {
Greg Claytonc982c762010-07-09 20:39:50 +0000599 for (size_t byte = 0; byte < sizeof(uvalue); ++byte, add_prefix = false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000600 bytes_written += _PutHex8 (uvalue >> (byte * 8), add_prefix);
601 }
602 else
603 {
Greg Claytonc982c762010-07-09 20:39:50 +0000604 for (size_t byte = sizeof(uvalue)-1; byte < sizeof(uvalue); --byte, add_prefix = false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000605 bytes_written += _PutHex8 (uvalue >> (byte * 8), add_prefix);
606 }
607 return bytes_written;
608}
609
610int
611Stream::PutMaxHex64
612(
613 uint64_t uvalue,
614 size_t byte_size,
615 lldb::ByteOrder byte_order
616)
617{
618 switch (byte_size)
619 {
620 case 1: return PutHex8 (uvalue);
621 case 2: return PutHex16 (uvalue);
622 case 4: return PutHex32 (uvalue);
623 case 8: return PutHex64 (uvalue);
624 }
625 return 0;
626}
627
628int
629Stream::PutPointer (void *ptr)
630{
631 return PutRawBytes (&ptr, sizeof(ptr), eByteOrderHost, eByteOrderHost);
632}
633
634int
635Stream::PutFloat(float f, ByteOrder byte_order)
636{
637 if (byte_order == eByteOrderInvalid)
638 byte_order = m_byte_order;
639
640 return PutRawBytes (&f, sizeof(f), eByteOrderHost, byte_order);
641}
642
643int
644Stream::PutDouble(double d, ByteOrder byte_order)
645{
646 if (byte_order == eByteOrderInvalid)
647 byte_order = m_byte_order;
648
649 return PutRawBytes (&d, sizeof(d), eByteOrderHost, byte_order);
650}
651
652int
653Stream::PutLongDouble(long double ld, ByteOrder byte_order)
654{
655 if (byte_order == eByteOrderInvalid)
656 byte_order = m_byte_order;
657
658 return PutRawBytes (&ld, sizeof(ld), eByteOrderHost, byte_order);
659}
660
661int
662Stream::PutRawBytes (const void *s, size_t src_len, ByteOrder src_byte_order, ByteOrder dst_byte_order)
663{
664 if (src_byte_order == eByteOrderInvalid)
665 src_byte_order = m_byte_order;
666
667 if (dst_byte_order == eByteOrderInvalid)
668 dst_byte_order = m_byte_order;
669
670 int bytes_written = 0;
671 const uint8_t *src = (const uint8_t *)s;
Greg Clayton73b472d2010-10-27 03:32:59 +0000672 bool binary_was_set = m_flags.Test (eBinary);
673 if (!binary_was_set)
674 m_flags.Set (eBinary);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000675 if (src_byte_order == dst_byte_order)
676 {
Greg Claytonc982c762010-07-09 20:39:50 +0000677 for (size_t i = 0; i < src_len; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000678 bytes_written += _PutHex8 (src[i], false);
679 }
680 else
681 {
Greg Claytonc982c762010-07-09 20:39:50 +0000682 for (size_t i = src_len-1; i < src_len; --i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000683 bytes_written += _PutHex8 (src[i], false);
684 }
Greg Clayton73b472d2010-10-27 03:32:59 +0000685 if (!binary_was_set)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000686 m_flags.Clear (eBinary);
687
688 return bytes_written;
689}
690
691int
692Stream::PutBytesAsRawHex8 (const void *s, size_t src_len, ByteOrder src_byte_order, ByteOrder dst_byte_order)
693{
694 if (src_byte_order == eByteOrderInvalid)
695 src_byte_order = m_byte_order;
696
697 if (dst_byte_order == eByteOrderInvalid)
698 dst_byte_order = m_byte_order;
699
700 int bytes_written = 0;
701 const uint8_t *src = (const uint8_t *)s;
Greg Clayton73b472d2010-10-27 03:32:59 +0000702 bool binary_is_set = m_flags.Test(eBinary);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000703 m_flags.Clear(eBinary);
704 if (src_byte_order == dst_byte_order)
705 {
Greg Claytonc982c762010-07-09 20:39:50 +0000706 for (size_t i = 0; i < src_len; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000707 bytes_written += _PutHex8 (src[i], false);
708 }
709 else
710 {
Greg Claytonc982c762010-07-09 20:39:50 +0000711 for (size_t i = src_len-1; i < src_len; --i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000712 bytes_written += _PutHex8 (src[i], false);
713 }
714 if (binary_is_set)
715 m_flags.Set(eBinary);
716
717 return bytes_written;
718}
719
720int
721Stream::PutCStringAsRawHex8 (const char *s)
722{
723 int bytes_written = 0;
Greg Clayton73b472d2010-10-27 03:32:59 +0000724 bool binary_is_set = m_flags.Test(eBinary);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000725 m_flags.Clear(eBinary);
726 do
727 {
728 bytes_written += _PutHex8 (*s, false);
729 ++s;
730 } while (*s);
731 if (binary_is_set)
732 m_flags.Set(eBinary);
733 return bytes_written;
734}
735
736void
737Stream::UnitTest(Stream *s)
738{
739 s->PutHex8(0x12);
740
741 s->PutChar(' ');
742 s->PutHex16(0x3456, eByteOrderHost);
743 s->PutChar(' ');
744 s->PutHex16(0x3456, eByteOrderBig);
745 s->PutChar(' ');
746 s->PutHex16(0x3456, eByteOrderLittle);
747
748 s->PutChar(' ');
749 s->PutHex32(0x789abcde, eByteOrderHost);
750 s->PutChar(' ');
751 s->PutHex32(0x789abcde, eByteOrderBig);
752 s->PutChar(' ');
753 s->PutHex32(0x789abcde, eByteOrderLittle);
754
755 s->PutChar(' ');
756 s->PutHex64(0x1122334455667788ull, eByteOrderHost);
757 s->PutChar(' ');
758 s->PutHex64(0x1122334455667788ull, eByteOrderBig);
759 s->PutChar(' ');
760 s->PutHex64(0x1122334455667788ull, eByteOrderLittle);
761
762 const char *hola = "Hello World!!!";
763 s->PutChar(' ');
764 s->PutCString (hola);
765
766 s->PutChar(' ');
767 s->Write (hola, 5);
768
769 s->PutChar(' ');
770 s->PutCStringAsRawHex8 (hola);
771
772 s->PutChar(' ');
773 s->PutCStringAsRawHex8 ("01234");
774
775 s->PutChar(' ');
776 s->Printf ("pid=%i", 12733);
777
778 s->PutChar(' ');
779 s->PrintfAsRawHex8 ("pid=%i", 12733);
780 s->PutChar('\n');
781}
782