xref: /plan9-contrib/sys/src/cmd/gs/zlib/compress.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier /* compress.c -- compress a memory buffer
2*7dd7cddfSDavid du Colombier  * Copyright (C) 1995-1996 Jean-loup Gailly.
3*7dd7cddfSDavid du Colombier  * For conditions of distribution and use, see copyright notice in zlib.h
4*7dd7cddfSDavid du Colombier  */
5*7dd7cddfSDavid du Colombier 
6*7dd7cddfSDavid du Colombier /* $Id: compress.c,v 1.10 1996/05/23 16:51:12 me Exp $ */
7*7dd7cddfSDavid du Colombier 
8*7dd7cddfSDavid du Colombier #include "zlib.h"
9*7dd7cddfSDavid du Colombier 
10*7dd7cddfSDavid du Colombier /* ===========================================================================
11*7dd7cddfSDavid du Colombier      Compresses the source buffer into the destination buffer.  sourceLen is
12*7dd7cddfSDavid du Colombier    the byte length of the source buffer. Upon entry, destLen is the total
13*7dd7cddfSDavid du Colombier    size of the destination buffer, which must be at least 0.1% larger than
14*7dd7cddfSDavid du Colombier    sourceLen plus 8 bytes. Upon exit, destLen is the actual size of the
15*7dd7cddfSDavid du Colombier    compressed buffer.
16*7dd7cddfSDavid du Colombier      This function can be used to compress a whole file at once if the
17*7dd7cddfSDavid du Colombier    input file is mmap'ed.
18*7dd7cddfSDavid du Colombier      compress returns Z_OK if success, Z_MEM_ERROR if there was not
19*7dd7cddfSDavid du Colombier    enough memory, Z_BUF_ERROR if there was not enough room in the output
20*7dd7cddfSDavid du Colombier    buffer.
21*7dd7cddfSDavid du Colombier */
22*7dd7cddfSDavid du Colombier int compress (dest, destLen, source, sourceLen)
23*7dd7cddfSDavid du Colombier     Bytef *dest;
24*7dd7cddfSDavid du Colombier     uLongf *destLen;
25*7dd7cddfSDavid du Colombier     const Bytef *source;
26*7dd7cddfSDavid du Colombier     uLong sourceLen;
27*7dd7cddfSDavid du Colombier {
28*7dd7cddfSDavid du Colombier     z_stream stream;
29*7dd7cddfSDavid du Colombier     int err;
30*7dd7cddfSDavid du Colombier 
31*7dd7cddfSDavid du Colombier     stream.next_in = (Bytef*)source;
32*7dd7cddfSDavid du Colombier     stream.avail_in = (uInt)sourceLen;
33*7dd7cddfSDavid du Colombier #ifdef MAXSEG_64K
34*7dd7cddfSDavid du Colombier     /* Check for source > 64K on 16-bit machine: */
35*7dd7cddfSDavid du Colombier     if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
36*7dd7cddfSDavid du Colombier #endif
37*7dd7cddfSDavid du Colombier     stream.next_out = dest;
38*7dd7cddfSDavid du Colombier     stream.avail_out = (uInt)*destLen;
39*7dd7cddfSDavid du Colombier     if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
40*7dd7cddfSDavid du Colombier 
41*7dd7cddfSDavid du Colombier     stream.zalloc = (alloc_func)0;
42*7dd7cddfSDavid du Colombier     stream.zfree = (free_func)0;
43*7dd7cddfSDavid du Colombier     stream.opaque = (voidpf)0;
44*7dd7cddfSDavid du Colombier 
45*7dd7cddfSDavid du Colombier     err = deflateInit(&stream, Z_DEFAULT_COMPRESSION);
46*7dd7cddfSDavid du Colombier     if (err != Z_OK) return err;
47*7dd7cddfSDavid du Colombier 
48*7dd7cddfSDavid du Colombier     err = deflate(&stream, Z_FINISH);
49*7dd7cddfSDavid du Colombier     if (err != Z_STREAM_END) {
50*7dd7cddfSDavid du Colombier         deflateEnd(&stream);
51*7dd7cddfSDavid du Colombier         return err == Z_OK ? Z_BUF_ERROR : err;
52*7dd7cddfSDavid du Colombier     }
53*7dd7cddfSDavid du Colombier     *destLen = stream.total_out;
54*7dd7cddfSDavid du Colombier 
55*7dd7cddfSDavid du Colombier     err = deflateEnd(&stream);
56*7dd7cddfSDavid du Colombier     return err;
57*7dd7cddfSDavid du Colombier }
58