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