Simple output re-direction by redefining `overflow'
===================================================
Suppose you have a function `write_to_window' that writes characters
to a `window' object. If you want to use the ostream function to write
to it, here is one (portable) way to do it. This depends on the
default buffering (if any).
#include <iostream.h>
/* Returns number of characters successfully written to WIN. */
extern int write_to_window (window* win, char* text, int length);
class windowbuf : public streambuf {
window* win;
public:
windowbuf (window* w) { win = w; }
int sync ();
int overflow (int ch);
// Defining xsputn is an optional optimization.
// (streamsize was recently added to ANSI C++, not portable yet.)
streamsize xsputn (char* text, streamsize n);
};
int windowbuf::sync ()
{ streamsize n = pptr () - pbase ();
return (n && write_to_window (win, pbase (), n) != n) ? EOF : 0;
}
int windowbuf::overflow (int ch)
{ streamsize n = pptr () - pbase ();
if (n && sync ())
return EOF;
if (ch != EOF)
{
char cbuf[1];
cbuf[0] = ch;
if (write_to_window (win, cbuf, 1) != 1)
return EOF;
}
pbump (-n); // Reset pptr().
return 0;
}
streamsize windowbuf::xsputn (char* text, streamsize n)
{ return sync () == EOF ? 0 : write_to_window (win, text, n); }
int
main (int argc, char**argv)
{
window *win = ...;
windowbuf wbuf(win);
ostream wstr(&wbuf);
wstr << "Hello world!\n";
}