1207618Srdivacky//===- circular_raw_ostream.cpp - Implement circular_raw_ostream ----------===// 2201360Srdivacky// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6201360Srdivacky// 7201360Srdivacky//===----------------------------------------------------------------------===// 8201360Srdivacky// 9201360Srdivacky// This implements support for circular buffered streams. 10201360Srdivacky// 11201360Srdivacky//===----------------------------------------------------------------------===// 12201360Srdivacky 13201360Srdivacky#include "llvm/Support/circular_raw_ostream.h" 14201360Srdivacky#include <algorithm> 15201360Srdivackyusing namespace llvm; 16201360Srdivacky 17201360Srdivackyvoid circular_raw_ostream::write_impl(const char *Ptr, size_t Size) { 18201360Srdivacky if (BufferSize == 0) { 19201360Srdivacky TheStream->write(Ptr, Size); 20201360Srdivacky return; 21201360Srdivacky } 22201360Srdivacky 23201360Srdivacky // Write into the buffer, wrapping if necessary. 24201360Srdivacky while (Size != 0) { 25207618Srdivacky unsigned Bytes = 26207618Srdivacky std::min(unsigned(Size), unsigned(BufferSize - (Cur - BufferArray))); 27201360Srdivacky memcpy(Cur, Ptr, Bytes); 28201360Srdivacky Size -= Bytes; 29201360Srdivacky Cur += Bytes; 30201360Srdivacky if (Cur == BufferArray + BufferSize) { 31201360Srdivacky // Reset the output pointer to the start of the buffer. 32201360Srdivacky Cur = BufferArray; 33201360Srdivacky Filled = true; 34201360Srdivacky } 35341825Sdim } 36201360Srdivacky} 37201360Srdivacky 38207618Srdivackyvoid circular_raw_ostream::flushBufferWithBanner() { 39201360Srdivacky if (BufferSize != 0) { 40201360Srdivacky // Write out the buffer 41207618Srdivacky TheStream->write(Banner, std::strlen(Banner)); 42201360Srdivacky flushBuffer(); 43201360Srdivacky } 44201360Srdivacky} 45