124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Stream.cpp ----------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
11cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h"
12769908bd4f1d0e09f60dc8f75d1a1b6f41ca6963Benjamin Kramer#include <stddef.h>
13a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <stdio.h>
14a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <string.h>
15a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <stdlib.h>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
175f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea#include <inttypes.h>
185f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::Stream (uint32_t flags, uint32_t addr_size, ByteOrder byte_order) :
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags (flags),
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_addr_size (addr_size),
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_byte_order (byte_order),
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_indent_level(0)
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::Stream () :
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags (0),
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_addr_size (4),
33cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton    m_byte_order (lldb::endian::InlHostByteOrder()),
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_indent_level(0)
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::~Stream ()
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerByteOrder
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::SetByteOrder (ByteOrder byte_order)
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ByteOrder old_byte_order = m_byte_order;
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_byte_order = byte_order;
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return old_byte_order;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Put an offset "uval" out to the stream using the printf format
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// in "format".
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::Offset (uint32_t uval, const char *format)
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Printf (format, uval);
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Put an SLEB128 "uval" out to the stream using the printf format
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// in "format".
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
6736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutSLEB128 (int64_t sval)
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t bytes_written = 0;
71f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (m_flags.Test(eBinary))
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool more = true;
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        while (more)
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint8_t byte = sval & 0x7fu;
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sval >>= 7;
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            /* sign bit of byte is 2nd high order bit (0x40) */
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if ((sval ==  0 && !(byte & 0x40)) ||
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                (sval == -1 &&  (byte & 0x40)) )
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                more = false;
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // more bytes to come
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                byte |= 0x80u;
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bytes_written += Write(&byte, 1);
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
905f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        bytes_written = Printf ("0x%" PRIi64, sval);
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Put an ULEB128 "uval" out to the stream using the printf format
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// in "format".
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
10136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutULEB128 (uint64_t uval)
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t bytes_written = 0;
105f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (m_flags.Test(eBinary))
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        do
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint8_t byte = uval & 0x7fu;
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uval >>= 7;
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (uval != 0)
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // more bytes to come
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                byte |= 0x80u;
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bytes_written += Write(&byte, 1);
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        } while (uval != 0);
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1225f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        bytes_written = Printf ("0x%" PRIx64, uval);
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
1284691fc522359004738cde0646af96e0a39181b6bEnrico Granata// Print a raw NULL terminated C string to the stream.
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
13036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutCString (const char *cstr)
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t cstr_len = strlen(cstr);
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // when in binary mode, emit the NULL terminator
135f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (m_flags.Test(eBinary))
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ++cstr_len;
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Write (cstr, cstr_len);
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print a double quoted NULL terminated C string to the stream
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// using the printf format in "format".
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::QuotedCString (const char *cstr, const char *format)
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Printf (format, cstr);
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Put an address "addr" out to the stream with optional prefix
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and suffix strings.
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
15536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonStream::Address (uint64_t addr, uint32_t addr_size, const char *prefix, const char *suffix)
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (prefix == NULL)
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        prefix = "";
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (suffix == NULL)
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        suffix = "";
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    int addr_width = m_addr_size << 1;
1625f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea//    Printf ("%s0x%0*" PRIx64 "%s", prefix, addr_width, addr, suffix);
1635f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    Printf ("%s0x%0*" PRIx64 "%s", prefix, addr_size * 2, (uint64_t)addr, suffix);
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Put an address range out to the stream with optional prefix
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and suffix strings.
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
17136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonStream::AddressRange(uint64_t lo_addr, uint64_t hi_addr, uint32_t addr_size, const char *prefix, const char *suffix)
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17348f479811cabdbd8b4c24083a0e8ef56d0e7369dGreg Clayton    if (prefix && prefix[0])
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        PutCString (prefix);
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Address (lo_addr, addr_size, "[");
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Address (hi_addr, addr_size, "-", ")");
17748f479811cabdbd8b4c24083a0e8ef56d0e7369dGreg Clayton    if (suffix && suffix[0])
17848f479811cabdbd8b4c24083a0e8ef56d0e7369dGreg Clayton        PutCString (suffix);
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutChar (char ch)
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Write (&ch, 1);
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print some formatted output to the stream.
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
19236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::Printf (const char *format, ...)
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    va_list args;
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    va_start (args, format);
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t result = PrintfVarArg(format, args);
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    va_end (args);
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print some formatted output to the stream.
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
20536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PrintfVarArg (const char *format, va_list args)
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char str[1024];
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    va_list args_copy;
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    va_copy (args_copy, args);
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t bytes_written = 0;
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Try and format our string into a fixed buffer first and see if it fits
21554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    size_t length = ::vsnprintf (str, sizeof(str), format, args);
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (length < sizeof(str))
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Include the NULL termination byte for binary output
219f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (m_flags.Test(eBinary))
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            length += 1;
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // The formatted string fit into our stack based buffer, so we can just
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // append that to our packet
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bytes_written = Write (str, length);
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Our stack buffer wasn't big enough to contain the entire formatted
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // string, so lets let vasprintf create the string for us!
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char *str_ptr = NULL;
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        length = ::vasprintf (&str_ptr, format, args_copy);
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (str_ptr)
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Include the NULL termination byte for binary output
234f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (m_flags.Test(eBinary))
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                length += 1;
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bytes_written = Write (str_ptr, length);
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ::free (str_ptr);
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    va_end (args_copy);
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print and End of Line character to the stream
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
24736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::EOL()
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return PutChar ('\n');
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Indent the current line using the current indentation level and
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// print an optional string following the idenatation spaces.
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
25736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::Indent(const char *s)
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Printf ("%*.*s%s", m_indent_level, m_indent_level, "", s ? s : "");
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a character "ch" out to this stream.
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (char ch)
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PutChar (ch);
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream the NULL terminated C string out to this stream.
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<<  (const char *s)
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Printf ("%s", s);
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream the pointer value out to this stream.
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (void *p)
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Printf ("0x%.*tx", (int)sizeof(void*) * 2, (ptrdiff_t)p);
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a uint8_t "uval" out to this stream.
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (uint8_t uval)
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PutHex8(uval);
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a uint16_t "uval" out to this stream.
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (uint16_t uval)
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PutHex16(uval, m_byte_order);
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a uint32_t "uval" out to this stream.
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (uint32_t uval)
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PutHex32(uval, m_byte_order);
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a uint64_t "uval" out to this stream.
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (uint64_t uval)
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PutHex64(uval, m_byte_order);
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a int8_t "sval" out to this stream.
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (int8_t sval)
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Printf ("%i", (int)sval);
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a int16_t "sval" out to this stream.
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (int16_t sval)
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Printf ("%i", (int)sval);
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a int32_t "sval" out to this stream.
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (int32_t sval)
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Printf ("%i", (int)sval);
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a int64_t "sval" out to this stream.
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream&
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (int64_t sval)
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3695f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    Printf ("%" PRIi64, sval);
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the current indentation level
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::GetIndentLevel() const
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_indent_level;
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Set the current indentation level
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::SetIndentLevel(int indent_level)
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_indent_level = indent_level;
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Increment the current indentation level
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::IndentMore(int amount)
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_indent_level += amount;
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Decrement the current indentation level
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::IndentLess (int amount)
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_indent_level >= amount)
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_indent_level -= amount;
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_indent_level = 0;
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the address size in bytes
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
41536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonuint32_t
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::GetAddressByteSize() const
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_addr_size;
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Set the address size in bytes
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
42536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonStream::SetAddressByteSize(uint32_t addr_size)
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_addr_size = addr_size;
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if the verbose flag bit is set in this stream.
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::GetVerbose() const
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
436f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return m_flags.Test(eVerbose);
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if the debug flag bit is set in this stream.
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::GetDebug() const
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
445f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return m_flags.Test(eDebug);
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The flags get accessor
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFlags&
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::GetFlags()
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_flags;
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The flags const get accessor
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Flags&
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::GetFlags() const
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_flags;
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
466b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan//------------------------------------------------------------------
467b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan// The byte order get accessor
468b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan//------------------------------------------------------------------
469b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan
470b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callananlldb::ByteOrder
471b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean CallananStream::GetByteOrder() const
472b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan{
473b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan    return m_byte_order;
474b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan}
475b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan
47636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PrintfAsRawHex8 (const char *format, ...)
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    va_list args;
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    va_list args_copy;
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    va_start (args, format);
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    va_copy (args, args_copy); // Copy this so we
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char str[1024];
48536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t bytes_written = 0;
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Try and format our string into a fixed buffer first and see if it fits
48754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    size_t length = ::vsnprintf (str, sizeof(str), format, args);
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (length < sizeof(str))
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // The formatted string fit into our stack based buffer, so we can just
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // append that to our packet
49254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (size_t i=0; i<length; ++i)
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bytes_written += _PutHex8 (str[i], false);
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Our stack buffer wasn't big enough to contain the entire formatted
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // string, so lets let vasprintf create the string for us!
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char *str_ptr = NULL;
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        length = ::vasprintf (&str_ptr, format, args_copy);
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (str_ptr)
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
50354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton            for (size_t i=0; i<length; ++i)
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bytes_written += _PutHex8 (str_ptr[i], false);
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ::free (str_ptr);
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    va_end (args);
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    va_end (args_copy);
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutNHex8 (size_t n, uint8_t uvalue)
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t bytes_written = 0;
51854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    for (size_t i=0; i<n; ++i)
519f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        bytes_written += _PutHex8 (uvalue, m_flags.Test(eAddPrefix));
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::_PutHex8 (uint8_t uvalue, bool add_prefix)
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t bytes_written = 0;
527f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (m_flags.Test(eBinary))
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bytes_written = Write (&uvalue, 1);
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (add_prefix)
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            PutCString("0x");
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        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' };
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char nibble_chars[2];
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        nibble_chars[0] = g_hex_to_ascii_hex_char[(uvalue >> 4) & 0xf];
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        nibble_chars[1] = g_hex_to_ascii_hex_char[(uvalue >> 0) & 0xf];
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bytes_written = Write (nibble_chars, sizeof(nibble_chars));
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutHex8 (uint8_t uvalue)
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
548f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return _PutHex8 (uvalue, m_flags.Test(eAddPrefix));
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutHex16 (uint16_t uvalue, ByteOrder byte_order)
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (byte_order == eByteOrderInvalid)
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        byte_order = m_byte_order;
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
557f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    bool add_prefix = m_flags.Test(eAddPrefix);
55836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t bytes_written = 0;
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (byte_order == eByteOrderLittle)
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
56154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (size_t byte = 0; byte < sizeof(uvalue); ++byte, add_prefix = false)
56236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            bytes_written += _PutHex8 ((uint8_t)(uvalue >> (byte * 8)), add_prefix);
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
56654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (size_t byte = sizeof(uvalue)-1; byte < sizeof(uvalue); --byte, add_prefix = false)
56736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            bytes_written += _PutHex8 ((uint8_t)(uvalue >> (byte * 8)), add_prefix);
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutHex32(uint32_t uvalue, ByteOrder byte_order)
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (byte_order == eByteOrderInvalid)
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        byte_order = m_byte_order;
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
578f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    bool add_prefix = m_flags.Test(eAddPrefix);
57936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t bytes_written = 0;
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (byte_order == eByteOrderLittle)
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
58254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (size_t byte = 0; byte < sizeof(uvalue); ++byte, add_prefix = false)
58336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            bytes_written += _PutHex8 ((uint8_t)(uvalue >> (byte * 8)), add_prefix);
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
58754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (size_t byte = sizeof(uvalue)-1; byte < sizeof(uvalue); --byte, add_prefix = false)
58836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            bytes_written += _PutHex8 ((uint8_t)(uvalue >> (byte * 8)), add_prefix);
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutHex64(uint64_t uvalue, ByteOrder byte_order)
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (byte_order == eByteOrderInvalid)
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        byte_order = m_byte_order;
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
599f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    bool add_prefix = m_flags.Test(eAddPrefix);
60036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t bytes_written = 0;
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (byte_order == eByteOrderLittle)
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
60354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (size_t byte = 0; byte < sizeof(uvalue); ++byte, add_prefix = false)
60436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            bytes_written += _PutHex8 ((uint8_t)(uvalue >> (byte * 8)), add_prefix);
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
60854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (size_t byte = sizeof(uvalue)-1; byte < sizeof(uvalue); --byte, add_prefix = false)
60936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            bytes_written += _PutHex8 ((uint8_t)(uvalue >> (byte * 8)), add_prefix);
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutMaxHex64
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t uvalue,
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t byte_size,
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::ByteOrder byte_order
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (byte_size)
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
62436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    case 1: return PutHex8  ((uint8_t)uvalue);
62536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    case 2: return PutHex16 ((uint16_t)uvalue);
62636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    case 4: return PutHex32 ((uint32_t)uvalue);
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case 8: return PutHex64 (uvalue);
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutPointer (void *ptr)
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
635cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton    return PutRawBytes (&ptr, sizeof(ptr), lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder());
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutFloat(float f, ByteOrder byte_order)
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (byte_order == eByteOrderInvalid)
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        byte_order = m_byte_order;
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
644cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton    return PutRawBytes (&f, sizeof(f), lldb::endian::InlHostByteOrder(), byte_order);
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutDouble(double d, ByteOrder byte_order)
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (byte_order == eByteOrderInvalid)
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        byte_order = m_byte_order;
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
653cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton    return PutRawBytes (&d, sizeof(d), lldb::endian::InlHostByteOrder(), byte_order);
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutLongDouble(long double ld, ByteOrder byte_order)
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (byte_order == eByteOrderInvalid)
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        byte_order = m_byte_order;
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
662cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton    return PutRawBytes (&ld, sizeof(ld), lldb::endian::InlHostByteOrder(), byte_order);
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutRawBytes (const void *s, size_t src_len, ByteOrder src_byte_order, ByteOrder dst_byte_order)
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (src_byte_order == eByteOrderInvalid)
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        src_byte_order = m_byte_order;
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (dst_byte_order == eByteOrderInvalid)
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        dst_byte_order = m_byte_order;
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t bytes_written = 0;
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint8_t *src = (const uint8_t *)s;
676f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    bool binary_was_set = m_flags.Test (eBinary);
677f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (!binary_was_set)
678f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        m_flags.Set (eBinary);
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (src_byte_order == dst_byte_order)
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
68154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (size_t i = 0; i < src_len; ++i)
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bytes_written += _PutHex8 (src[i], false);
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
68654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (size_t i = src_len-1; i < src_len; --i)
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bytes_written += _PutHex8 (src[i], false);
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
689f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (!binary_was_set)
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_flags.Clear (eBinary);
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutBytesAsRawHex8 (const void *s, size_t src_len, ByteOrder src_byte_order, ByteOrder dst_byte_order)
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (src_byte_order == eByteOrderInvalid)
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        src_byte_order = m_byte_order;
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (dst_byte_order == eByteOrderInvalid)
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        dst_byte_order = m_byte_order;
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t bytes_written = 0;
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint8_t *src = (const uint8_t *)s;
706f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    bool binary_is_set = m_flags.Test(eBinary);
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags.Clear(eBinary);
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (src_byte_order == dst_byte_order)
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
71054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (size_t i = 0; i < src_len; ++i)
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bytes_written += _PutHex8 (src[i], false);
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
71554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (size_t i = src_len-1; i < src_len; --i)
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bytes_written += _PutHex8 (src[i], false);
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (binary_is_set)
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_flags.Set(eBinary);
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutCStringAsRawHex8 (const char *s)
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
72736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t bytes_written = 0;
728f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    bool binary_is_set = m_flags.Test(eBinary);
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags.Clear(eBinary);
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    do
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bytes_written += _PutHex8 (*s, false);
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ++s;
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } while (*s);
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (binary_is_set)
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_flags.Set(eBinary);
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::UnitTest(Stream *s)
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutHex8(0x12);
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
746cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton    s->PutHex16(0x3456, lldb::endian::InlHostByteOrder());
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutHex16(0x3456, eByteOrderBig);
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutHex16(0x3456, eByteOrderLittle);
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
753cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton    s->PutHex32(0x789abcde, lldb::endian::InlHostByteOrder());
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutHex32(0x789abcde, eByteOrderBig);
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutHex32(0x789abcde, eByteOrderLittle);
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
760cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton    s->PutHex64(0x1122334455667788ull, lldb::endian::InlHostByteOrder());
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutHex64(0x1122334455667788ull, eByteOrderBig);
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutHex64(0x1122334455667788ull, eByteOrderLittle);
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *hola = "Hello World!!!";
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutCString (hola);
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Write (hola, 5);
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutCStringAsRawHex8 (hola);
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutCStringAsRawHex8 ("01234");
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf ("pid=%i", 12733);
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar(' ');
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PrintfAsRawHex8 ("pid=%i", 12733);
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->PutChar('\n');
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
787