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> 16using namespace llvm; 17 18void 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 39void 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