1207618Srdivacky//===- circular_raw_ostream.cpp - Implement circular_raw_ostream ----------===//
2201360Srdivacky//
3201360Srdivacky//                     The LLVM Compiler Infrastructure
4201360Srdivacky//
5201360Srdivacky// This file is distributed under the University of Illinois Open Source
6201360Srdivacky// License. See LICENSE.TXT for details.
7201360Srdivacky//
8201360Srdivacky//===----------------------------------------------------------------------===//
9201360Srdivacky//
10201360Srdivacky// This implements support for circular buffered streams.
11201360Srdivacky//
12201360Srdivacky//===----------------------------------------------------------------------===//
13201360Srdivacky
14201360Srdivacky#include "llvm/Support/circular_raw_ostream.h"
15201360Srdivacky#include <algorithm>
16201360Srdivackyusing namespace llvm;
17201360Srdivacky
18201360Srdivackyvoid circular_raw_ostream::write_impl(const char *Ptr, size_t Size) {
19201360Srdivacky  if (BufferSize == 0) {
20201360Srdivacky    TheStream->write(Ptr, Size);
21201360Srdivacky    return;
22201360Srdivacky  }
23201360Srdivacky
24201360Srdivacky  // Write into the buffer, wrapping if necessary.
25201360Srdivacky  while (Size != 0) {
26207618Srdivacky    unsigned Bytes =
27207618Srdivacky      std::min(unsigned(Size), unsigned(BufferSize - (Cur - BufferArray)));
28201360Srdivacky    memcpy(Cur, Ptr, Bytes);
29201360Srdivacky    Size -= Bytes;
30201360Srdivacky    Cur += Bytes;
31201360Srdivacky    if (Cur == BufferArray + BufferSize) {
32201360Srdivacky      // Reset the output pointer to the start of the buffer.
33201360Srdivacky      Cur = BufferArray;
34201360Srdivacky      Filled = true;
35201360Srdivacky    }
36201360Srdivacky  }
37201360Srdivacky}
38201360Srdivacky
39207618Srdivackyvoid circular_raw_ostream::flushBufferWithBanner() {
40201360Srdivacky  if (BufferSize != 0) {
41201360Srdivacky    // Write out the buffer
42207618Srdivacky    TheStream->write(Banner, std::strlen(Banner));
43201360Srdivacky    flushBuffer();
44201360Srdivacky  }
45201360Srdivacky}
46