117651Speter/* compress.c -- compress a memory buffer
2313796Sdelphij * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler
3131377Stjr * For conditions of distribution and use, see copyright notice in zlib.h
417651Speter */
517651Speter
633904Ssteve/* @(#) $Id$ */
717651Speter
8131377Stjr#define ZLIB_INTERNAL
917651Speter#include "zlib.h"
1017651Speter
1117651Speter/* ===========================================================================
1233904Ssteve     Compresses the source buffer into the destination buffer. The level
1333904Ssteve   parameter has the same meaning as in deflateInit.  sourceLen is the byte
1433904Ssteve   length of the source buffer. Upon entry, destLen is the total size of the
1533904Ssteve   destination buffer, which must be at least 0.1% larger than sourceLen plus
1633904Ssteve   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
1733904Ssteve
1833904Ssteve     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
1933904Ssteve   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
2033904Ssteve   Z_STREAM_ERROR if the level parameter is invalid.
2117651Speter*/
2233904Ssteveint ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
2317651Speter    Bytef *dest;
2417651Speter    uLongf *destLen;
2517651Speter    const Bytef *source;
2617651Speter    uLong sourceLen;
2733904Ssteve    int level;
2817651Speter{
2917651Speter    z_stream stream;
3017651Speter    int err;
31313796Sdelphij    const uInt max = (uInt)-1;
32313796Sdelphij    uLong left;
3317651Speter
34313796Sdelphij    left = *destLen;
35313796Sdelphij    *destLen = 0;
3617651Speter
3717651Speter    stream.zalloc = (alloc_func)0;
3817651Speter    stream.zfree = (free_func)0;
3917651Speter    stream.opaque = (voidpf)0;
4017651Speter
4133904Ssteve    err = deflateInit(&stream, level);
4217651Speter    if (err != Z_OK) return err;
4317651Speter
44313796Sdelphij    stream.next_out = dest;
45313796Sdelphij    stream.avail_out = 0;
46313796Sdelphij    stream.next_in = (z_const Bytef *)source;
47313796Sdelphij    stream.avail_in = 0;
48313796Sdelphij
49313796Sdelphij    do {
50313796Sdelphij        if (stream.avail_out == 0) {
51313796Sdelphij            stream.avail_out = left > (uLong)max ? max : (uInt)left;
52313796Sdelphij            left -= stream.avail_out;
53313796Sdelphij        }
54313796Sdelphij        if (stream.avail_in == 0) {
55313796Sdelphij            stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
56313796Sdelphij            sourceLen -= stream.avail_in;
57313796Sdelphij        }
58313796Sdelphij        err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
59313796Sdelphij    } while (err == Z_OK);
60313796Sdelphij
6117651Speter    *destLen = stream.total_out;
62313796Sdelphij    deflateEnd(&stream);
63313796Sdelphij    return err == Z_STREAM_END ? Z_OK : err;
6417651Speter}
6533904Ssteve
6633904Ssteve/* ===========================================================================
6733904Ssteve */
6833904Ssteveint ZEXPORT compress (dest, destLen, source, sourceLen)
6933904Ssteve    Bytef *dest;
7033904Ssteve    uLongf *destLen;
7133904Ssteve    const Bytef *source;
7233904Ssteve    uLong sourceLen;
7333904Ssteve{
7433904Ssteve    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
7533904Ssteve}
76131377Stjr
77131377Stjr/* ===========================================================================
78131377Stjr     If the default memLevel or windowBits for deflateInit() is changed, then
79131377Stjr   this function needs to be updated.
80131377Stjr */
81131377StjruLong ZEXPORT compressBound (sourceLen)
82131377Stjr    uLong sourceLen;
83131377Stjr{
84205194Sdelphij    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
85205194Sdelphij           (sourceLen >> 25) + 13;
86131377Stjr}
87