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