annotate src/zlib-1.2.8/contrib/iostream/zfstream.cpp @ 43:5ea0608b923f

Current zlib source
author Chris Cannam
date Tue, 18 Oct 2016 14:33:52 +0100
parents
children
rev   line source
Chris@43 1
Chris@43 2 #include "zfstream.h"
Chris@43 3
Chris@43 4 gzfilebuf::gzfilebuf() :
Chris@43 5 file(NULL),
Chris@43 6 mode(0),
Chris@43 7 own_file_descriptor(0)
Chris@43 8 { }
Chris@43 9
Chris@43 10 gzfilebuf::~gzfilebuf() {
Chris@43 11
Chris@43 12 sync();
Chris@43 13 if ( own_file_descriptor )
Chris@43 14 close();
Chris@43 15
Chris@43 16 }
Chris@43 17
Chris@43 18 gzfilebuf *gzfilebuf::open( const char *name,
Chris@43 19 int io_mode ) {
Chris@43 20
Chris@43 21 if ( is_open() )
Chris@43 22 return NULL;
Chris@43 23
Chris@43 24 char char_mode[10];
Chris@43 25 char *p = char_mode;
Chris@43 26
Chris@43 27 if ( io_mode & ios::in ) {
Chris@43 28 mode = ios::in;
Chris@43 29 *p++ = 'r';
Chris@43 30 } else if ( io_mode & ios::app ) {
Chris@43 31 mode = ios::app;
Chris@43 32 *p++ = 'a';
Chris@43 33 } else {
Chris@43 34 mode = ios::out;
Chris@43 35 *p++ = 'w';
Chris@43 36 }
Chris@43 37
Chris@43 38 if ( io_mode & ios::binary ) {
Chris@43 39 mode |= ios::binary;
Chris@43 40 *p++ = 'b';
Chris@43 41 }
Chris@43 42
Chris@43 43 // Hard code the compression level
Chris@43 44 if ( io_mode & (ios::out|ios::app )) {
Chris@43 45 *p++ = '9';
Chris@43 46 }
Chris@43 47
Chris@43 48 // Put the end-of-string indicator
Chris@43 49 *p = '\0';
Chris@43 50
Chris@43 51 if ( (file = gzopen(name, char_mode)) == NULL )
Chris@43 52 return NULL;
Chris@43 53
Chris@43 54 own_file_descriptor = 1;
Chris@43 55
Chris@43 56 return this;
Chris@43 57
Chris@43 58 }
Chris@43 59
Chris@43 60 gzfilebuf *gzfilebuf::attach( int file_descriptor,
Chris@43 61 int io_mode ) {
Chris@43 62
Chris@43 63 if ( is_open() )
Chris@43 64 return NULL;
Chris@43 65
Chris@43 66 char char_mode[10];
Chris@43 67 char *p = char_mode;
Chris@43 68
Chris@43 69 if ( io_mode & ios::in ) {
Chris@43 70 mode = ios::in;
Chris@43 71 *p++ = 'r';
Chris@43 72 } else if ( io_mode & ios::app ) {
Chris@43 73 mode = ios::app;
Chris@43 74 *p++ = 'a';
Chris@43 75 } else {
Chris@43 76 mode = ios::out;
Chris@43 77 *p++ = 'w';
Chris@43 78 }
Chris@43 79
Chris@43 80 if ( io_mode & ios::binary ) {
Chris@43 81 mode |= ios::binary;
Chris@43 82 *p++ = 'b';
Chris@43 83 }
Chris@43 84
Chris@43 85 // Hard code the compression level
Chris@43 86 if ( io_mode & (ios::out|ios::app )) {
Chris@43 87 *p++ = '9';
Chris@43 88 }
Chris@43 89
Chris@43 90 // Put the end-of-string indicator
Chris@43 91 *p = '\0';
Chris@43 92
Chris@43 93 if ( (file = gzdopen(file_descriptor, char_mode)) == NULL )
Chris@43 94 return NULL;
Chris@43 95
Chris@43 96 own_file_descriptor = 0;
Chris@43 97
Chris@43 98 return this;
Chris@43 99
Chris@43 100 }
Chris@43 101
Chris@43 102 gzfilebuf *gzfilebuf::close() {
Chris@43 103
Chris@43 104 if ( is_open() ) {
Chris@43 105
Chris@43 106 sync();
Chris@43 107 gzclose( file );
Chris@43 108 file = NULL;
Chris@43 109
Chris@43 110 }
Chris@43 111
Chris@43 112 return this;
Chris@43 113
Chris@43 114 }
Chris@43 115
Chris@43 116 int gzfilebuf::setcompressionlevel( int comp_level ) {
Chris@43 117
Chris@43 118 return gzsetparams(file, comp_level, -2);
Chris@43 119
Chris@43 120 }
Chris@43 121
Chris@43 122 int gzfilebuf::setcompressionstrategy( int comp_strategy ) {
Chris@43 123
Chris@43 124 return gzsetparams(file, -2, comp_strategy);
Chris@43 125
Chris@43 126 }
Chris@43 127
Chris@43 128
Chris@43 129 streampos gzfilebuf::seekoff( streamoff off, ios::seek_dir dir, int which ) {
Chris@43 130
Chris@43 131 return streampos(EOF);
Chris@43 132
Chris@43 133 }
Chris@43 134
Chris@43 135 int gzfilebuf::underflow() {
Chris@43 136
Chris@43 137 // If the file hasn't been opened for reading, error.
Chris@43 138 if ( !is_open() || !(mode & ios::in) )
Chris@43 139 return EOF;
Chris@43 140
Chris@43 141 // if a buffer doesn't exists, allocate one.
Chris@43 142 if ( !base() ) {
Chris@43 143
Chris@43 144 if ( (allocate()) == EOF )
Chris@43 145 return EOF;
Chris@43 146 setp(0,0);
Chris@43 147
Chris@43 148 } else {
Chris@43 149
Chris@43 150 if ( in_avail() )
Chris@43 151 return (unsigned char) *gptr();
Chris@43 152
Chris@43 153 if ( out_waiting() ) {
Chris@43 154 if ( flushbuf() == EOF )
Chris@43 155 return EOF;
Chris@43 156 }
Chris@43 157
Chris@43 158 }
Chris@43 159
Chris@43 160 // Attempt to fill the buffer.
Chris@43 161
Chris@43 162 int result = fillbuf();
Chris@43 163 if ( result == EOF ) {
Chris@43 164 // disable get area
Chris@43 165 setg(0,0,0);
Chris@43 166 return EOF;
Chris@43 167 }
Chris@43 168
Chris@43 169 return (unsigned char) *gptr();
Chris@43 170
Chris@43 171 }
Chris@43 172
Chris@43 173 int gzfilebuf::overflow( int c ) {
Chris@43 174
Chris@43 175 if ( !is_open() || !(mode & ios::out) )
Chris@43 176 return EOF;
Chris@43 177
Chris@43 178 if ( !base() ) {
Chris@43 179 if ( allocate() == EOF )
Chris@43 180 return EOF;
Chris@43 181 setg(0,0,0);
Chris@43 182 } else {
Chris@43 183 if (in_avail()) {
Chris@43 184 return EOF;
Chris@43 185 }
Chris@43 186 if (out_waiting()) {
Chris@43 187 if (flushbuf() == EOF)
Chris@43 188 return EOF;
Chris@43 189 }
Chris@43 190 }
Chris@43 191
Chris@43 192 int bl = blen();
Chris@43 193 setp( base(), base() + bl);
Chris@43 194
Chris@43 195 if ( c != EOF ) {
Chris@43 196
Chris@43 197 *pptr() = c;
Chris@43 198 pbump(1);
Chris@43 199
Chris@43 200 }
Chris@43 201
Chris@43 202 return 0;
Chris@43 203
Chris@43 204 }
Chris@43 205
Chris@43 206 int gzfilebuf::sync() {
Chris@43 207
Chris@43 208 if ( !is_open() )
Chris@43 209 return EOF;
Chris@43 210
Chris@43 211 if ( out_waiting() )
Chris@43 212 return flushbuf();
Chris@43 213
Chris@43 214 return 0;
Chris@43 215
Chris@43 216 }
Chris@43 217
Chris@43 218 int gzfilebuf::flushbuf() {
Chris@43 219
Chris@43 220 int n;
Chris@43 221 char *q;
Chris@43 222
Chris@43 223 q = pbase();
Chris@43 224 n = pptr() - q;
Chris@43 225
Chris@43 226 if ( gzwrite( file, q, n) < n )
Chris@43 227 return EOF;
Chris@43 228
Chris@43 229 setp(0,0);
Chris@43 230
Chris@43 231 return 0;
Chris@43 232
Chris@43 233 }
Chris@43 234
Chris@43 235 int gzfilebuf::fillbuf() {
Chris@43 236
Chris@43 237 int required;
Chris@43 238 char *p;
Chris@43 239
Chris@43 240 p = base();
Chris@43 241
Chris@43 242 required = blen();
Chris@43 243
Chris@43 244 int t = gzread( file, p, required );
Chris@43 245
Chris@43 246 if ( t <= 0) return EOF;
Chris@43 247
Chris@43 248 setg( base(), base(), base()+t);
Chris@43 249
Chris@43 250 return t;
Chris@43 251
Chris@43 252 }
Chris@43 253
Chris@43 254 gzfilestream_common::gzfilestream_common() :
Chris@43 255 ios( gzfilestream_common::rdbuf() )
Chris@43 256 { }
Chris@43 257
Chris@43 258 gzfilestream_common::~gzfilestream_common()
Chris@43 259 { }
Chris@43 260
Chris@43 261 void gzfilestream_common::attach( int fd, int io_mode ) {
Chris@43 262
Chris@43 263 if ( !buffer.attach( fd, io_mode) )
Chris@43 264 clear( ios::failbit | ios::badbit );
Chris@43 265 else
Chris@43 266 clear();
Chris@43 267
Chris@43 268 }
Chris@43 269
Chris@43 270 void gzfilestream_common::open( const char *name, int io_mode ) {
Chris@43 271
Chris@43 272 if ( !buffer.open( name, io_mode ) )
Chris@43 273 clear( ios::failbit | ios::badbit );
Chris@43 274 else
Chris@43 275 clear();
Chris@43 276
Chris@43 277 }
Chris@43 278
Chris@43 279 void gzfilestream_common::close() {
Chris@43 280
Chris@43 281 if ( !buffer.close() )
Chris@43 282 clear( ios::failbit | ios::badbit );
Chris@43 283
Chris@43 284 }
Chris@43 285
Chris@43 286 gzfilebuf *gzfilestream_common::rdbuf()
Chris@43 287 {
Chris@43 288 return &buffer;
Chris@43 289 }
Chris@43 290
Chris@43 291 gzifstream::gzifstream() :
Chris@43 292 ios( gzfilestream_common::rdbuf() )
Chris@43 293 {
Chris@43 294 clear( ios::badbit );
Chris@43 295 }
Chris@43 296
Chris@43 297 gzifstream::gzifstream( const char *name, int io_mode ) :
Chris@43 298 ios( gzfilestream_common::rdbuf() )
Chris@43 299 {
Chris@43 300 gzfilestream_common::open( name, io_mode );
Chris@43 301 }
Chris@43 302
Chris@43 303 gzifstream::gzifstream( int fd, int io_mode ) :
Chris@43 304 ios( gzfilestream_common::rdbuf() )
Chris@43 305 {
Chris@43 306 gzfilestream_common::attach( fd, io_mode );
Chris@43 307 }
Chris@43 308
Chris@43 309 gzifstream::~gzifstream() { }
Chris@43 310
Chris@43 311 gzofstream::gzofstream() :
Chris@43 312 ios( gzfilestream_common::rdbuf() )
Chris@43 313 {
Chris@43 314 clear( ios::badbit );
Chris@43 315 }
Chris@43 316
Chris@43 317 gzofstream::gzofstream( const char *name, int io_mode ) :
Chris@43 318 ios( gzfilestream_common::rdbuf() )
Chris@43 319 {
Chris@43 320 gzfilestream_common::open( name, io_mode );
Chris@43 321 }
Chris@43 322
Chris@43 323 gzofstream::gzofstream( int fd, int io_mode ) :
Chris@43 324 ios( gzfilestream_common::rdbuf() )
Chris@43 325 {
Chris@43 326 gzfilestream_common::attach( fd, io_mode );
Chris@43 327 }
Chris@43 328
Chris@43 329 gzofstream::~gzofstream() { }