From 07f51f788e1dff2982ff0aae7c2ea3d00e48cc61 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 17 Aug 2008 04:13:37 +0000 Subject: [PATCH] add support for a cout/cerr analog (outs()/errs()) as well as a simple adaptor class to give raw output capabilities to something that wants to write to an ostream. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54865 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/raw_ostream.h | 29 +++++++++++++++++++++++++++- lib/Support/raw_ostream.cpp | 31 ++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/include/llvm/Support/raw_ostream.h b/include/llvm/Support/raw_ostream.h index 6d538003fed..34dd052e88c 100644 --- a/include/llvm/Support/raw_ostream.h +++ b/include/llvm/Support/raw_ostream.h @@ -1,4 +1,4 @@ -//===--- raw_ostream.h - Raw output stream ---------------------------------===// +//===--- raw_ostream.h - Raw output stream --------------------------------===// // // The LLVM Compiler Infrastructure // @@ -15,6 +15,7 @@ #define LLVM_SUPPORT_RAW_OSTREAM_H #include +#include namespace llvm { @@ -151,6 +152,8 @@ public: virtual void flush_impl(); }; +/// raw_stdout_ostream - This is a stream that always prints to stdout. +/// class raw_stdout_ostream : public raw_fd_ostream { // An out of line virtual method to provide a home for the class vtable. virtual void handle(); @@ -158,6 +161,8 @@ public: raw_stdout_ostream(); }; +/// raw_stderr_ostream - This is a stream that always prints to stderr. +/// class raw_stderr_ostream : public raw_fd_ostream { // An out of line virtual method to provide a home for the class vtable. virtual void handle(); @@ -165,6 +170,28 @@ public: raw_stderr_ostream(); }; +/// outs() - This returns a reference to a raw_ostream for standard output. +/// Use it like: outs() << "foo" << "bar"; +raw_ostream &outs(); + +/// errs() - This returns a reference to a raw_ostream for standard error. +/// Use it like: errs() << "foo" << "bar"; +raw_ostream &errs(); + + +/// raw_os_ostream - A raw_ostream that writes to an std::ostream. This is a +/// simple adaptor class. +class raw_os_ostream : public raw_ostream { + std::ostream &OS; +public: + raw_os_ostream(std::ostream &O) : OS(O) {} + + /// flush_impl - The is the piece of the class that is implemented by + /// subclasses. This outputs the currently buffered data and resets the + /// buffer to empty. + virtual void flush_impl(); +}; + } // end llvm namespace #endif diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp index a4dc797f01c..96864277170 100644 --- a/lib/Support/raw_ostream.cpp +++ b/lib/Support/raw_ostream.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/raw_ostream.h" +#include using namespace llvm; #if !defined(_MSC_VER) @@ -62,6 +63,9 @@ void raw_fd_ostream::flush_impl() { HandleFlush(); } +//===----------------------------------------------------------------------===// +// raw_stdout/err_ostream +//===----------------------------------------------------------------------===// raw_stdout_ostream::raw_stdout_ostream():raw_fd_ostream(STDOUT_FILENO, false) {} raw_stderr_ostream::raw_stderr_ostream():raw_fd_ostream(STDERR_FILENO, false) {} @@ -69,3 +73,30 @@ raw_stderr_ostream::raw_stderr_ostream():raw_fd_ostream(STDERR_FILENO, false) {} // An out of line virtual method to provide a home for the class vtable. void raw_stdout_ostream::handle() {} void raw_stderr_ostream::handle() {} + +/// outs() - This returns a reference to a raw_ostream for standard output. +/// Use it like: outs() << "foo" << "bar"; +raw_ostream &outs() { + static raw_stdout_ostream S; + return S; +} + +/// errs() - This returns a reference to a raw_ostream for standard error. +/// Use it like: errs() << "foo" << "bar"; +raw_ostream &errs() { + static raw_stderr_ostream S; + return S; +} + +//===----------------------------------------------------------------------===// +// raw_os_ostream +//===----------------------------------------------------------------------===// + +/// flush_impl - The is the piece of the class that is implemented by +/// subclasses. This outputs the currently buffered data and resets the +/// buffer to empty. +void raw_os_ostream::flush_impl() { + if (OutBufCur-OutBufStart) + OS.write(OutBufStart, OutBufCur-OutBufStart); + HandleFlush(); +} -- 2.34.1