better zlib error handling

This commit is contained in:
David Rose 2002-08-06 12:31:32 +00:00
parent a98e2f11d3
commit 26c1015355
2 changed files with 64 additions and 17 deletions

View File

@ -79,11 +79,11 @@ open_read(istream *source, bool owns_source) {
_z_source.zalloc = Z_NULL;
_z_source.zfree = Z_NULL;
_z_source.opaque = Z_NULL;
_z_source.msg = "no error message";
int result = inflateInit(&_z_source);
if (result < 0) {
express_cat.warning()
<< "zlib error " << result << " = " << _z_source.msg << "\n";
show_zlib_error("inflateInit", result, _z_source);
close_read();
}
}
@ -99,8 +99,7 @@ close_read() {
int result = inflateEnd(&_z_source);
if (result < 0) {
express_cat.warning()
<< "zlib error " << result << " = " << _z_source.msg << "\n";
show_zlib_error("inflateEnd", result, _z_source);
}
if (_owns_source) {
@ -124,11 +123,11 @@ open_write(ostream *dest, bool owns_dest, int compression_level) {
_z_dest.zalloc = Z_NULL;
_z_dest.zfree = Z_NULL;
_z_dest.opaque = Z_NULL;
_z_dest.msg = "no error message";
int result = deflateInit(&_z_dest, compression_level);
if (result < 0) {
express_cat.warning()
<< "zlib error " << result << " = " << _z_dest.msg << "\n";
show_zlib_error("deflateInit", result, _z_dest);
close_write();
}
}
@ -147,8 +146,7 @@ close_write() {
int result = deflateEnd(&_z_dest);
if (result < 0) {
express_cat.warning()
<< "zlib error " << result << " = " << _z_dest.msg << "\n";
show_zlib_error("deflateEnd", result, _z_dest);
}
if (_owns_dest) {
@ -272,9 +270,10 @@ read_chars(char *start, size_t length) {
// Here's the end of the file.
return bytes_read;
}
if (result < 0) {
express_cat.warning()
<< "zlib error " << result << " = " << _z_source.msg << "\n";
// It might return Z_BUF_ERROR if we passed in Z_FINISH but not a
// big enough output buffer for everything.
if (result < 0 && result != Z_BUF_ERROR) {
show_zlib_error("inflate", result, _z_source);
return bytes_read;
}
}
@ -301,8 +300,7 @@ write_chars(const char *start, size_t length, int flush) {
int result = deflate(&_z_dest, flush);
if (result < 0 && result != Z_BUF_ERROR) {
express_cat.warning()
<< "zlib error " << result << " = " << _z_dest.msg << "\n";
show_zlib_error("deflate", result, _z_dest);
}
while (_z_dest.avail_in != 0) {
@ -313,8 +311,7 @@ write_chars(const char *start, size_t length, int flush) {
}
result = deflate(&_z_dest, flush);
if (result < 0) {
express_cat.warning()
<< "zlib error " << result << " = " << _z_dest.msg << "\n";
show_zlib_error("deflate", result, _z_dest);
}
}
@ -324,10 +321,59 @@ write_chars(const char *start, size_t length, int flush) {
_z_dest.avail_out = compress_buffer_size;
result = deflate(&_z_dest, flush);
if (result < 0 && result != Z_BUF_ERROR) {
express_cat.warning()
<< "zlib error " << result << " = " << _z_dest.msg << "\n";
show_zlib_error("deflate", result, _z_dest);
}
}
}
////////////////////////////////////////////////////////////////////
// Function: ZStreamBuf::show_zlib_error
// Access: Private
// Description: Reports a recent error code returned by zlib.
////////////////////////////////////////////////////////////////////
void ZStreamBuf::
show_zlib_error(const char *function, int error_code, z_stream &z) {
stringstream error_line;
error_line
<< "zlib error in " << function << ": ";
switch (error_code) {
case Z_OK:
error_line << "Z_OK";
break;
case Z_STREAM_END:
error_line << "Z_STREAM_END";
break;
case Z_NEED_DICT:
error_line << "Z_NEED_DICT";
break;
case Z_ERRNO:
error_line << "Z_ERRNO";
break;
case Z_STREAM_ERROR:
error_line << "Z_STREAM_ERROR";
break;
case Z_DATA_ERROR:
error_line << "Z_DATA_ERROR";
break;
case Z_MEM_ERROR:
error_line << "Z_MEM_ERROR";
break;
case Z_BUF_ERROR:
error_line << "Z_BUF_ERROR";
break;
case Z_VERSION_ERROR:
error_line << "Z_VERSION_ERROR";
break;
default:
error_line << error_code;
}
if (z.msg != (char *)NULL) {
error_line
<< " = " << z.msg;
}
express_cat.warning() << error_line.str() << "\n";
}
#endif // HAVE_ZLIB

View File

@ -50,6 +50,7 @@ protected:
private:
size_t read_chars(char *start, size_t length);
void write_chars(const char *start, size_t length, int flush);
void show_zlib_error(const char *function, int error_code, z_stream &z);
private:
istream *_source;