compress.c 2.1 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 4 5
 * For conditions of distribution and use, see copyright notice in zlib.h 
 */

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

#include "zlib.h"

/* ===========================================================================
M
Mark Adler 已提交
11 12 13 14 15 16 17 18 19
     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 已提交
20
*/
M
Mark Adler 已提交
21
int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
M
Mark Adler 已提交
22 23
    Bytef *dest;
    uLongf *destLen;
M
Mark Adler 已提交
24
    const Bytef *source;
M
Mark Adler 已提交
25
    uLong sourceLen;
M
Mark Adler 已提交
26
    int level;
M
Mark Adler 已提交
27 28 29 30
{
    z_stream stream;
    int err;

M
Mark Adler 已提交
31
    stream.next_in = (Bytef*)source;
M
Mark Adler 已提交
32
    stream.avail_in = (uInt)sourceLen;
M
Mark Adler 已提交
33
#ifdef MAXSEG_64K
M
Mark Adler 已提交
34 35
    /* Check for source > 64K on 16-bit machine: */
    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
M
Mark Adler 已提交
36
#endif
M
Mark Adler 已提交
37 38 39 40 41 42
    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 已提交
43
    stream.opaque = (voidpf)0;
M
Mark Adler 已提交
44

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

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

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

/* ===========================================================================
 */
M
Mark Adler 已提交
61
int ZEXPORT compress (dest, destLen, source, sourceLen)
M
Mark Adler 已提交
62 63 64 65 66 67 68
    Bytef *dest;
    uLongf *destLen;
    const Bytef *source;
    uLong sourceLen;
{
    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
}