1888a4282SZachary Turner //===- FormatUtil.cpp ----------------------------------------- *- C++ --*-===//
2888a4282SZachary Turner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6888a4282SZachary Turner //
7888a4282SZachary Turner //===----------------------------------------------------------------------===//
8888a4282SZachary Turner
9888a4282SZachary Turner #include "FormatUtil.h"
10888a4282SZachary Turner #include "llvm/Support/Format.h"
11888a4282SZachary Turner #include "llvm/Support/FormatVariadic.h"
12888a4282SZachary Turner
13888a4282SZachary Turner using namespace lldb_private;
14888a4282SZachary Turner using namespace llvm;
15888a4282SZachary Turner
~Line()16d211d1a5SPavel Labath LinePrinter::Line::~Line() {
17d211d1a5SPavel Labath if (P)
18d211d1a5SPavel Labath P->NewLine();
19d211d1a5SPavel Labath }
20d211d1a5SPavel Labath
LinePrinter(int Indent,llvm::raw_ostream & Stream)21888a4282SZachary Turner LinePrinter::LinePrinter(int Indent, llvm::raw_ostream &Stream)
22888a4282SZachary Turner : OS(Stream), IndentSpaces(Indent), CurrentIndent(0) {}
23888a4282SZachary Turner
Indent(uint32_t Amount)24888a4282SZachary Turner void LinePrinter::Indent(uint32_t Amount) {
25888a4282SZachary Turner if (Amount == 0)
26888a4282SZachary Turner Amount = IndentSpaces;
27888a4282SZachary Turner CurrentIndent += Amount;
28888a4282SZachary Turner }
29888a4282SZachary Turner
Unindent(uint32_t Amount)30888a4282SZachary Turner void LinePrinter::Unindent(uint32_t Amount) {
31888a4282SZachary Turner if (Amount == 0)
32888a4282SZachary Turner Amount = IndentSpaces;
33888a4282SZachary Turner CurrentIndent = std::max<int>(0, CurrentIndent - Amount);
34888a4282SZachary Turner }
35888a4282SZachary Turner
NewLine()36888a4282SZachary Turner void LinePrinter::NewLine() {
37888a4282SZachary Turner OS << "\n";
38888a4282SZachary Turner }
39888a4282SZachary Turner
formatBinary(StringRef Label,ArrayRef<uint8_t> Data,uint32_t StartOffset)40888a4282SZachary Turner void LinePrinter::formatBinary(StringRef Label, ArrayRef<uint8_t> Data,
41888a4282SZachary Turner uint32_t StartOffset) {
42d211d1a5SPavel Labath if (Data.empty()) {
43d211d1a5SPavel Labath line() << Label << " ()";
44d211d1a5SPavel Labath return;
45d211d1a5SPavel Labath }
46d211d1a5SPavel Labath line() << Label << " (";
47888a4282SZachary Turner OS << format_bytes_with_ascii(Data, StartOffset, 32, 4,
48888a4282SZachary Turner CurrentIndent + IndentSpaces, true);
49888a4282SZachary Turner NewLine();
50d211d1a5SPavel Labath line() << ")";
51888a4282SZachary Turner }
52888a4282SZachary Turner
formatBinary(StringRef Label,ArrayRef<uint8_t> Data,uint64_t Base,uint32_t StartOffset)53888a4282SZachary Turner void LinePrinter::formatBinary(StringRef Label, ArrayRef<uint8_t> Data,
54888a4282SZachary Turner uint64_t Base, uint32_t StartOffset) {
55d211d1a5SPavel Labath if (Data.empty()) {
56d211d1a5SPavel Labath line() << Label << " ()";
57d211d1a5SPavel Labath return;
58888a4282SZachary Turner }
59d211d1a5SPavel Labath line() << Label << " (";
60d211d1a5SPavel Labath Base += StartOffset;
61d211d1a5SPavel Labath OS << format_bytes_with_ascii(Data, Base, 32, 4, CurrentIndent + IndentSpaces,
62d211d1a5SPavel Labath true);
63d211d1a5SPavel Labath NewLine();
64d211d1a5SPavel Labath line() << ")";
65888a4282SZachary Turner }
66