brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.3 KiB · acd2307 Raw
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