xref: /dflybsd-src/contrib/zlib-1.2/compress.c (revision c6c68a82af3a48187337cc9b7e0c859413b34a27)
11e9a6b47SJoerg Sonnenberger /* compress.c -- compress a memory buffer
2*e041647aSSascha Wildner  * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler
31e9a6b47SJoerg Sonnenberger  * For conditions of distribution and use, see copyright notice in zlib.h
41e9a6b47SJoerg Sonnenberger  */
51e9a6b47SJoerg Sonnenberger 
61e9a6b47SJoerg Sonnenberger /* @(#) $Id$ */
71e9a6b47SJoerg Sonnenberger 
81e9a6b47SJoerg Sonnenberger #define ZLIB_INTERNAL
91e9a6b47SJoerg Sonnenberger #include "zlib.h"
101e9a6b47SJoerg Sonnenberger 
111e9a6b47SJoerg Sonnenberger /* ===========================================================================
121e9a6b47SJoerg Sonnenberger      Compresses the source buffer into the destination buffer. The level
131e9a6b47SJoerg Sonnenberger    parameter has the same meaning as in deflateInit.  sourceLen is the byte
141e9a6b47SJoerg Sonnenberger    length of the source buffer. Upon entry, destLen is the total size of the
151e9a6b47SJoerg Sonnenberger    destination buffer, which must be at least 0.1% larger than sourceLen plus
161e9a6b47SJoerg Sonnenberger    12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
171e9a6b47SJoerg Sonnenberger 
181e9a6b47SJoerg Sonnenberger      compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
191e9a6b47SJoerg Sonnenberger    memory, Z_BUF_ERROR if there was not enough room in the output buffer,
201e9a6b47SJoerg Sonnenberger    Z_STREAM_ERROR if the level parameter is invalid.
211e9a6b47SJoerg Sonnenberger */
compress2(dest,destLen,source,sourceLen,level)221e9a6b47SJoerg Sonnenberger int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
231e9a6b47SJoerg Sonnenberger     Bytef *dest;
241e9a6b47SJoerg Sonnenberger     uLongf *destLen;
251e9a6b47SJoerg Sonnenberger     const Bytef *source;
261e9a6b47SJoerg Sonnenberger     uLong sourceLen;
271e9a6b47SJoerg Sonnenberger     int level;
281e9a6b47SJoerg Sonnenberger {
291e9a6b47SJoerg Sonnenberger     z_stream stream;
301e9a6b47SJoerg Sonnenberger     int err;
31*e041647aSSascha Wildner     const uInt max = (uInt)-1;
32*e041647aSSascha Wildner     uLong left;
331e9a6b47SJoerg Sonnenberger 
34*e041647aSSascha Wildner     left = *destLen;
35*e041647aSSascha Wildner     *destLen = 0;
361e9a6b47SJoerg Sonnenberger 
371e9a6b47SJoerg Sonnenberger     stream.zalloc = (alloc_func)0;
381e9a6b47SJoerg Sonnenberger     stream.zfree = (free_func)0;
391e9a6b47SJoerg Sonnenberger     stream.opaque = (voidpf)0;
401e9a6b47SJoerg Sonnenberger 
411e9a6b47SJoerg Sonnenberger     err = deflateInit(&stream, level);
421e9a6b47SJoerg Sonnenberger     if (err != Z_OK) return err;
431e9a6b47SJoerg Sonnenberger 
44*e041647aSSascha Wildner     stream.next_out = dest;
45*e041647aSSascha Wildner     stream.avail_out = 0;
46*e041647aSSascha Wildner     stream.next_in = (z_const Bytef *)source;
47*e041647aSSascha Wildner     stream.avail_in = 0;
481e9a6b47SJoerg Sonnenberger 
49*e041647aSSascha Wildner     do {
50*e041647aSSascha Wildner         if (stream.avail_out == 0) {
51*e041647aSSascha Wildner             stream.avail_out = left > (uLong)max ? max : (uInt)left;
52*e041647aSSascha Wildner             left -= stream.avail_out;
53*e041647aSSascha Wildner         }
54*e041647aSSascha Wildner         if (stream.avail_in == 0) {
55*e041647aSSascha Wildner             stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
56*e041647aSSascha Wildner             sourceLen -= stream.avail_in;
57*e041647aSSascha Wildner         }
58*e041647aSSascha Wildner         err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
59*e041647aSSascha Wildner     } while (err == Z_OK);
60*e041647aSSascha Wildner 
61*e041647aSSascha Wildner     *destLen = stream.total_out;
62*e041647aSSascha Wildner     deflateEnd(&stream);
63*e041647aSSascha Wildner     return err == Z_STREAM_END ? Z_OK : err;
641e9a6b47SJoerg Sonnenberger }
651e9a6b47SJoerg Sonnenberger 
661e9a6b47SJoerg Sonnenberger /* ===========================================================================
671e9a6b47SJoerg Sonnenberger  */
compress(dest,destLen,source,sourceLen)681e9a6b47SJoerg Sonnenberger int ZEXPORT compress (dest, destLen, source, sourceLen)
691e9a6b47SJoerg Sonnenberger     Bytef *dest;
701e9a6b47SJoerg Sonnenberger     uLongf *destLen;
711e9a6b47SJoerg Sonnenberger     const Bytef *source;
721e9a6b47SJoerg Sonnenberger     uLong sourceLen;
731e9a6b47SJoerg Sonnenberger {
741e9a6b47SJoerg Sonnenberger     return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
751e9a6b47SJoerg Sonnenberger }
761e9a6b47SJoerg Sonnenberger 
771e9a6b47SJoerg Sonnenberger /* ===========================================================================
781e9a6b47SJoerg Sonnenberger      If the default memLevel or windowBits for deflateInit() is changed, then
791e9a6b47SJoerg Sonnenberger    this function needs to be updated.
801e9a6b47SJoerg Sonnenberger  */
compressBound(sourceLen)811e9a6b47SJoerg Sonnenberger uLong ZEXPORT compressBound (sourceLen)
821e9a6b47SJoerg Sonnenberger     uLong sourceLen;
831e9a6b47SJoerg Sonnenberger {
84fe927c51SPeter Avalos     return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
85fe927c51SPeter Avalos            (sourceLen >> 25) + 13;
861e9a6b47SJoerg Sonnenberger }
87