fdstream.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef BOOST_FDSTREAM_HPP
00023 #define BOOST_FDSTREAM_HPP
00024
00025 #include <istream>
00026 #include <ostream>
00027 #include <streambuf>
00028
00029 #include <cstdio>
00030
00031 #include <cstring>
00032
00033
00034
00035 #ifdef _MSC_VER
00036 # include <io.h>
00037 #else
00038 # include <unistd.h>
00039
00040
00041
00042
00043 #endif
00044
00045
00046
00047 namespace boost {
00048
00049
00050
00051
00052
00053
00054
00055
00056 class fdoutbuf : public std::streambuf {
00057 protected:
00058 int fd;
00059 public:
00060
00061 fdoutbuf (int _fd) : fd(_fd) {
00062 }
00063 protected:
00064
00065 virtual int_type overflow (int_type c) {
00066 if (c != EOF) {
00067 char z = c;
00068 #ifdef _MSC_VER
00069 if (_write (fd, &z, 1) != 1) {
00070 #else
00071 if (write (fd, &z, 1) != 1) {
00072 #endif
00073 return EOF;
00074 }
00075 }
00076 return c;
00077 }
00078
00079 virtual
00080 std::streamsize xsputn (const char* s,
00081 std::streamsize num) {
00082 #ifdef _MSC_VER
00083 return _write(fd,s,num);
00084 #else
00085 return write(fd,s,num);
00086 #endif
00087 }
00088 };
00089
00090 class fdostream : public std::ostream {
00091 protected:
00092 fdoutbuf buf;
00093 public:
00094 fdostream (int fd) : std::ostream(0), buf(fd) {
00095 rdbuf(&buf);
00096 }
00097 };
00098
00099
00100
00101
00102
00103
00104
00105 class fdinbuf : public std::streambuf {
00106 protected:
00107 int fd;
00108 protected:
00109
00110
00111
00112
00113 static const int pbSize = 4;
00114 static const int bufSize = 1024;
00115 char buffer[bufSize+pbSize];
00116
00117 public:
00118
00119
00120
00121
00122
00123
00124 fdinbuf (int _fd) : fd(_fd) {
00125 setg (buffer+pbSize,
00126 buffer+pbSize,
00127 buffer+pbSize);
00128 }
00129
00130 protected:
00131
00132 virtual int_type underflow () {
00133 #ifndef _MSC_VER
00134 using std::memcpy;
00135 #endif
00136
00137
00138 if (gptr() < egptr()) {
00139 return *gptr();
00140 }
00141
00142
00143
00144
00145
00146 int numPutback;
00147 numPutback = gptr() - eback();
00148 if (numPutback > pbSize) {
00149 numPutback = pbSize;
00150 }
00151
00152
00153
00154
00155 memcpy (buffer+(pbSize-numPutback), gptr()-numPutback,
00156 numPutback);
00157
00158
00159 int num;
00160 #ifdef _MSC_VER
00161 num = _read (fd, buffer+pbSize, bufSize);
00162 #else
00163 num = read (fd, buffer+pbSize, bufSize);
00164 #endif
00165 if (num <= 0) {
00166
00167 return EOF;
00168 }
00169
00170
00171 setg (buffer+(pbSize-numPutback),
00172 buffer+pbSize,
00173 buffer+pbSize+num);
00174
00175
00176 return *gptr();
00177 }
00178 };
00179
00180 class fdistream : public std::istream {
00181 protected:
00182 fdinbuf buf;
00183 public:
00184 fdistream (int fd) : std::istream(0), buf(fd) {
00185 rdbuf(&buf);
00186 }
00187 };
00188
00189
00190 }
00191
00192 #endif