Blame zlib-src/compress.c

Packit d03632
/* compress.c -- compress a memory buffer
Packit d03632
 * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler
Packit d03632
 * For conditions of distribution and use, see copyright notice in zlib.h
Packit d03632
 */
Packit d03632
Packit d03632
/* @(#) $Id$ */
Packit d03632
Packit d03632
#define ZLIB_INTERNAL
Packit d03632
#include "zlib.h"
Packit d03632
Packit d03632
/* ===========================================================================
Packit d03632
     Compresses the source buffer into the destination buffer. The level
Packit d03632
   parameter has the same meaning as in deflateInit.  sourceLen is the byte
Packit d03632
   length of the source buffer. Upon entry, destLen is the total size of the
Packit d03632
   destination buffer, which must be at least 0.1% larger than sourceLen plus
Packit d03632
   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
Packit d03632
Packit d03632
     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
Packit d03632
   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
Packit d03632
   Z_STREAM_ERROR if the level parameter is invalid.
Packit d03632
*/
Packit d03632
int ZEXPORT compress2 (
Packit d03632
    Bytef *dest,
Packit d03632
    uLongf *destLen,
Packit d03632
    const Bytef *source,
Packit d03632
    uLong sourceLen,
Packit d03632
    int level)
Packit d03632
{
Packit d03632
    z_stream stream;
Packit d03632
    int err;
Packit d03632
    const uInt max = (uInt)-1;
Packit d03632
    uLong left;
Packit d03632
Packit d03632
    left = *destLen;
Packit d03632
    *destLen = 0;
Packit d03632
Packit d03632
    stream.zalloc = (alloc_func)0;
Packit d03632
    stream.zfree = (free_func)0;
Packit d03632
    stream.opaque = (voidpf)0;
Packit d03632
Packit d03632
    err = deflateInit(&stream, level);
Packit d03632
    if (err != Z_OK) return err;
Packit d03632
Packit d03632
    stream.next_out = dest;
Packit d03632
    stream.avail_out = 0;
Packit d03632
    stream.next_in = (z_const Bytef *)source;
Packit d03632
    stream.avail_in = 0;
Packit d03632
Packit d03632
    do {
Packit d03632
        if (stream.avail_out == 0) {
Packit d03632
            stream.avail_out = left > (uLong)max ? max : (uInt)left;
Packit d03632
            left -= stream.avail_out;
Packit d03632
        }
Packit d03632
        if (stream.avail_in == 0) {
Packit d03632
            stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
Packit d03632
            sourceLen -= stream.avail_in;
Packit d03632
        }
Packit d03632
        err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
Packit d03632
    } while (err == Z_OK);
Packit d03632
Packit d03632
    *destLen = stream.total_out;
Packit d03632
    deflateEnd(&stream);
Packit d03632
    return err == Z_STREAM_END ? Z_OK : err;
Packit d03632
}
Packit d03632
Packit d03632
/* ===========================================================================
Packit d03632
 */
Packit d03632
int ZEXPORT compress (
Packit d03632
    Bytef *dest,
Packit d03632
    uLongf *destLen,
Packit d03632
    const Bytef *source,
Packit d03632
    uLong sourceLen)
Packit d03632
{
Packit d03632
    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
Packit d03632
}
Packit d03632
Packit d03632
/* ===========================================================================
Packit d03632
     If the default memLevel or windowBits for deflateInit() is changed, then
Packit d03632
   this function needs to be updated.
Packit d03632
 */
Packit d03632
uLong ZEXPORT compressBound (
Packit d03632
    uLong sourceLen)
Packit d03632
{
Packit d03632
    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
Packit d03632
           (sourceLen >> 25) + 13;
Packit d03632
}