1 //===-- llvm/Support/FormattedStream.h - Formatted streams ------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file contains raw_ostream implementations for streams to do
10 // things like pretty-print comments.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_SUPPORT_FORMATTEDSTREAM_H
15 #define LLVM_SUPPORT_FORMATTEDSTREAM_H
17 #include "llvm/Support/raw_ostream.h"
22 /// formatted_raw_ostream - A raw_ostream that wraps another one and keeps track
23 /// of line and column position, allowing padding out to specific column
24 /// boundaries and querying the number of lines written to the stream.
26 class formatted_raw_ostream
: public raw_ostream
{
27 /// TheStream - The real stream we output to. We set it to be
28 /// unbuffered, since we're already doing our own buffering.
30 raw_ostream
*TheStream
;
32 /// Position - The current output column and line of the data that's
33 /// been flushed and the portion of the buffer that's been
34 /// scanned. The line and column scheme is zero-based.
36 std::pair
<unsigned, unsigned> Position
;
38 /// Scanned - This points to one past the last character in the
39 /// buffer we've scanned.
43 void write_impl(const char *Ptr
, size_t Size
) override
;
45 /// current_pos - Return the current position within the stream,
46 /// not counting the bytes currently in the buffer.
47 uint64_t current_pos() const override
{
48 // Our current position in the stream is all the contents which have been
49 // written to the underlying stream (*not* the current position of the
50 // underlying stream).
51 return TheStream
->tell();
54 /// ComputePosition - Examine the given output buffer and figure out the new
55 /// position after output.
57 void ComputePosition(const char *Ptr
, size_t size
);
59 void setStream(raw_ostream
&Stream
) {
64 // This formatted_raw_ostream inherits from raw_ostream, so it'll do its
65 // own buffering, and it doesn't need or want TheStream to do another
66 // layer of buffering underneath. Resize the buffer to what TheStream
67 // had been using, and tell TheStream not to do its own buffering.
68 if (size_t BufferSize
= TheStream
->GetBufferSize())
69 SetBufferSize(BufferSize
);
72 TheStream
->SetUnbuffered();
78 /// formatted_raw_ostream - Open the specified file for
79 /// writing. If an error occurs, information about the error is
80 /// put into ErrorInfo, and the stream should be immediately
81 /// destroyed; the string will be empty if no error occurred.
83 /// As a side effect, the given Stream is set to be Unbuffered.
84 /// This is because formatted_raw_ostream does its own buffering,
85 /// so it doesn't want another layer of buffering to be happening
88 formatted_raw_ostream(raw_ostream
&Stream
)
89 : TheStream(nullptr), Position(0, 0) {
92 explicit formatted_raw_ostream() : TheStream(nullptr), Position(0, 0) {
96 ~formatted_raw_ostream() override
{
101 /// PadToColumn - Align the output to some column number. If the current
102 /// column is already equal to or more than NewCol, PadToColumn inserts one
105 /// \param NewCol - The column to move to.
106 formatted_raw_ostream
&PadToColumn(unsigned NewCol
);
108 /// getColumn - Return the column number
109 unsigned getColumn() { return Position
.first
; }
111 /// getLine - Return the line number
112 unsigned getLine() { return Position
.second
; }
114 raw_ostream
&resetColor() override
{
115 TheStream
->resetColor();
119 raw_ostream
&reverseColor() override
{
120 TheStream
->reverseColor();
124 raw_ostream
&changeColor(enum Colors Color
, bool Bold
, bool BG
) override
{
125 TheStream
->changeColor(Color
, Bold
, BG
);
129 bool is_displayed() const override
{
130 return TheStream
->is_displayed();
134 void releaseStream() {
135 // Transfer the buffer settings from this raw_ostream back to the underlying
139 if (size_t BufferSize
= GetBufferSize())
140 TheStream
->SetBufferSize(BufferSize
);
142 TheStream
->SetUnbuffered();
146 /// fouts() - This returns a reference to a formatted_raw_ostream for
147 /// standard output. Use it like: fouts() << "foo" << "bar";
148 formatted_raw_ostream
&fouts();
150 /// ferrs() - This returns a reference to a formatted_raw_ostream for
151 /// standard error. Use it like: ferrs() << "foo" << "bar";
152 formatted_raw_ostream
&ferrs();
154 /// fdbgs() - This returns a reference to a formatted_raw_ostream for
155 /// debug output. Use it like: fdbgs() << "foo" << "bar";
156 formatted_raw_ostream
&fdbgs();
158 } // end llvm namespace