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