annotate src/zlib-1.2.7/contrib/iostream/zfstream.cpp @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
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() { }