annotate src/zlib-1.2.7/contrib/iostream/zfstream.cpp @ 23:619f715526df sv_v2.1

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