117651Speter/* compress.c -- compress a memory buffer 2313796Sdelphij * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler 3131377Stjr * For conditions of distribution and use, see copyright notice in zlib.h 417651Speter */ 517651Speter 633904Ssteve/* @(#) $Id$ */ 717651Speter 8131377Stjr#define ZLIB_INTERNAL 917651Speter#include "zlib.h" 1017651Speter 1117651Speter/* =========================================================================== 1233904Ssteve Compresses the source buffer into the destination buffer. The level 1333904Ssteve parameter has the same meaning as in deflateInit. sourceLen is the byte 1433904Ssteve length of the source buffer. Upon entry, destLen is the total size of the 1533904Ssteve destination buffer, which must be at least 0.1% larger than sourceLen plus 1633904Ssteve 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. 1733904Ssteve 1833904Ssteve compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough 1933904Ssteve memory, Z_BUF_ERROR if there was not enough room in the output buffer, 2033904Ssteve Z_STREAM_ERROR if the level parameter is invalid. 2117651Speter*/ 2233904Ssteveint ZEXPORT compress2 (dest, destLen, source, sourceLen, level) 2317651Speter Bytef *dest; 2417651Speter uLongf *destLen; 2517651Speter const Bytef *source; 2617651Speter uLong sourceLen; 2733904Ssteve int level; 2817651Speter{ 2917651Speter z_stream stream; 3017651Speter int err; 31313796Sdelphij const uInt max = (uInt)-1; 32313796Sdelphij uLong left; 3317651Speter 34313796Sdelphij left = *destLen; 35313796Sdelphij *destLen = 0; 3617651Speter 3717651Speter stream.zalloc = (alloc_func)0; 3817651Speter stream.zfree = (free_func)0; 3917651Speter stream.opaque = (voidpf)0; 4017651Speter 4133904Ssteve err = deflateInit(&stream, level); 4217651Speter if (err != Z_OK) return err; 4317651Speter 44313796Sdelphij stream.next_out = dest; 45313796Sdelphij stream.avail_out = 0; 46313796Sdelphij stream.next_in = (z_const Bytef *)source; 47313796Sdelphij stream.avail_in = 0; 48313796Sdelphij 49313796Sdelphij do { 50313796Sdelphij if (stream.avail_out == 0) { 51313796Sdelphij stream.avail_out = left > (uLong)max ? max : (uInt)left; 52313796Sdelphij left -= stream.avail_out; 53313796Sdelphij } 54313796Sdelphij if (stream.avail_in == 0) { 55313796Sdelphij stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen; 56313796Sdelphij sourceLen -= stream.avail_in; 57313796Sdelphij } 58313796Sdelphij err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH); 59313796Sdelphij } while (err == Z_OK); 60313796Sdelphij 6117651Speter *destLen = stream.total_out; 62313796Sdelphij deflateEnd(&stream); 63313796Sdelphij return err == Z_STREAM_END ? Z_OK : err; 6417651Speter} 6533904Ssteve 6633904Ssteve/* =========================================================================== 6733904Ssteve */ 6833904Ssteveint ZEXPORT compress (dest, destLen, source, sourceLen) 6933904Ssteve Bytef *dest; 7033904Ssteve uLongf *destLen; 7133904Ssteve const Bytef *source; 7233904Ssteve uLong sourceLen; 7333904Ssteve{ 7433904Ssteve return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); 7533904Ssteve} 76131377Stjr 77131377Stjr/* =========================================================================== 78131377Stjr If the default memLevel or windowBits for deflateInit() is changed, then 79131377Stjr this function needs to be updated. 80131377Stjr */ 81131377StjruLong ZEXPORT compressBound (sourceLen) 82131377Stjr uLong sourceLen; 83131377Stjr{ 84205194Sdelphij return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 85205194Sdelphij (sourceLen >> 25) + 13; 86131377Stjr} 87