17dd7cddfSDavid du Colombier /* compress.c -- compress a memory buffer
2*593dc095SDavid du Colombier * Copyright (C) 1995-2002 Jean-loup Gailly.
37dd7cddfSDavid du Colombier * For conditions of distribution and use, see copyright notice in zlib.h
47dd7cddfSDavid du Colombier */
57dd7cddfSDavid du Colombier
6*593dc095SDavid du Colombier /* @(#) $Id: compress.c,v 1.1.1.1 2005/04/24 21:39:38 giles Exp $ */
77dd7cddfSDavid du Colombier
8*593dc095SDavid du Colombier #define ZLIB_INTERNAL
97dd7cddfSDavid du Colombier #include "zlib.h"
107dd7cddfSDavid du Colombier
117dd7cddfSDavid du Colombier /* ===========================================================================
12*593dc095SDavid du Colombier Compresses the source buffer into the destination buffer. The level
13*593dc095SDavid du Colombier parameter has the same meaning as in deflateInit. sourceLen is the byte
14*593dc095SDavid du Colombier length of the source buffer. Upon entry, destLen is the total size of the
15*593dc095SDavid du Colombier destination buffer, which must be at least 0.1% larger than sourceLen plus
16*593dc095SDavid du Colombier 12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
17*593dc095SDavid du Colombier
18*593dc095SDavid du Colombier compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
19*593dc095SDavid du Colombier memory, Z_BUF_ERROR if there was not enough room in the output buffer,
20*593dc095SDavid du Colombier Z_STREAM_ERROR if the level parameter is invalid.
217dd7cddfSDavid du Colombier */
compress2(dest,destLen,source,sourceLen,level)22*593dc095SDavid du Colombier int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
237dd7cddfSDavid du Colombier Bytef *dest;
247dd7cddfSDavid du Colombier uLongf *destLen;
257dd7cddfSDavid du Colombier const Bytef *source;
267dd7cddfSDavid du Colombier uLong sourceLen;
27*593dc095SDavid du Colombier int level;
287dd7cddfSDavid du Colombier {
297dd7cddfSDavid du Colombier z_stream stream;
307dd7cddfSDavid du Colombier int err;
317dd7cddfSDavid du Colombier
327dd7cddfSDavid du Colombier stream.next_in = (Bytef*)source;
337dd7cddfSDavid du Colombier stream.avail_in = (uInt)sourceLen;
347dd7cddfSDavid du Colombier #ifdef MAXSEG_64K
357dd7cddfSDavid du Colombier /* Check for source > 64K on 16-bit machine: */
367dd7cddfSDavid du Colombier if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
377dd7cddfSDavid du Colombier #endif
387dd7cddfSDavid du Colombier stream.next_out = dest;
397dd7cddfSDavid du Colombier stream.avail_out = (uInt)*destLen;
407dd7cddfSDavid du Colombier if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
417dd7cddfSDavid du Colombier
427dd7cddfSDavid du Colombier stream.zalloc = (alloc_func)0;
437dd7cddfSDavid du Colombier stream.zfree = (free_func)0;
447dd7cddfSDavid du Colombier stream.opaque = (voidpf)0;
457dd7cddfSDavid du Colombier
46*593dc095SDavid du Colombier err = deflateInit(&stream, level);
477dd7cddfSDavid du Colombier if (err != Z_OK) return err;
487dd7cddfSDavid du Colombier
497dd7cddfSDavid du Colombier err = deflate(&stream, Z_FINISH);
507dd7cddfSDavid du Colombier if (err != Z_STREAM_END) {
517dd7cddfSDavid du Colombier deflateEnd(&stream);
527dd7cddfSDavid du Colombier return err == Z_OK ? Z_BUF_ERROR : err;
537dd7cddfSDavid du Colombier }
547dd7cddfSDavid du Colombier *destLen = stream.total_out;
557dd7cddfSDavid du Colombier
567dd7cddfSDavid du Colombier err = deflateEnd(&stream);
577dd7cddfSDavid du Colombier return err;
587dd7cddfSDavid du Colombier }
59*593dc095SDavid du Colombier
60*593dc095SDavid du Colombier /* ===========================================================================
61*593dc095SDavid du Colombier */
compress(dest,destLen,source,sourceLen)62*593dc095SDavid du Colombier int ZEXPORT compress (dest, destLen, source, sourceLen)
63*593dc095SDavid du Colombier Bytef *dest;
64*593dc095SDavid du Colombier uLongf *destLen;
65*593dc095SDavid du Colombier const Bytef *source;
66*593dc095SDavid du Colombier uLong sourceLen;
67*593dc095SDavid du Colombier {
68*593dc095SDavid du Colombier return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
69*593dc095SDavid du Colombier }
70*593dc095SDavid du Colombier
71*593dc095SDavid du Colombier /* ===========================================================================
72*593dc095SDavid du Colombier If the default memLevel or windowBits for deflateInit() is changed, then
73*593dc095SDavid du Colombier this function needs to be updated.
74*593dc095SDavid du Colombier */
compressBound(sourceLen)75*593dc095SDavid du Colombier uLong ZEXPORT compressBound (sourceLen)
76*593dc095SDavid du Colombier uLong sourceLen;
77*593dc095SDavid du Colombier {
78*593dc095SDavid du Colombier return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11;
79*593dc095SDavid du Colombier }
80