compress.c 2.4 KB
Newer Older
M
Mark Adler 已提交
1
/* compress.c -- compress a memory buffer
M
Mark Adler 已提交
2
 * Copyright (C) 1995-2002 Jean-loup Gailly.
M
Mark Adler 已提交
3
 * For conditions of distribution and use, see copyright notice in zlib.h
M
Mark Adler 已提交
4 5
 */

M
Mark Adler 已提交
6
/* @(#) $Id$ */
M
Mark Adler 已提交
7

M
Mark Adler 已提交
8
#define ZLIB_INTERNAL
M
Mark Adler 已提交
9 10 11
#include "zlib.h"

/* ===========================================================================
M
Mark Adler 已提交
12 13 14 15 16 17 18 19 20
     Compresses the source buffer into the destination buffer. The level
   parameter has the same meaning as in deflateInit.  sourceLen is the byte
   length of the source buffer. Upon entry, destLen is the total size of the
   destination buffer, which must be at least 0.1% larger than sourceLen plus
   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.

     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
   Z_STREAM_ERROR if the level parameter is invalid.
M
Mark Adler 已提交
21
*/
M
Mark Adler 已提交
22
int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
M
Mark Adler 已提交
23 24
    Bytef *dest;
    uLongf *destLen;
M
Mark Adler 已提交
25
    const Bytef *source;
M
Mark Adler 已提交
26
    uLong sourceLen;
M
Mark Adler 已提交
27
    int level;
M
Mark Adler 已提交
28 29 30 31
{
    z_stream stream;
    int err;

M
Mark Adler 已提交
32
    stream.next_in = (Bytef*)source;
M
Mark Adler 已提交
33
    stream.avail_in = (uInt)sourceLen;
M
Mark Adler 已提交
34
#ifdef MAXSEG_64K
M
Mark Adler 已提交
35 36
    /* Check for source > 64K on 16-bit machine: */
    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
M
Mark Adler 已提交
37
#endif
M
Mark Adler 已提交
38 39 40 41 42 43
    stream.next_out = dest;
    stream.avail_out = (uInt)*destLen;
    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;

    stream.zalloc = (alloc_func)0;
    stream.zfree = (free_func)0;
M
Mark Adler 已提交
44
    stream.opaque = (voidpf)0;
M
Mark Adler 已提交
45

M
Mark Adler 已提交
46
    err = deflateInit(&stream, level);
M
Mark Adler 已提交
47 48 49
    if (err != Z_OK) return err;

    err = deflate(&stream, Z_FINISH);
M
Mark Adler 已提交
50
    if (err != Z_STREAM_END) {
M
Mark Adler 已提交
51 52
        deflateEnd(&stream);
        return err == Z_OK ? Z_BUF_ERROR : err;
M
Mark Adler 已提交
53 54 55 56 57 58
    }
    *destLen = stream.total_out;

    err = deflateEnd(&stream);
    return err;
}
M
Mark Adler 已提交
59 60 61

/* ===========================================================================
 */
M
Mark Adler 已提交
62
int ZEXPORT compress (dest, destLen, source, sourceLen)
M
Mark Adler 已提交
63 64 65 66 67 68 69
    Bytef *dest;
    uLongf *destLen;
    const Bytef *source;
    uLong sourceLen;
{
    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
}
M
Mark Adler 已提交
70 71 72 73 74 75 76 77 78 79

/* ===========================================================================
     If the default memLevel or windowBits for deflateInit() is changed, then
   this function needs to be updated.
 */
uLong ZEXPORT compressBound (sourceLen)
    uLong sourceLen;
{
    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11;
}