xref: /plan9/sys/src/cmd/gs/zlib/compress.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier /* compress.c -- compress a memory buffer
2*593dc095SDavid du Colombier  * Copyright (C) 1995-2002 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: compress.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 /* ===========================================================================
12*593dc095SDavid du Colombier      Compresses the source buffer into the destination buffer. The level
13*593dc095SDavid du Colombier    parameter has the same meaning as in deflateInit.  sourceLen is the byte
14*593dc095SDavid du Colombier    length of the source buffer. Upon entry, destLen is the total size of the
15*593dc095SDavid du Colombier    destination buffer, which must be at least 0.1% larger than sourceLen plus
16*593dc095SDavid du Colombier    12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
17*593dc095SDavid du Colombier 
18*593dc095SDavid du Colombier      compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
19*593dc095SDavid du Colombier    memory, Z_BUF_ERROR if there was not enough room in the output buffer,
20*593dc095SDavid du Colombier    Z_STREAM_ERROR if the level parameter is invalid.
217dd7cddfSDavid du Colombier */
compress2(dest,destLen,source,sourceLen,level)22*593dc095SDavid du Colombier int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
237dd7cddfSDavid du Colombier     Bytef *dest;
247dd7cddfSDavid du Colombier     uLongf *destLen;
257dd7cddfSDavid du Colombier     const Bytef *source;
267dd7cddfSDavid du Colombier     uLong sourceLen;
27*593dc095SDavid du Colombier     int level;
287dd7cddfSDavid du Colombier {
297dd7cddfSDavid du Colombier     z_stream stream;
307dd7cddfSDavid du Colombier     int err;
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier     stream.next_in = (Bytef*)source;
337dd7cddfSDavid du Colombier     stream.avail_in = (uInt)sourceLen;
347dd7cddfSDavid du Colombier #ifdef MAXSEG_64K
357dd7cddfSDavid du Colombier     /* Check for source > 64K on 16-bit machine: */
367dd7cddfSDavid du Colombier     if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
377dd7cddfSDavid du Colombier #endif
387dd7cddfSDavid du Colombier     stream.next_out = dest;
397dd7cddfSDavid du Colombier     stream.avail_out = (uInt)*destLen;
407dd7cddfSDavid du Colombier     if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier     stream.zalloc = (alloc_func)0;
437dd7cddfSDavid du Colombier     stream.zfree = (free_func)0;
447dd7cddfSDavid du Colombier     stream.opaque = (voidpf)0;
457dd7cddfSDavid du Colombier 
46*593dc095SDavid du Colombier     err = deflateInit(&stream, level);
477dd7cddfSDavid du Colombier     if (err != Z_OK) return err;
487dd7cddfSDavid du Colombier 
497dd7cddfSDavid du Colombier     err = deflate(&stream, Z_FINISH);
507dd7cddfSDavid du Colombier     if (err != Z_STREAM_END) {
517dd7cddfSDavid du Colombier         deflateEnd(&stream);
527dd7cddfSDavid du Colombier         return err == Z_OK ? Z_BUF_ERROR : err;
537dd7cddfSDavid du Colombier     }
547dd7cddfSDavid du Colombier     *destLen = stream.total_out;
557dd7cddfSDavid du Colombier 
567dd7cddfSDavid du Colombier     err = deflateEnd(&stream);
577dd7cddfSDavid du Colombier     return err;
587dd7cddfSDavid du Colombier }
59*593dc095SDavid du Colombier 
60*593dc095SDavid du Colombier /* ===========================================================================
61*593dc095SDavid du Colombier  */
compress(dest,destLen,source,sourceLen)62*593dc095SDavid du Colombier int ZEXPORT compress (dest, destLen, source, sourceLen)
63*593dc095SDavid du Colombier     Bytef *dest;
64*593dc095SDavid du Colombier     uLongf *destLen;
65*593dc095SDavid du Colombier     const Bytef *source;
66*593dc095SDavid du Colombier     uLong sourceLen;
67*593dc095SDavid du Colombier {
68*593dc095SDavid du Colombier     return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
69*593dc095SDavid du Colombier }
70*593dc095SDavid du Colombier 
71*593dc095SDavid du Colombier /* ===========================================================================
72*593dc095SDavid du Colombier      If the default memLevel or windowBits for deflateInit() is changed, then
73*593dc095SDavid du Colombier    this function needs to be updated.
74*593dc095SDavid du Colombier  */
compressBound(sourceLen)75*593dc095SDavid du Colombier uLong ZEXPORT compressBound (sourceLen)
76*593dc095SDavid du Colombier     uLong sourceLen;
77*593dc095SDavid du Colombier {
78*593dc095SDavid du Colombier     return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11;
79*593dc095SDavid du Colombier }
80