raw_ostream.h revision e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056
148534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar//===--- raw_ostream.h - Raw output stream ----------------------*- C++ -*-===// 260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// 360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// The LLVM Compiler Infrastructure 460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// 560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// This file is distributed under the University of Illinois Open Source 660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// License. See LICENSE.TXT for details. 760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// 860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//===----------------------------------------------------------------------===// 960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// 1060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// This file defines the raw_ostream class. 1160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// 1260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//===----------------------------------------------------------------------===// 1360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner 1460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#ifndef LLVM_SUPPORT_RAW_OSTREAM_H 1560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#define LLVM_SUPPORT_RAW_OSTREAM_H 1660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner 17cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson#include "llvm/ADT/StringExtras.h" 18b6c8a4098fd23c21d6cda33b09b99b5a0ac1e13fNick Lewycky#include <cassert> 19b6c8a4098fd23c21d6cda33b09b99b5a0ac1e13fNick Lewycky#include <cstring> 2060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#include <string> 2107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner#include <iosfwd> 2260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner 2360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnernamespace llvm { 24097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner class format_object_base; 2578a2812538d871a62d90f53ed66d26198876d011Chris Lattner template <typename T> 2678a2812538d871a62d90f53ed66d26198876d011Chris Lattner class SmallVectorImpl; 27fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 2860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// raw_ostream - This class implements an extremely fast bulk output stream 2960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// that can *only* output to a stream. It does not support seeking, reopening, 3060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// rewinding, line buffered disciplines etc. It is a simple buffer that outputs 3160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// a chunk at a time. 3260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_ostream { 3389a66a96fed75796bc5e079217130b62105cb438Daniel Dunbarprivate: 34d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// The buffer is handled in such a way that the buffer is 35d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// uninitialized, unbuffered, or out of space when OutBufCur >= 36d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// OutBufEnd. Thus a single comparison suffices to determine if we 37d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// need to take the slow path to write a single character. 38d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// 39d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// The buffer is in one of three states: 40d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// 1. Unbuffered (Unbuffered == true) 41d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// 1. Uninitialized (Unbuffered == false && OutBufStart == 0). 42d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// 2. Buffered (Unbuffered == false && OutBufStart != 0 && 43d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// OutBufEnd - OutBufStart >= 64). 4460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner char *OutBufStart, *OutBufEnd, *OutBufCur; 45e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar bool Unbuffered; 46e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar 4760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic: 48e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin // color order matches ANSI escape sequence, don't change 49e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin enum Colors { 50e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin BLACK=0, 51e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin RED, 52e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin GREEN, 53e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin YELLOW, 54e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin BLUE, 55e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin MAGENTA, 56e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin CYAN, 57e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin WHITE, 58e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin SAVEDCOLOR 59e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin }; 60e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin 617f3030c471d32d56c1429c8d3c331306e39a2570Dan Gohman explicit raw_ostream(bool unbuffered=false) : Unbuffered(unbuffered) { 6260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner // Start out ready to flush. 6360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner OutBufStart = OutBufEnd = OutBufCur = 0; 6460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner } 655b8dbf839ba8f586e2823744dc695acf57480c5fNuno Lopes 665b8dbf839ba8f586e2823744dc695acf57480c5fNuno Lopes virtual ~raw_ostream() { 675b8dbf839ba8f586e2823744dc695acf57480c5fNuno Lopes delete [] OutBufStart; 685b8dbf839ba8f586e2823744dc695acf57480c5fNuno Lopes } 69fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 708f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// tell - Return the current offset with the file. 718f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor uint64_t tell() { return current_pos() + GetNumBytesInBuffer(); } 728f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 7360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner //===--------------------------------------------------------------------===// 7460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner // Configuration Interface 7560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner //===--------------------------------------------------------------------===// 76fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 7760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner /// SetBufferSize - Set the internal buffer size to the specified amount 7860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner /// instead of the default. 79d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar void SetBufferSize(unsigned Size=4096) { 8060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner assert(Size >= 64 && 8160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner "Buffer size must be somewhat large for invariants to hold"); 8260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner flush(); 83fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 8460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner delete [] OutBufStart; 8560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner OutBufStart = new char[Size]; 8660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner OutBufEnd = OutBufStart+Size; 8760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner OutBufCur = OutBufStart; 88d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar Unbuffered = false; 8960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner } 90fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 91e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar /// SetUnbuffered - Set the streams buffering status. When 92e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar /// unbuffered the stream will flush after every write. This routine 93e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar /// will also flush the buffer immediately when the stream is being 94e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar /// set to unbuffered. 95d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar void SetUnbuffered() { 96d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar flush(); 97d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar 98d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar delete [] OutBufStart; 99d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar OutBufStart = OutBufEnd = OutBufCur = 0; 100d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar Unbuffered = true; 101e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar } 102e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar 10389a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar unsigned GetNumBytesInBuffer() const { 10489a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar return OutBufCur - OutBufStart; 10589a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar } 10689a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar 10760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner //===--------------------------------------------------------------------===// 10860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner // Data Output Interface 10960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner //===--------------------------------------------------------------------===// 110fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 11160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner void flush() { 11260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner if (OutBufCur != OutBufStart) 113cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar flush_nonempty(); 11460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner } 115fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 116f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray raw_ostream &operator<<(char C) { 117f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray if (OutBufCur >= OutBufEnd) 118de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar return write(C); 119f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray *OutBufCur++ = C; 120f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray return *this; 121f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray } 122fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 1231f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson raw_ostream &operator<<(unsigned char C) { 1241f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson if (OutBufCur >= OutBufEnd) 125de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar return write(C); 1261f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson *OutBufCur++ = C; 1271f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson return *this; 1281f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson } 129fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 1301f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson raw_ostream &operator<<(signed char C) { 13160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner if (OutBufCur >= OutBufEnd) 132de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar return write(C); 13360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner *OutBufCur++ = C; 13460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner return *this; 13560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner } 136fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 13760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner raw_ostream &operator<<(const char *Str) { 13838f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar // Inline fast path, particulary for constant strings where a 13938f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar // sufficiently smart compiler will simplify strlen. 14038f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar 14138f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar unsigned Size = strlen(Str); 14238f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar 14338f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar // Make sure we can use the fast path. 14438f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar if (OutBufCur+Size > OutBufEnd) 14538f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar return write(Str, Size); 14638f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar 14738f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar memcpy(OutBufCur, Str, Size); 14838f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar OutBufCur += Size; 149c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar return *this; 15060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner } 151fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 152cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson raw_ostream &operator<<(const std::string& Str) { 153c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar write(Str.data(), Str.length()); 154c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar return *this; 155cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson } 156fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 15766b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson raw_ostream &operator<<(unsigned long N); 15866b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson raw_ostream &operator<<(long N); 15966b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson raw_ostream &operator<<(unsigned long long N); 16066b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson raw_ostream &operator<<(long long N); 161944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner raw_ostream &operator<<(const void *P); 16289a1a85913fb559c7e0266570738fd9cdf616fa3Owen Anderson raw_ostream &operator<<(unsigned int N) { 163c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar this->operator<<(static_cast<unsigned long>(N)); 164c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar return *this; 165cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson } 166fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 16789a1a85913fb559c7e0266570738fd9cdf616fa3Owen Anderson raw_ostream &operator<<(int N) { 168c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar this->operator<<(static_cast<long>(N)); 169c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar return *this; 170cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson } 171afc802dc7d963a2cb46f1b0c1f1b0faa5e1dca2aEli Friedman 172cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson raw_ostream &operator<<(double N) { 173c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar this->operator<<(ftostr(N)); 174c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar return *this; 175cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson } 176fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 177de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar raw_ostream &write(unsigned char C); 17866b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson raw_ostream &write(const char *Ptr, unsigned Size); 179fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 180b2560526d5f6d2f9cc3698244dbb1f4861dc8efcChris Lattner // Formatted output, see the format() function in Support/Format.h. 181097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner raw_ostream &operator<<(const format_object_base &Fmt); 182fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 183e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// Changes the foreground color of text that will be output from this point 184e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// forward. 185e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// @param colors ANSI color to use, the special SAVEDCOLOR can be used to 186e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// change only the bold attribute, and keep colors untouched 187e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// @param bold bold/brighter text, default false 188e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// @param bg if true change the background, default: change foreground 189e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// @returns itself so it can be used within << invocations 190e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin virtual raw_ostream &changeColor(enum Colors colors, bool bold=false, 191e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin bool bg=false) { return *this; } 192e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin 193e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// Resets the colors to terminal defaults. Call this when you are done 194e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// outputting colored text, or before program exit. 195e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin virtual raw_ostream &resetColor() { return *this; } 196e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin 19760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner //===--------------------------------------------------------------------===// 19860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner // Subclass Interface 19960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner //===--------------------------------------------------------------------===// 20060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner 201cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbarprivate: 20289a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar /// write_impl - The is the piece of the class that is implemented 20389a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar /// by subclasses. This writes the \args Size bytes starting at 20489a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar /// \arg Ptr to the underlying stream. 20589a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar /// 20689a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar /// \invariant { Size > 0 } 20789a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar virtual void write_impl(const char *Ptr, unsigned Size) = 0; 208fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 20960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner // An out of line virtual method to provide a home for the class vtable. 21060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner virtual void handle(); 211cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar 2128f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// current_pos - Return the current position within the stream, not 2138f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// counting the bytes currently in the buffer. 2148f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor virtual uint64_t current_pos() = 0; 2158f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 216cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar //===--------------------------------------------------------------------===// 217cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar // Private Interface 218cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar //===--------------------------------------------------------------------===// 219cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbarprivate: 220cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar /// flush_nonempty - Flush the current buffer, which is known to be 221cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar /// non-empty. This outputs the currently buffered data and resets 222cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar /// the buffer to empty. 223cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar void flush_nonempty(); 22460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner}; 225fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 226097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===// 227097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner// File Output Streams 228097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===// 229fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 23060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// raw_fd_ostream - A raw_ostream that writes to a file descriptor. 23160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// 23260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_fd_ostream : public raw_ostream { 23360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner int FD; 23460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner bool ShouldClose; 235d75ba1c3573d3d5146d0abe8cb376dca94be94d5Ted Kremenek uint64_t pos; 23689a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar 23789a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar /// write_impl - See raw_ostream::write_impl. 23889a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar virtual void write_impl(const char *Ptr, unsigned Size); 2398f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 2408f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// current_pos - Return the current position within the stream, not 2418f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// counting the bytes currently in the buffer. 2428f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor virtual uint64_t current_pos() { return pos; } 2438f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 24460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic: 24548534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar /// raw_fd_ostream - Open the specified file for writing. If an 24648534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar /// error occurs, information about the error is put into ErrorInfo, 24748534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar /// and the stream should be immediately destroyed; the string will 24848534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar /// be empty if no error occurred. 2490d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar /// 2500d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar /// \param Filename - The file to open. If this is "-" then the 2510d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar /// stream will use stdout instead. 2520d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar /// \param Binary - The file should be opened in binary mode on 2530d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar /// platforms that support this distinction. 2540d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar raw_fd_ostream(const char *Filename, bool Binary, std::string &ErrorInfo); 255fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 25660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner /// raw_fd_ostream ctor - FD is the file descriptor that this writes to. If 257e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar /// ShouldClose is true, this closes the file when the stream is destroyed. 258e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar raw_fd_ostream(int fd, bool shouldClose, 259e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar bool unbuffered=false) : raw_ostream(unbuffered), FD(fd), 260e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar ShouldClose(shouldClose) {} 261e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar 26260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner ~raw_fd_ostream(); 263fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 26443d1f02b547b146d81abeb0ed0f88628f0fdc7dcTed Kremenek /// close - Manually flush the stream and close the file. 2655984680c1fe7ad98381154c26f9c009e4c91b08cTed Kremenek void close(); 266fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 2675984680c1fe7ad98381154c26f9c009e4c91b08cTed Kremenek /// tell - Return the current offset with the file. 26889a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar uint64_t tell() { return pos + GetNumBytesInBuffer(); } 269fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 2709c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek /// seek - Flushes the stream and repositions the underlying file descriptor 2719c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek /// positition to the offset specified from the beginning of the file. 2729c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek uint64_t seek(uint64_t off); 273e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin 274e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin virtual raw_ostream &changeColor(enum Colors colors, bool bold=false, 275e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin bool bg=false); 276e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin virtual raw_ostream &resetColor(); 27760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner}; 278fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 27907f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_stdout_ostream - This is a stream that always prints to stdout. 28007f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// 28160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_stdout_ostream : public raw_fd_ostream { 28260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner // An out of line virtual method to provide a home for the class vtable. 28360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner virtual void handle(); 28460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic: 28560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner raw_stdout_ostream(); 28660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner}; 28760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner 28807f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_stderr_ostream - This is a stream that always prints to stderr. 28907f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// 29060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_stderr_ostream : public raw_fd_ostream { 29160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner // An out of line virtual method to provide a home for the class vtable. 29260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner virtual void handle(); 29360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic: 29460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner raw_stderr_ostream(); 29560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner}; 296fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 29707f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// outs() - This returns a reference to a raw_ostream for standard output. 29807f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// Use it like: outs() << "foo" << "bar"; 29907f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerraw_ostream &outs(); 30007f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner 30107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// errs() - This returns a reference to a raw_ostream for standard error. 30207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// Use it like: errs() << "foo" << "bar"; 30307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerraw_ostream &errs(); 304fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 305fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 306097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===// 30778a2812538d871a62d90f53ed66d26198876d011Chris Lattner// Output Stream Adaptors 308097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===// 309fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 31007f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_os_ostream - A raw_ostream that writes to an std::ostream. This is a 31107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// simple adaptor class. 31207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerclass raw_os_ostream : public raw_ostream { 31307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner std::ostream &OS; 31489a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar 31589a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar /// write_impl - See raw_ostream::write_impl. 31689a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar virtual void write_impl(const char *Ptr, unsigned Size); 3178f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 3188f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// current_pos - Return the current position within the stream, not 3198f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// counting the bytes currently in the buffer. 3208f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor virtual uint64_t current_pos(); 3218f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 32207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerpublic: 32307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner raw_os_ostream(std::ostream &O) : OS(O) {} 324944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner ~raw_os_ostream(); 3258f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 3268f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// tell - Return the current offset with the stream. 3278f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor uint64_t tell(); 32807f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner}; 32978a2812538d871a62d90f53ed66d26198876d011Chris Lattner 33078a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// raw_string_ostream - A raw_ostream that writes to an std::string. This is a 33178a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// simple adaptor class. 33278a2812538d871a62d90f53ed66d26198876d011Chris Lattnerclass raw_string_ostream : public raw_ostream { 33378a2812538d871a62d90f53ed66d26198876d011Chris Lattner std::string &OS; 33489a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar 33589a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar /// write_impl - See raw_ostream::write_impl. 33689a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar virtual void write_impl(const char *Ptr, unsigned Size); 3378f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 3388f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// current_pos - Return the current position within the stream, not 3398f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// counting the bytes currently in the buffer. 3408f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor virtual uint64_t current_pos() { return OS.size(); } 34178a2812538d871a62d90f53ed66d26198876d011Chris Lattnerpublic: 34278a2812538d871a62d90f53ed66d26198876d011Chris Lattner raw_string_ostream(std::string &O) : OS(O) {} 34378a2812538d871a62d90f53ed66d26198876d011Chris Lattner ~raw_string_ostream(); 344fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 3458f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// tell - Return the current offset with the stream. 3468f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor uint64_t tell() { return OS.size() + GetNumBytesInBuffer(); } 3478f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 3483d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek /// str - Flushes the stream contents to the target string and returns 3494ac67ef47ada2160d2a6f2340743b624c6e16424Ted Kremenek /// the string's reference. 3503d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek std::string& str() { 3513d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek flush(); 3523d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek return OS; 3533d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek } 35478a2812538d871a62d90f53ed66d26198876d011Chris Lattner}; 355fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 35678a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// raw_svector_ostream - A raw_ostream that writes to an SmallVector or 35778a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// SmallString. This is a simple adaptor class. 35878a2812538d871a62d90f53ed66d26198876d011Chris Lattnerclass raw_svector_ostream : public raw_ostream { 35978a2812538d871a62d90f53ed66d26198876d011Chris Lattner SmallVectorImpl<char> &OS; 36089a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar 36189a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar /// write_impl - See raw_ostream::write_impl. 36289a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar virtual void write_impl(const char *Ptr, unsigned Size); 3638f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 3648f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// current_pos - Return the current position within the stream, not 3658f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// counting the bytes currently in the buffer. 3668f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor virtual uint64_t current_pos(); 36778a2812538d871a62d90f53ed66d26198876d011Chris Lattnerpublic: 36878a2812538d871a62d90f53ed66d26198876d011Chris Lattner raw_svector_ostream(SmallVectorImpl<char> &O) : OS(O) {} 36978a2812538d871a62d90f53ed66d26198876d011Chris Lattner ~raw_svector_ostream(); 3708f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 3718f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// tell - Return the current offset with the stream. 3728f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor uint64_t tell(); 37378a2812538d871a62d90f53ed66d26198876d011Chris Lattner}; 374fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 37560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner} // end llvm namespace 37660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner 37760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#endif 378