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"; }