diff options
author | Matthew Hoops | 2011-08-20 16:41:10 -0400 |
---|---|---|
committer | Matthew Hoops | 2011-08-20 16:41:10 -0400 |
commit | f408456d14b12152727be31fe00f61b028f18c3b (patch) | |
tree | f13d81c1a63abf448edd10f0cbbcaa975621401a | |
parent | 59200bf426cc85b9ec49865010a035ce214bb2bd (diff) | |
download | scummvm-rg350-f408456d14b12152727be31fe00f61b028f18c3b.tar.gz scummvm-rg350-f408456d14b12152727be31fe00f61b028f18c3b.tar.bz2 scummvm-rg350-f408456d14b12152727be31fe00f61b028f18c3b.zip |
COMMON: Add wrapper for inflating headerless zlib data
-rw-r--r-- | common/zlib.cpp | 29 | ||||
-rw-r--r-- | common/zlib.h | 9 |
2 files changed, 38 insertions, 0 deletions
diff --git a/common/zlib.cpp b/common/zlib.cpp index 86c618830e..70133fea30 100644 --- a/common/zlib.cpp +++ b/common/zlib.cpp @@ -49,6 +49,35 @@ bool uncompress(byte *dst, unsigned long *dstLen, const byte *src, unsigned long return Z_OK == ::uncompress(dst, dstLen, src, srcLen); } +bool inflateZlibHeaderless(byte *dst, uint dstLen, const byte *src, uint srcLen) { + if (!dst || !dstLen || !src || !srcLen) + return false; + + // Initialize zlib + z_stream stream; + stream.next_in = const_cast<byte *>(src); + stream.avail_in = srcLen; + stream.next_out = dst; + stream.avail_out = dstLen; + stream.zalloc = Z_NULL; + stream.zfree = Z_NULL; + stream.opaque = Z_NULL; + + // Negative MAX_WBITS tells zlib there's no zlib header + int err = inflateInit2(&stream, -MAX_WBITS); + if (err != Z_OK) + return false; + + err = inflate(&stream, Z_SYNC_FLUSH); + if (err != Z_OK && err != Z_STREAM_END) { + inflateEnd(&stream); + return false; + } + + inflateEnd(&stream); + return true; +} + /** * A simple wrapper class which can be used to wrap around an arbitrary * other SeekableReadStream and will then provide on-the-fly decompression support. diff --git a/common/zlib.h b/common/zlib.h index 1925034310..7af7df0da8 100644 --- a/common/zlib.h +++ b/common/zlib.h @@ -41,6 +41,15 @@ class WriteStream; */ bool uncompress(byte *dst, unsigned long *dstLen, const byte *src, unsigned long srcLen); +/** + * Wrapper around zlib's inflate functions. This function will call the + * necessary inflate functions to uncompress data compressed with deflate + * but *not* with the standard zlib header. + * + * @return true on success (Z_OK or Z_STREAM_END), false otherwise + */ +bool inflateZlibHeaderless(byte *dst, uint dstLen, const byte *src, uint srcLen); + #endif /** |