15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* uncompr.c -- decompress a memory buffer
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 1995-2003, 2010 Jean-loup Gailly.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For conditions of distribution and use, see copyright notice in zlib.h
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* @(#) $Id$ */
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ZLIB_INTERNAL
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "zlib.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ===========================================================================
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     Decompresses the source buffer into the destination buffer.  sourceLen is
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   the byte length of the source buffer. Upon entry, destLen is the total
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   size of the destination buffer, which must be large enough to hold the
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   entire uncompressed data. (The size of the uncompressed data must have
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   been saved previously by the compressor and transmitted to the decompressor
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   by some mechanism outside the scope of this compression library.)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Upon exit, destLen is the actual size of the compressed buffer.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   enough memory, Z_BUF_ERROR if there was not enough room in the output
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   buffer, or Z_DATA_ERROR if the input data was corrupted.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ZEXPORT uncompress (dest, destLen, source, sourceLen)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bytef *dest;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLongf *destLen;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Bytef *source;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong sourceLen;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    z_stream stream;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.next_in = (Bytef*)source;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.avail_in = (uInt)sourceLen;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Check for source > 64K on 16-bit machine: */
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.next_out = dest;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.avail_out = (uInt)*destLen;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.zalloc = (alloc_func)0;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.zfree = (free_func)0;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = inflateInit(&stream);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err != Z_OK) return err;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = inflate(&stream, Z_FINISH);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err != Z_STREAM_END) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inflateEnd(&stream);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return Z_DATA_ERROR;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return err;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *destLen = stream.total_out;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = inflateEnd(&stream);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
60