Line data Source code
1 : //===- circular_raw_ostream.cpp - Implement circular_raw_ostream ----------===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 : //
10 : // This implements support for circular buffered streams.
11 : //
12 : //===----------------------------------------------------------------------===//
13 :
14 : #include "llvm/Support/circular_raw_ostream.h"
15 : #include <algorithm>
16 : using namespace llvm;
17 :
18 0 : void circular_raw_ostream::write_impl(const char *Ptr, size_t Size) {
19 0 : if (BufferSize == 0) {
20 0 : TheStream->write(Ptr, Size);
21 0 : return;
22 : }
23 :
24 : // Write into the buffer, wrapping if necessary.
25 0 : while (Size != 0) {
26 : unsigned Bytes =
27 0 : std::min(unsigned(Size), unsigned(BufferSize - (Cur - BufferArray)));
28 0 : memcpy(Cur, Ptr, Bytes);
29 0 : Size -= Bytes;
30 0 : Cur += Bytes;
31 0 : if (Cur == BufferArray + BufferSize) {
32 : // Reset the output pointer to the start of the buffer.
33 0 : Cur = BufferArray;
34 0 : Filled = true;
35 : }
36 : }
37 : }
38 :
39 0 : void circular_raw_ostream::flushBufferWithBanner() {
40 0 : if (BufferSize != 0) {
41 : // Write out the buffer
42 0 : TheStream->write(Banner, std::strlen(Banner));
43 0 : flushBuffer();
44 : }
45 0 : }
|