00001
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00033
00034 #ifndef GROOVX_RUTZ_STDIOBUF_H_UTC20050626084019_DEFINED
00035 #define GROOVX_RUTZ_STDIOBUF_H_UTC20050626084019_DEFINED
00036
00037 #include <cstdio>
00038 #include <streambuf>
00039 #include <istream>
00040
00041 namespace rutz
00042 {
00043 class stdiobuf;
00044 class stdiostream;
00045 }
00046
00048 class rutz::stdiobuf : public std::streambuf
00049 {
00050 private:
00051 int m_mode;
00052 int m_filedes;
00053
00054 stdiobuf(const stdiobuf&);
00055 stdiobuf& operator=(const stdiobuf&);
00056
00057 static const int s_buf_size = 4092;
00058 static const int s_pback_size = 4;
00059 char buffer[s_buf_size];
00060
00061 void init(int fd, int om, bool throw_exception);
00062
00063 int flushoutput();
00064
00065 public:
00067
00070 stdiobuf(FILE* f, int om, bool throw_exception=false);
00071
00073
00076 stdiobuf(int fd, int om, bool throw_exception=false);
00077
00079 ~stdiobuf() { close(); }
00080
00082 bool is_open() const { return m_filedes >= 0; }
00083
00085
00088 void close();
00089
00091
00092 virtual int underflow();
00093
00095
00096 virtual int overflow(int c);
00097
00099 virtual int sync();
00100 };
00101
00102 class rutz::stdiostream : public std::iostream
00103 {
00104 private:
00105 rutz::stdiobuf m_buf;
00106
00107 public:
00109
00112 stdiostream(FILE* f, int om, bool throw_exception=false) :
00113 std::iostream(0),
00114 m_buf(f, om, throw_exception)
00115 {
00116 rdbuf(&m_buf);
00117 }
00118
00120
00123 stdiostream(int fd, int om, bool throw_exception=false) :
00124 std::iostream(0),
00125 m_buf(fd, om, throw_exception)
00126 {
00127 rdbuf(&m_buf);
00128 }
00129
00131 bool is_open() const { return m_buf.is_open(); }
00132
00134 void close() { m_buf.close(); }
00135 };
00136
00137 static const char __attribute__((used)) vcid_groovx_rutz_stdiobuf_h_utc20050626084019[] = "$Id: stdiobuf.h 10065 2007-04-12 05:54:56Z rjpeters $ $HeadURL: file:
00138 #endif // !GROOVX_RUTZ_STDIOBUF_H_UTC20050626084019_DEFINED