45 lines · cpp
1//===- circular_raw_ostream.cpp - Implement circular_raw_ostream ----------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This implements support for circular buffered streams.10//11//===----------------------------------------------------------------------===//12 13#include "llvm/Support/circular_raw_ostream.h"14#include <algorithm>15using namespace llvm;16 17void circular_raw_ostream::write_impl(const char *Ptr, size_t Size) {18 if (BufferSize == 0) {19 TheStream->write(Ptr, Size);20 return;21 }22 23 // Write into the buffer, wrapping if necessary.24 while (Size != 0) {25 unsigned Bytes =26 std::min(unsigned(Size), unsigned(BufferSize - (Cur - BufferArray)));27 memcpy(Cur, Ptr, Bytes);28 Size -= Bytes;29 Cur += Bytes;30 if (Cur == BufferArray + BufferSize) {31 // Reset the output pointer to the start of the buffer.32 Cur = BufferArray;33 Filled = true;34 }35 }36}37 38void circular_raw_ostream::flushBufferWithBanner() {39 if (BufferSize != 0) {40 // Write out the buffer41 TheStream->write(Banner, std::strlen(Banner));42 flushBuffer();43 }44}45