From f408456d14b12152727be31fe00f61b028f18c3b Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 20 Aug 2011 16:41:10 -0400 Subject: COMMON: Add wrapper for inflating headerless zlib data --- common/zlib.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'common/zlib.cpp') 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(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. -- cgit v1.2.3