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