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
00027
00028 #include "config.h"
00029
00030 #include "fdiostream.h"
00031 #include <cstring>
00032
00033
00034 #include "debug.h"
00035
00036 namespace libdap {
00037
00044 fdoutbuf::fdoutbuf(int _fd, bool _close) :
00045 fd(_fd), close(_close)
00046 {
00047 setp(buffer, buffer + (bufferSize - 1));
00048 }
00049
00052 fdoutbuf::~fdoutbuf()
00053 {
00054 sync();
00055 if (close)
00056 ::close(fd);
00057 }
00058
00059
00060 int fdoutbuf::flushBuffer()
00061 {
00062 int num = pptr() - pbase();
00063 if (write(1, buffer, num) != num) {
00064 return EOF;
00065 }
00066 pbump(-num);
00067 return num;
00068 }
00069
00071 int fdoutbuf::overflow(int c)
00072 {
00073 if (c != EOF) {
00074 *pptr() = c;
00075 pbump(1);
00076 }
00077
00078 if (flushBuffer() == EOF) {
00079
00080 return EOF;
00081 }
00082
00083 return c;
00084 }
00085
00087 int fdoutbuf::sync()
00088 {
00089 if (flushBuffer() == EOF) {
00090
00091 return -1;
00092 }
00093 return 0;
00094 }
00095
00097 std::streamsize fdoutbuf::xsputn(const char *s, std::streamsize num)
00098 {
00099 return write(fd, s, num);
00100 }
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00159 fdinbuf::fdinbuf(int _fd, bool _close) :
00160 fd(_fd), close(_close)
00161 {
00162 setg(buffer + putBack,
00163 buffer + putBack,
00164 buffer + putBack);
00165 }
00166
00168 fdinbuf::~fdinbuf()
00169 {
00170 if (close)
00171 ::close(fd);
00172 }
00173
00175 int fdinbuf::underflow()
00176 {
00177 if (gptr() < egptr()) {
00178 DBG(std::cerr << "underflow, no read" << std::endl);
00179 return *gptr();
00180 }
00181
00182
00183
00184 int numPutBack = gptr() - eback();
00185 if (numPutBack > putBack)
00186 numPutBack = putBack;
00187
00188
00189
00190
00191
00192
00193 memcpy(buffer + (putBack - numPutBack), gptr() - numPutBack, numPutBack);
00194
00195
00196 int num = read(fd, buffer + putBack, bufferSize - putBack);
00197 DBG(std::cerr << "underflow, read returns: " << num << std::endl);
00198 if (num <= 0) {
00199
00200 return EOF;
00201 }
00202
00203 setg(buffer + (putBack - numPutBack),
00204 buffer + putBack,
00205 buffer + putBack + num);
00206
00207
00208 #ifdef DODS_DEBUG
00209 char c = *gptr();
00210 DBG(std::cerr << "returning :" << c << std::endl);
00211 return c;
00212 #else
00213 return *gptr();
00214 #endif
00215 }
00216
00223 fpinbuf::fpinbuf(FILE *_fp, bool _close) :
00224 fp(_fp), close(_close)
00225 {
00226 setg(buffer + putBack,
00227 buffer + putBack,
00228 buffer + putBack);
00229 }
00230
00232 fpinbuf::~fpinbuf()
00233 {
00234 if (close)
00235 fclose(fp);
00236 }
00237
00239 int fpinbuf::underflow()
00240 {
00241 if (gptr() < egptr()) {
00242 DBG(std::cerr << "underflow, no read" << std::endl);
00243 return *gptr();
00244 }
00245
00246
00247
00248 int numPutBack = gptr() - eback();
00249 if (numPutBack > putBack)
00250 numPutBack = putBack;
00251
00252
00253
00254 memcpy(buffer + (putBack - numPutBack), gptr() - numPutBack, numPutBack);
00255
00256
00257 int num = fread(buffer + putBack, 1, bufferSize - putBack, fp);
00258 DBG(std::cerr << "underflow, read returns: " << num << std::endl);
00259 if (num == 0) {
00260
00261 return EOF;
00262 }
00263
00264 setg(buffer + (putBack - numPutBack),
00265 buffer + putBack,
00266 buffer + putBack + num);
00267
00268
00269 return *gptr();
00270 }
00271
00272 }