1*061da546Spatrick //===- FormatUtil.cpp ----------------------------------------- *- C++ --*-===//
2*061da546Spatrick //
3*061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*061da546Spatrick //
7*061da546Spatrick //===----------------------------------------------------------------------===//
8*061da546Spatrick
9*061da546Spatrick #include "FormatUtil.h"
10*061da546Spatrick #include "llvm/Support/Format.h"
11*061da546Spatrick #include "llvm/Support/FormatVariadic.h"
12*061da546Spatrick
13*061da546Spatrick using namespace lldb_private;
14*061da546Spatrick using namespace llvm;
15*061da546Spatrick
~Line()16*061da546Spatrick LinePrinter::Line::~Line() {
17*061da546Spatrick if (P)
18*061da546Spatrick P->NewLine();
19*061da546Spatrick }
20*061da546Spatrick
LinePrinter(int Indent,llvm::raw_ostream & Stream)21*061da546Spatrick LinePrinter::LinePrinter(int Indent, llvm::raw_ostream &Stream)
22*061da546Spatrick : OS(Stream), IndentSpaces(Indent), CurrentIndent(0) {}
23*061da546Spatrick
Indent(uint32_t Amount)24*061da546Spatrick void LinePrinter::Indent(uint32_t Amount) {
25*061da546Spatrick if (Amount == 0)
26*061da546Spatrick Amount = IndentSpaces;
27*061da546Spatrick CurrentIndent += Amount;
28*061da546Spatrick }
29*061da546Spatrick
Unindent(uint32_t Amount)30*061da546Spatrick void LinePrinter::Unindent(uint32_t Amount) {
31*061da546Spatrick if (Amount == 0)
32*061da546Spatrick Amount = IndentSpaces;
33*061da546Spatrick CurrentIndent = std::max<int>(0, CurrentIndent - Amount);
34*061da546Spatrick }
35*061da546Spatrick
NewLine()36*061da546Spatrick void LinePrinter::NewLine() {
37*061da546Spatrick OS << "\n";
38*061da546Spatrick }
39*061da546Spatrick
formatBinary(StringRef Label,ArrayRef<uint8_t> Data,uint32_t StartOffset)40*061da546Spatrick void LinePrinter::formatBinary(StringRef Label, ArrayRef<uint8_t> Data,
41*061da546Spatrick uint32_t StartOffset) {
42*061da546Spatrick if (Data.empty()) {
43*061da546Spatrick line() << Label << " ()";
44*061da546Spatrick return;
45*061da546Spatrick }
46*061da546Spatrick line() << Label << " (";
47*061da546Spatrick OS << format_bytes_with_ascii(Data, StartOffset, 32, 4,
48*061da546Spatrick CurrentIndent + IndentSpaces, true);
49*061da546Spatrick NewLine();
50*061da546Spatrick line() << ")";
51*061da546Spatrick }
52*061da546Spatrick
formatBinary(StringRef Label,ArrayRef<uint8_t> Data,uint64_t Base,uint32_t StartOffset)53*061da546Spatrick void LinePrinter::formatBinary(StringRef Label, ArrayRef<uint8_t> Data,
54*061da546Spatrick uint64_t Base, uint32_t StartOffset) {
55*061da546Spatrick if (Data.empty()) {
56*061da546Spatrick line() << Label << " ()";
57*061da546Spatrick return;
58*061da546Spatrick }
59*061da546Spatrick line() << Label << " (";
60*061da546Spatrick Base += StartOffset;
61*061da546Spatrick OS << format_bytes_with_ascii(Data, Base, 32, 4, CurrentIndent + IndentSpaces,
62*061da546Spatrick true);
63*061da546Spatrick NewLine();
64*061da546Spatrick line() << ")";
65*061da546Spatrick }
66