xref: /plan9/sys/src/cmd/gs/zlib/uncompr.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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