circular_raw_ostream.cpp revision e264f62ca09a8f65c87a46d562a4d0f9ec5d457e
1//===- circulat_raw_ostream.cpp - Implement the circular_raw_ostream class -===//
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
16#include <algorithm>
17
18using namespace llvm;
19
20void circular_raw_ostream::write_impl(const char *Ptr, size_t Size) {
21  if (BufferSize == 0) {
22    TheStream->write(Ptr, Size);
23    return;
24  }
25
26  // Write into the buffer, wrapping if necessary.
27  while (Size != 0) {
28    unsigned Bytes = std::min(Size, BufferSize - (Cur - BufferArray));
29    memcpy(Cur, Ptr, Bytes);
30    Size -= Bytes;
31    Cur += Bytes;
32    if (Cur == BufferArray + BufferSize) {
33      // Reset the output pointer to the start of the buffer.
34      Cur = BufferArray;
35      Filled = true;
36    }
37  }
38}
39
40void circular_raw_ostream::flushBufferWithBanner(void) {
41  if (BufferSize != 0) {
42    // Write out the buffer
43    int num = std::strlen(Banner);
44    TheStream->write(Banner, num);
45    flushBuffer();
46  }
47}
48