1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* compress.c -- compress a memory buffer 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (C) 1995-2005 Jean-loup Gailly. 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * For conditions of distribution and use, see copyright notice in zlib.h 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* @(#) $Id$ */ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define ZLIB_INTERNAL 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "zlib.h" 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* =========================================================================== 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Compresses the source buffer into the destination buffer. The level 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameter has the same meaning as in deflateInit. sourceLen is the byte 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov length of the source buffer. Upon entry, destLen is the total size of the 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov destination buffer, which must be at least 0.1% larger than sourceLen plus 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memory, Z_BUF_ERROR if there was not enough room in the output buffer, 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Z_STREAM_ERROR if the level parameter is invalid. 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint ZEXPORT compress2 ( 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Bytef *dest, 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uLongf *destLen, 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const Bytef *source, 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uLong sourceLen, 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int level) 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov z_stream stream; 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int err; 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream.next_in = (z_const Bytef *)source; 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream.avail_in = (uInt)sourceLen; 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef MAXSEG_64K 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Check for source > 64K on 16-bit machine: */ 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream.next_out = dest; 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream.avail_out = (uInt)*destLen; 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream.zalloc = (alloc_func)0; 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream.zfree = (free_func)0; 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov stream.opaque = (voidpf)0; 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov err = deflateInit(&stream, level); 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (err != Z_OK) return err; 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov err = deflate(&stream, Z_FINISH); 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (err != Z_STREAM_END) { 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov deflateEnd(&stream); 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return err == Z_OK ? Z_BUF_ERROR : err; 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *destLen = stream.total_out; 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov err = deflateEnd(&stream); 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return err; 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* =========================================================================== 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint ZEXPORT compress ( 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Bytef *dest, 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uLongf *destLen, 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const Bytef *source, 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uLong sourceLen) 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* =========================================================================== 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov If the default memLevel or windowBits for deflateInit() is changed, then 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov this function needs to be updated. 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovuLong ZEXPORT compressBound ( 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov uLong sourceLen) 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (sourceLen >> 25) + 13; 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 81