1207618Srdivacky//===- circular_raw_ostream.cpp - Implement circular_raw_ostream ----------===//
2201360Srdivacky//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6201360Srdivacky//
7201360Srdivacky//===----------------------------------------------------------------------===//
8201360Srdivacky//
9201360Srdivacky// This implements support for circular buffered streams.
10201360Srdivacky//
11201360Srdivacky//===----------------------------------------------------------------------===//
12201360Srdivacky
13201360Srdivacky#include "llvm/Support/circular_raw_ostream.h"
14201360Srdivacky#include <algorithm>
15201360Srdivackyusing namespace llvm;
16201360Srdivacky
17201360Srdivackyvoid circular_raw_ostream::write_impl(const char *Ptr, size_t Size) {
18201360Srdivacky  if (BufferSize == 0) {
19201360Srdivacky    TheStream->write(Ptr, Size);
20201360Srdivacky    return;
21201360Srdivacky  }
22201360Srdivacky
23201360Srdivacky  // Write into the buffer, wrapping if necessary.
24201360Srdivacky  while (Size != 0) {
25207618Srdivacky    unsigned Bytes =
26207618Srdivacky      std::min(unsigned(Size), unsigned(BufferSize - (Cur - BufferArray)));
27201360Srdivacky    memcpy(Cur, Ptr, Bytes);
28201360Srdivacky    Size -= Bytes;
29201360Srdivacky    Cur += Bytes;
30201360Srdivacky    if (Cur == BufferArray + BufferSize) {
31201360Srdivacky      // Reset the output pointer to the start of the buffer.
32201360Srdivacky      Cur = BufferArray;
33201360Srdivacky      Filled = true;
34201360Srdivacky    }
35341825Sdim  }
36201360Srdivacky}
37201360Srdivacky
38207618Srdivackyvoid circular_raw_ostream::flushBufferWithBanner() {
39201360Srdivacky  if (BufferSize != 0) {
40201360Srdivacky    // Write out the buffer
41207618Srdivacky    TheStream->write(Banner, std::strlen(Banner));
42201360Srdivacky    flushBuffer();
43201360Srdivacky  }
44201360Srdivacky}
45