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