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