17abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao//===- circular_raw_ostream.cpp - Implement circular_raw_ostream ----------===// 2e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 3e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// The LLVM Compiler Infrastructure 4e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 5e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// This file is distributed under the University of Illinois Open Source 6e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// License. See LICENSE.TXT for details. 7e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 8e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===----------------------------------------------------------------------===// 9e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 10e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// This implements support for circular buffered streams. 11e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 12e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===----------------------------------------------------------------------===// 13e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 14e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/Support/circular_raw_ostream.h" 15e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include <algorithm> 16e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaousing namespace llvm; 17e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 18e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaovoid circular_raw_ostream::write_impl(const char *Ptr, size_t Size) { 19e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (BufferSize == 0) { 20e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao TheStream->write(Ptr, Size); 21e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao return; 22e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } 23e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 24e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // Write into the buffer, wrapping if necessary. 25e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao while (Size != 0) { 267abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao unsigned Bytes = 277abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao std::min(unsigned(Size), unsigned(BufferSize - (Cur - BufferArray))); 28e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao memcpy(Cur, Ptr, Bytes); 29e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao Size -= Bytes; 30e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao Cur += Bytes; 31e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (Cur == BufferArray + BufferSize) { 32e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // Reset the output pointer to the start of the buffer. 33e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao Cur = BufferArray; 34e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao Filled = true; 35e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } 36e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } 37e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao} 38e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 397abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaovoid circular_raw_ostream::flushBufferWithBanner() { 40e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (BufferSize != 0) { 41e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // Write out the buffer 427abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao TheStream->write(Banner, std::strlen(Banner)); 43e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao flushBuffer(); 44e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } 45e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao} 46