compress.c revision 1.1.1.1 1 1.1 christos /* $NetBSD: compress.c,v 1.1.1.1 2006/01/14 20:10:24 christos Exp $ */
2 1.1 christos
3 1.1 christos /* compress.c -- compress a memory buffer
4 1.1 christos * Copyright (C) 1995-2003 Jean-loup Gailly.
5 1.1 christos * For conditions of distribution and use, see copyright notice in zlib.h
6 1.1 christos */
7 1.1 christos
8 1.1 christos /* @(#) Id */
9 1.1 christos
10 1.1 christos #define ZLIB_INTERNAL
11 1.1 christos #include "zlib.h"
12 1.1 christos
13 1.1 christos /* ===========================================================================
14 1.1 christos Compresses the source buffer into the destination buffer. The level
15 1.1 christos parameter has the same meaning as in deflateInit. sourceLen is the byte
16 1.1 christos length of the source buffer. Upon entry, destLen is the total size of the
17 1.1 christos destination buffer, which must be at least 0.1% larger than sourceLen plus
18 1.1 christos 12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
19 1.1 christos
20 1.1 christos compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
21 1.1 christos memory, Z_BUF_ERROR if there was not enough room in the output buffer,
22 1.1 christos Z_STREAM_ERROR if the level parameter is invalid.
23 1.1 christos */
24 1.1 christos int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
25 1.1 christos Bytef *dest;
26 1.1 christos uLongf *destLen;
27 1.1 christos const Bytef *source;
28 1.1 christos uLong sourceLen;
29 1.1 christos int level;
30 1.1 christos {
31 1.1 christos z_stream stream;
32 1.1 christos int err;
33 1.1 christos
34 1.1 christos stream.next_in = (Bytef*)source;
35 1.1 christos stream.avail_in = (uInt)sourceLen;
36 1.1 christos #ifdef MAXSEG_64K
37 1.1 christos /* Check for source > 64K on 16-bit machine: */
38 1.1 christos if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
39 1.1 christos #endif
40 1.1 christos stream.next_out = dest;
41 1.1 christos stream.avail_out = (uInt)*destLen;
42 1.1 christos if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
43 1.1 christos
44 1.1 christos stream.zalloc = (alloc_func)0;
45 1.1 christos stream.zfree = (free_func)0;
46 1.1 christos stream.opaque = (voidpf)0;
47 1.1 christos
48 1.1 christos err = deflateInit(&stream, level);
49 1.1 christos if (err != Z_OK) return err;
50 1.1 christos
51 1.1 christos err = deflate(&stream, Z_FINISH);
52 1.1 christos if (err != Z_STREAM_END) {
53 1.1 christos deflateEnd(&stream);
54 1.1 christos return err == Z_OK ? Z_BUF_ERROR : err;
55 1.1 christos }
56 1.1 christos *destLen = stream.total_out;
57 1.1 christos
58 1.1 christos err = deflateEnd(&stream);
59 1.1 christos return err;
60 1.1 christos }
61 1.1 christos
62 1.1 christos /* ===========================================================================
63 1.1 christos */
64 1.1 christos int ZEXPORT compress (dest, destLen, source, sourceLen)
65 1.1 christos Bytef *dest;
66 1.1 christos uLongf *destLen;
67 1.1 christos const Bytef *source;
68 1.1 christos uLong sourceLen;
69 1.1 christos {
70 1.1 christos return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
71 1.1 christos }
72 1.1 christos
73 1.1 christos /* ===========================================================================
74 1.1 christos If the default memLevel or windowBits for deflateInit() is changed, then
75 1.1 christos this function needs to be updated.
76 1.1 christos */
77 1.1 christos uLong ZEXPORT compressBound (sourceLen)
78 1.1 christos uLong sourceLen;
79 1.1 christos {
80 1.1 christos return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11;
81 1.1 christos }
82