• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
write_impl(const char * Ptr,size_t Size)18 void circular_raw_ostream::write_impl(const char *Ptr, size_t Size) {
19   if (BufferSize == 0) {
20     TheStream->write(Ptr, Size);
21     return;
22   }
23 
24   // Write into the buffer, wrapping if necessary.
25   while (Size != 0) {
26     unsigned Bytes =
27       std::min(unsigned(Size), unsigned(BufferSize - (Cur - BufferArray)));
28     memcpy(Cur, Ptr, Bytes);
29     Size -= Bytes;
30     Cur += Bytes;
31     if (Cur == BufferArray + BufferSize) {
32       // Reset the output pointer to the start of the buffer.
33       Cur = BufferArray;
34       Filled = true;
35     }
36   }
37 }
38 
flushBufferWithBanner()39 void circular_raw_ostream::flushBufferWithBanner() {
40   if (BufferSize != 0) {
41     // Write out the buffer
42     TheStream->write(Banner, std::strlen(Banner));
43     flushBuffer();
44   }
45 }
46