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 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 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