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