17dd7cddfSDavid du Colombier /* uncompr.c -- decompress a memory buffer
2*593dc095SDavid du Colombier * Copyright (C) 1995-2003 Jean-loup Gailly.
37dd7cddfSDavid du Colombier * For conditions of distribution and use, see copyright notice in zlib.h
47dd7cddfSDavid du Colombier */
57dd7cddfSDavid du Colombier
6*593dc095SDavid du Colombier /* @(#) $Id: uncompr.c,v 1.1.1.1 2005/04/24 21:39:38 giles Exp $ */
77dd7cddfSDavid du Colombier
8*593dc095SDavid du Colombier #define ZLIB_INTERNAL
97dd7cddfSDavid du Colombier #include "zlib.h"
107dd7cddfSDavid du Colombier
117dd7cddfSDavid du Colombier /* ===========================================================================
127dd7cddfSDavid du Colombier Decompresses the source buffer into the destination buffer. sourceLen is
137dd7cddfSDavid du Colombier the byte length of the source buffer. Upon entry, destLen is the total
147dd7cddfSDavid du Colombier size of the destination buffer, which must be large enough to hold the
157dd7cddfSDavid du Colombier entire uncompressed data. (The size of the uncompressed data must have
167dd7cddfSDavid du Colombier been saved previously by the compressor and transmitted to the decompressor
177dd7cddfSDavid du Colombier by some mechanism outside the scope of this compression library.)
187dd7cddfSDavid du Colombier Upon exit, destLen is the actual size of the compressed buffer.
197dd7cddfSDavid du Colombier This function can be used to decompress a whole file at once if the
207dd7cddfSDavid du Colombier input file is mmap'ed.
217dd7cddfSDavid du Colombier
227dd7cddfSDavid du Colombier uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
237dd7cddfSDavid du Colombier enough memory, Z_BUF_ERROR if there was not enough room in the output
247dd7cddfSDavid du Colombier buffer, or Z_DATA_ERROR if the input data was corrupted.
257dd7cddfSDavid du Colombier */
uncompress(dest,destLen,source,sourceLen)26*593dc095SDavid du Colombier int ZEXPORT uncompress (dest, destLen, source, sourceLen)
277dd7cddfSDavid du Colombier Bytef *dest;
287dd7cddfSDavid du Colombier uLongf *destLen;
297dd7cddfSDavid du Colombier const Bytef *source;
307dd7cddfSDavid du Colombier uLong sourceLen;
317dd7cddfSDavid du Colombier {
327dd7cddfSDavid du Colombier z_stream stream;
337dd7cddfSDavid du Colombier int err;
347dd7cddfSDavid du Colombier
357dd7cddfSDavid du Colombier stream.next_in = (Bytef*)source;
367dd7cddfSDavid du Colombier stream.avail_in = (uInt)sourceLen;
377dd7cddfSDavid du Colombier /* Check for source > 64K on 16-bit machine: */
387dd7cddfSDavid du Colombier if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
397dd7cddfSDavid du Colombier
407dd7cddfSDavid du Colombier stream.next_out = dest;
417dd7cddfSDavid du Colombier stream.avail_out = (uInt)*destLen;
427dd7cddfSDavid du Colombier if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
437dd7cddfSDavid du Colombier
447dd7cddfSDavid du Colombier stream.zalloc = (alloc_func)0;
457dd7cddfSDavid du Colombier stream.zfree = (free_func)0;
467dd7cddfSDavid du Colombier
477dd7cddfSDavid du Colombier err = inflateInit(&stream);
487dd7cddfSDavid du Colombier if (err != Z_OK) return err;
497dd7cddfSDavid du Colombier
507dd7cddfSDavid du Colombier err = inflate(&stream, Z_FINISH);
517dd7cddfSDavid du Colombier if (err != Z_STREAM_END) {
527dd7cddfSDavid du Colombier inflateEnd(&stream);
53*593dc095SDavid du Colombier if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
54*593dc095SDavid du Colombier return Z_DATA_ERROR;
557dd7cddfSDavid du Colombier return err;
567dd7cddfSDavid du Colombier }
577dd7cddfSDavid du Colombier *destLen = stream.total_out;
587dd7cddfSDavid du Colombier
597dd7cddfSDavid du Colombier err = inflateEnd(&stream);
607dd7cddfSDavid du Colombier return err;
617dd7cddfSDavid du Colombier }
62