1*7dd7cddfSDavid du Colombier /* compress.c -- compress a memory buffer 2*7dd7cddfSDavid du Colombier * Copyright (C) 1995-1996 Jean-loup Gailly. 3*7dd7cddfSDavid du Colombier * For conditions of distribution and use, see copyright notice in zlib.h 4*7dd7cddfSDavid du Colombier */ 5*7dd7cddfSDavid du Colombier 6*7dd7cddfSDavid du Colombier /* $Id: compress.c,v 1.10 1996/05/23 16:51:12 me Exp $ */ 7*7dd7cddfSDavid du Colombier 8*7dd7cddfSDavid du Colombier #include "zlib.h" 9*7dd7cddfSDavid du Colombier 10*7dd7cddfSDavid du Colombier /* =========================================================================== 11*7dd7cddfSDavid du Colombier Compresses the source buffer into the destination buffer. sourceLen is 12*7dd7cddfSDavid du Colombier the byte length of the source buffer. Upon entry, destLen is the total 13*7dd7cddfSDavid du Colombier size of the destination buffer, which must be at least 0.1% larger than 14*7dd7cddfSDavid du Colombier sourceLen plus 8 bytes. Upon exit, destLen is the actual size of the 15*7dd7cddfSDavid du Colombier compressed buffer. 16*7dd7cddfSDavid du Colombier This function can be used to compress a whole file at once if the 17*7dd7cddfSDavid du Colombier input file is mmap'ed. 18*7dd7cddfSDavid du Colombier compress returns Z_OK if success, Z_MEM_ERROR if there was not 19*7dd7cddfSDavid du Colombier enough memory, Z_BUF_ERROR if there was not enough room in the output 20*7dd7cddfSDavid du Colombier buffer. 21*7dd7cddfSDavid du Colombier */ 22*7dd7cddfSDavid du Colombier int compress (dest, destLen, source, sourceLen) 23*7dd7cddfSDavid du Colombier Bytef *dest; 24*7dd7cddfSDavid du Colombier uLongf *destLen; 25*7dd7cddfSDavid du Colombier const Bytef *source; 26*7dd7cddfSDavid du Colombier uLong sourceLen; 27*7dd7cddfSDavid du Colombier { 28*7dd7cddfSDavid du Colombier z_stream stream; 29*7dd7cddfSDavid du Colombier int err; 30*7dd7cddfSDavid du Colombier 31*7dd7cddfSDavid du Colombier stream.next_in = (Bytef*)source; 32*7dd7cddfSDavid du Colombier stream.avail_in = (uInt)sourceLen; 33*7dd7cddfSDavid du Colombier #ifdef MAXSEG_64K 34*7dd7cddfSDavid du Colombier /* Check for source > 64K on 16-bit machine: */ 35*7dd7cddfSDavid du Colombier if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; 36*7dd7cddfSDavid du Colombier #endif 37*7dd7cddfSDavid du Colombier stream.next_out = dest; 38*7dd7cddfSDavid du Colombier stream.avail_out = (uInt)*destLen; 39*7dd7cddfSDavid du Colombier if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; 40*7dd7cddfSDavid du Colombier 41*7dd7cddfSDavid du Colombier stream.zalloc = (alloc_func)0; 42*7dd7cddfSDavid du Colombier stream.zfree = (free_func)0; 43*7dd7cddfSDavid du Colombier stream.opaque = (voidpf)0; 44*7dd7cddfSDavid du Colombier 45*7dd7cddfSDavid du Colombier err = deflateInit(&stream, Z_DEFAULT_COMPRESSION); 46*7dd7cddfSDavid du Colombier if (err != Z_OK) return err; 47*7dd7cddfSDavid du Colombier 48*7dd7cddfSDavid du Colombier err = deflate(&stream, Z_FINISH); 49*7dd7cddfSDavid du Colombier if (err != Z_STREAM_END) { 50*7dd7cddfSDavid du Colombier deflateEnd(&stream); 51*7dd7cddfSDavid du Colombier return err == Z_OK ? Z_BUF_ERROR : err; 52*7dd7cddfSDavid du Colombier } 53*7dd7cddfSDavid du Colombier *destLen = stream.total_out; 54*7dd7cddfSDavid du Colombier 55*7dd7cddfSDavid du Colombier err = deflateEnd(&stream); 56*7dd7cddfSDavid du Colombier return err; 57*7dd7cddfSDavid du Colombier } 58