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