1f678e45dSDimitry Andric //===-- StreamString.cpp ----------------------------------------*- C++ -*-===//
2f678e45dSDimitry Andric //
3f678e45dSDimitry Andric //                     The LLVM Compiler Infrastructure
4f678e45dSDimitry Andric //
5f678e45dSDimitry Andric // This file is distributed under the University of Illinois Open Source
6f678e45dSDimitry Andric // License. See LICENSE.TXT for details.
7f678e45dSDimitry Andric //
8f678e45dSDimitry Andric //===----------------------------------------------------------------------===//
9f678e45dSDimitry Andric 
10f678e45dSDimitry Andric #include "lldb/Utility/StreamString.h"
11f678e45dSDimitry Andric 
12f678e45dSDimitry Andric using namespace lldb;
13f678e45dSDimitry Andric using namespace lldb_private;
14f678e45dSDimitry Andric 
StreamString()15f678e45dSDimitry Andric StreamString::StreamString() : Stream(0, 4, eByteOrderBig) {}
16f678e45dSDimitry Andric 
StreamString(uint32_t flags,uint32_t addr_size,ByteOrder byte_order)17f678e45dSDimitry Andric StreamString::StreamString(uint32_t flags, uint32_t addr_size,
18f678e45dSDimitry Andric                            ByteOrder byte_order)
19f678e45dSDimitry Andric     : Stream(flags, addr_size, byte_order), m_packet() {}
20f678e45dSDimitry Andric 
~StreamString()21f678e45dSDimitry Andric StreamString::~StreamString() {}
22f678e45dSDimitry Andric 
Flush()23f678e45dSDimitry Andric void StreamString::Flush() {
24f678e45dSDimitry Andric   // Nothing to do when flushing a buffer based stream...
25f678e45dSDimitry Andric }
26f678e45dSDimitry Andric 
WriteImpl(const void * s,size_t length)27*b5893f02SDimitry Andric size_t StreamString::WriteImpl(const void *s, size_t length) {
28f678e45dSDimitry Andric   m_packet.append(reinterpret_cast<const char *>(s), length);
29f678e45dSDimitry Andric   return length;
30f678e45dSDimitry Andric }
31f678e45dSDimitry Andric 
Clear()32*b5893f02SDimitry Andric void StreamString::Clear() {
33*b5893f02SDimitry Andric   m_packet.clear();
34*b5893f02SDimitry Andric   m_bytes_written = 0;
35*b5893f02SDimitry Andric }
36f678e45dSDimitry Andric 
Empty() const37f678e45dSDimitry Andric bool StreamString::Empty() const { return GetSize() == 0; }
38f678e45dSDimitry Andric 
GetSize() const39f678e45dSDimitry Andric size_t StreamString::GetSize() const { return m_packet.size(); }
40f678e45dSDimitry Andric 
GetSizeOfLastLine() const41f678e45dSDimitry Andric size_t StreamString::GetSizeOfLastLine() const {
42f678e45dSDimitry Andric   const size_t length = m_packet.size();
43f678e45dSDimitry Andric   size_t last_line_begin_pos = m_packet.find_last_of("\r\n");
44f678e45dSDimitry Andric   if (last_line_begin_pos == std::string::npos) {
45f678e45dSDimitry Andric     return length;
46f678e45dSDimitry Andric   } else {
47f678e45dSDimitry Andric     ++last_line_begin_pos;
48f678e45dSDimitry Andric     return length - last_line_begin_pos;
49f678e45dSDimitry Andric   }
50f678e45dSDimitry Andric }
51f678e45dSDimitry Andric 
GetString() const52f678e45dSDimitry Andric llvm::StringRef StreamString::GetString() const { return m_packet; }
53f678e45dSDimitry Andric 
FillLastLineToColumn(uint32_t column,char fill_char)54f678e45dSDimitry Andric void StreamString::FillLastLineToColumn(uint32_t column, char fill_char) {
55f678e45dSDimitry Andric   const size_t length = m_packet.size();
56f678e45dSDimitry Andric   size_t last_line_begin_pos = m_packet.find_last_of("\r\n");
57f678e45dSDimitry Andric   if (last_line_begin_pos == std::string::npos) {
58f678e45dSDimitry Andric     last_line_begin_pos = 0;
59f678e45dSDimitry Andric   } else {
60f678e45dSDimitry Andric     ++last_line_begin_pos;
61f678e45dSDimitry Andric   }
62f678e45dSDimitry Andric 
63f678e45dSDimitry Andric   const size_t line_columns = length - last_line_begin_pos;
64f678e45dSDimitry Andric   if (column > line_columns) {
65f678e45dSDimitry Andric     m_packet.append(column - line_columns, fill_char);
66f678e45dSDimitry Andric   }
67f678e45dSDimitry Andric }
68