//===-- StreamString.cpp ----------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lldb/Utility/StreamString.h"

using namespace lldb;
using namespace lldb_private;

StreamString::StreamString() : Stream(0, 4, eByteOrderBig) {}

StreamString::StreamString(uint32_t flags, uint32_t addr_size,
                           ByteOrder byte_order)
    : Stream(flags, addr_size, byte_order), m_packet() {}

StreamString::~StreamString() {}

void StreamString::Flush() {
  // Nothing to do when flushing a buffer based stream...
}

size_t StreamString::WriteImpl(const void *s, size_t length) {
  m_packet.append(reinterpret_cast<const char *>(s), length);
  return length;
}

void StreamString::Clear() {
  m_packet.clear();
  m_bytes_written = 0;
}

bool StreamString::Empty() const { return GetSize() == 0; }

size_t StreamString::GetSize() const { return m_packet.size(); }

size_t StreamString::GetSizeOfLastLine() const {
  const size_t length = m_packet.size();
  size_t last_line_begin_pos = m_packet.find_last_of("\r\n");
  if (last_line_begin_pos == std::string::npos) {
    return length;
  } else {
    ++last_line_begin_pos;
    return length - last_line_begin_pos;
  }
}

llvm::StringRef StreamString::GetString() const { return m_packet; }

void StreamString::FillLastLineToColumn(uint32_t column, char fill_char) {
  const size_t length = m_packet.size();
  size_t last_line_begin_pos = m_packet.find_last_of("\r\n");
  if (last_line_begin_pos == std::string::npos) {
    last_line_begin_pos = 0;
  } else {
    ++last_line_begin_pos;
  }

  const size_t line_columns = length - last_line_begin_pos;
  if (column > line_columns) {
    m_packet.append(column - line_columns, fill_char);
  }
}
