=========================================================================== Decompresses the source buffer into the destination buffer. *sourceLen is the byte length of the source buffer. Upon entry, *destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previou
(dest, destLen, source, sourceLen)
| 25 | an incomplete zlib stream. |
| 26 | */ |
| 27 | int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) |
| 28 | Bytef *dest; |
| 29 | uLongf *destLen; |
| 30 | const Bytef *source; |
| 31 | uLong *sourceLen; |
| 32 | { |
| 33 | z_stream stream; |
| 34 | int err; |
| 35 | const uInt max = (uInt)-1; |
| 36 | uLong len, left; |
| 37 | Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */ |
| 38 | |
| 39 | len = *sourceLen; |
| 40 | if (*destLen) { |
| 41 | left = *destLen; |
| 42 | *destLen = 0; |
| 43 | } |
| 44 | else { |
| 45 | left = 1; |
| 46 | dest = buf; |
| 47 | } |
| 48 | |
| 49 | stream.next_in = (z_const Bytef *)source; |
| 50 | stream.avail_in = 0; |
| 51 | stream.zalloc = (alloc_func)0; |
| 52 | stream.zfree = (free_func)0; |
| 53 | stream.opaque = (voidpf)0; |
| 54 | |
| 55 | err = inflateInit(&stream); |
| 56 | if (err != Z_OK) return err; |
| 57 | |
| 58 | stream.next_out = dest; |
| 59 | stream.avail_out = 0; |
| 60 | |
| 61 | do { |
| 62 | if (stream.avail_out == 0) { |
| 63 | stream.avail_out = left > (uLong)max ? max : (uInt)left; |
| 64 | left -= stream.avail_out; |
| 65 | } |
| 66 | if (stream.avail_in == 0) { |
| 67 | stream.avail_in = len > (uLong)max ? max : (uInt)len; |
| 68 | len -= stream.avail_in; |
| 69 | } |
| 70 | err = inflate(&stream, Z_NO_FLUSH); |
| 71 | } while (err == Z_OK); |
| 72 | |
| 73 | *sourceLen -= len + stream.avail_in; |
| 74 | if (dest != buf) |
| 75 | *destLen = stream.total_out; |
| 76 | else if (stream.total_out && err == Z_BUF_ERROR) |
| 77 | left = 1; |
| 78 | |
| 79 | inflateEnd(&stream); |
| 80 | return err == Z_STREAM_END ? Z_OK : |
| 81 | err == Z_NEED_DICT ? Z_DATA_ERROR : |
| 82 | err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR : |
| 83 | err; |
| 84 | } |