15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* compress.c -- compress a memory buffer
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 1995-2005 Jean-loup Gailly.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For conditions of distribution and use, see copyright notice in zlib.h
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* @(#) $Id$ */
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ZLIB_INTERNAL
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "zlib.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ===========================================================================
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     Compresses the source buffer into the destination buffer. The level
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   parameter has the same meaning as in deflateInit.  sourceLen is the byte
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   length of the source buffer. Upon entry, destLen is the total size of the
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   destination buffer, which must be at least 0.1% larger than sourceLen plus
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Z_STREAM_ERROR if the level parameter is invalid.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bytef *dest;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLongf *destLen;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Bytef *source;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong sourceLen;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int level;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    z_stream stream;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.next_in = (Bytef*)source;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.avail_in = (uInt)sourceLen;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef MAXSEG_64K
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Check for source > 64K on 16-bit machine: */
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.next_out = dest;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.avail_out = (uInt)*destLen;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.zalloc = (alloc_func)0;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.zfree = (free_func)0;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stream.opaque = (voidpf)0;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = deflateInit(&stream, level);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err != Z_OK) return err;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = deflate(&stream, Z_FINISH);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err != Z_STREAM_END) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        deflateEnd(&stream);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return err == Z_OK ? Z_BUF_ERROR : err;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *destLen = stream.total_out;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err = deflateEnd(&stream);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return err;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ===========================================================================
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ZEXPORT compress (dest, destLen, source, sourceLen)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Bytef *dest;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLongf *destLen;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Bytef *source;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong sourceLen;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ===========================================================================
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     If the default memLevel or windowBits for deflateInit() is changed, then
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   this function needs to be updated.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uLong ZEXPORT compressBound (sourceLen)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong sourceLen;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           (sourceLen >> 25) + 13;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
81