compress.c 2.6 KB
Newer Older
M
Mark Adler 已提交
1
/* compress.c -- compress a memory buffer
2
 * Copyright (C) 1995-2005, 2014 Jean-loup Gailly, Mark Adler
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
{
    z_stream stream;
    int err;
31 32
    const uInt max = -1;
    uLong left;
M
Mark Adler 已提交
33

34 35
    left = *destLen;
    *destLen = 0;
M
Mark Adler 已提交
36 37 38

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

M
Mark Adler 已提交
41
    err = deflateInit(&stream, level);
M
Mark Adler 已提交
42 43
    if (err != Z_OK) return err;

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
    stream.next_out = dest;
    stream.avail_out = 0;
    stream.next_in = (z_const Bytef *)source;
    stream.avail_in = 0;

    do {
        if (stream.avail_out == 0) {
            stream.avail_out = left > (uLong)max ? max : (uInt)left;
            left -= stream.avail_out;
        }
        if (stream.avail_in == 0) {
            stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
            sourceLen -= stream.avail_in;
        }
        err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
    } while (err == Z_OK);
M
Mark Adler 已提交
60

61 62 63
    *destLen = stream.total_out;
    deflateEnd(&stream);
    return err == Z_STREAM_END ? Z_OK : err;
M
Mark Adler 已提交
64
}
M
Mark Adler 已提交
65 66 67

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

/* ===========================================================================
     If the default memLevel or windowBits for deflateInit() is changed, then
   this function needs to be updated.
 */
uLong ZEXPORT compressBound (sourceLen)
    uLong sourceLen;
{
M
Mark Adler 已提交
84 85
    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
           (sourceLen >> 25) + 13;
M
Mark Adler 已提交
86
}