169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/* compress.c -- compress a memory buffer
269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Copyright (C) 1995-2005 Jean-loup Gailly.
369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * For conditions of distribution and use, see copyright notice in zlib.h
469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/* @(#) $Id$ */
769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal#define ZLIB_INTERNAL
969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal#include "zlib.h"
1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/* ===========================================================================
1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     Compresses the source buffer into the destination buffer. The level
1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal   parameter has the same meaning as in deflateInit.  sourceLen is the byte
1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal   length of the source buffer. Upon entry, destLen is the total size of the
1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal   destination buffer, which must be at least 0.1% larger than sourceLen plus
1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal   Z_STREAM_ERROR if the level parameter is invalid.
2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal*/
2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalint ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    Bytef *dest;
2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    uLongf *destLen;
2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    const Bytef *source;
2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    uLong sourceLen;
2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int level;
2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal{
2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    z_stream stream;
3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int err;
3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    stream.next_in = (z_const Bytef *)source;
3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    stream.avail_in = (uInt)sourceLen;
3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal#ifdef MAXSEG_64K
3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /* Check for source > 64K on 16-bit machine: */
3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal#endif
3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    stream.next_out = dest;
3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    stream.avail_out = (uInt)*destLen;
40    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
41
42    stream.zalloc = (alloc_func)0;
43    stream.zfree = (free_func)0;
44    stream.opaque = (voidpf)0;
45
46    err = deflateInit(&stream, level);
47    if (err != Z_OK) return err;
48
49    err = deflate(&stream, Z_FINISH);
50    if (err != Z_STREAM_END) {
51        deflateEnd(&stream);
52        return err == Z_OK ? Z_BUF_ERROR : err;
53    }
54    *destLen = stream.total_out;
55
56    err = deflateEnd(&stream);
57    return err;
58}
59
60/* ===========================================================================
61 */
62int ZEXPORT compress (dest, destLen, source, sourceLen)
63    Bytef *dest;
64    uLongf *destLen;
65    const Bytef *source;
66    uLong sourceLen;
67{
68    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
69}
70
71/* ===========================================================================
72     If the default memLevel or windowBits for deflateInit() is changed, then
73   this function needs to be updated.
74 */
75uLong ZEXPORT compressBound (sourceLen)
76    uLong sourceLen;
77{
78    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
79           (sourceLen >> 25) + 13;
80}
81