117651Speter/* compress.c -- compress a memory buffer
2205471Sdelphij * Copyright (C) 1995-2005 Jean-loup Gailly.
3131380Stjr * For conditions of distribution and use, see copyright notice in zlib.h
417651Speter */
517651Speter
6146081Skientzle/* @(#) $Id$ */
717651Speter
8131380Stjr#define ZLIB_INTERNAL
917651Speter#include "zlib.h"
1017651Speter
1117651Speter/* ===========================================================================
1233908Ssteve     Compresses the source buffer into the destination buffer. The level
1333908Ssteve   parameter has the same meaning as in deflateInit.  sourceLen is the byte
1433908Ssteve   length of the source buffer. Upon entry, destLen is the total size of the
1533908Ssteve   destination buffer, which must be at least 0.1% larger than sourceLen plus
1633908Ssteve   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
1733908Ssteve
1833908Ssteve     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
1933908Ssteve   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
2033908Ssteve   Z_STREAM_ERROR if the level parameter is invalid.
2117651Speter*/
2233908Ssteveint ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
2317651Speter    Bytef *dest;
2417651Speter    uLongf *destLen;
2517651Speter    const Bytef *source;
2617651Speter    uLong sourceLen;
2733908Ssteve    int level;
2817651Speter{
2917651Speter    z_stream stream;
3017651Speter    int err;
3117651Speter
32250261Sdelphij    stream.next_in = (z_const Bytef *)source;
3317651Speter    stream.avail_in = (uInt)sourceLen;
3417651Speter#ifdef MAXSEG_64K
3517651Speter    /* Check for source > 64K on 16-bit machine: */
3617651Speter    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
3717651Speter#endif
3817651Speter    stream.next_out = dest;
3917651Speter    stream.avail_out = (uInt)*destLen;
4017651Speter    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
4117651Speter
4217651Speter    stream.zalloc = (alloc_func)0;
4317651Speter    stream.zfree = (free_func)0;
4417651Speter    stream.opaque = (voidpf)0;
4517651Speter
4633908Ssteve    err = deflateInit(&stream, level);
4717651Speter    if (err != Z_OK) return err;
4817651Speter
4917651Speter    err = deflate(&stream, Z_FINISH);
5017651Speter    if (err != Z_STREAM_END) {
5117651Speter        deflateEnd(&stream);
5217651Speter        return err == Z_OK ? Z_BUF_ERROR : err;
5317651Speter    }
5417651Speter    *destLen = stream.total_out;
5517651Speter
5617651Speter    err = deflateEnd(&stream);
5717651Speter    return err;
5817651Speter}
5933908Ssteve
6033908Ssteve/* ===========================================================================
6133908Ssteve */
6233908Ssteveint ZEXPORT compress (dest, destLen, source, sourceLen)
6333908Ssteve    Bytef *dest;
6433908Ssteve    uLongf *destLen;
6533908Ssteve    const Bytef *source;
6633908Ssteve    uLong sourceLen;
6733908Ssteve{
6833908Ssteve    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
6933908Ssteve}
70131380Stjr
71131380Stjr/* ===========================================================================
72131380Stjr     If the default memLevel or windowBits for deflateInit() is changed, then
73131380Stjr   this function needs to be updated.
74131380Stjr */
75131380StjruLong ZEXPORT compressBound (sourceLen)
76131380Stjr    uLong sourceLen;
77131380Stjr{
78205471Sdelphij    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
79205471Sdelphij           (sourceLen >> 25) + 13;
80131380Stjr}
81