compress.c revision 1.5 1 1.5 christos /* $NetBSD: compress.c,v 1.5 2024/09/22 19:12:27 christos Exp $ */
2 1.1 christos
3 1.1 christos /* compress.c -- compress a memory buffer
4 1.3 christos * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler
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.4 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.5 christos int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source,
25 1.5 christos uLong sourceLen, int level) {
26 1.1 christos z_stream stream;
27 1.1 christos int err;
28 1.3 christos const uInt max = (uInt)-1;
29 1.3 christos uLong left;
30 1.1 christos
31 1.3 christos left = *destLen;
32 1.3 christos *destLen = 0;
33 1.1 christos
34 1.1 christos stream.zalloc = (alloc_func)0;
35 1.1 christos stream.zfree = (free_func)0;
36 1.1 christos stream.opaque = (voidpf)0;
37 1.1 christos
38 1.1 christos err = deflateInit(&stream, level);
39 1.1 christos if (err != Z_OK) return err;
40 1.1 christos
41 1.3 christos stream.next_out = dest;
42 1.3 christos stream.avail_out = 0;
43 1.3 christos stream.next_in = __UNCONST(source);
44 1.3 christos stream.avail_in = 0;
45 1.3 christos
46 1.3 christos do {
47 1.3 christos if (stream.avail_out == 0) {
48 1.3 christos stream.avail_out = left > (uLong)max ? max : (uInt)left;
49 1.3 christos left -= stream.avail_out;
50 1.3 christos }
51 1.3 christos if (stream.avail_in == 0) {
52 1.3 christos stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
53 1.3 christos sourceLen -= stream.avail_in;
54 1.3 christos }
55 1.3 christos err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
56 1.3 christos } while (err == Z_OK);
57 1.3 christos
58 1.1 christos *destLen = stream.total_out;
59 1.3 christos deflateEnd(&stream);
60 1.3 christos return err == Z_STREAM_END ? Z_OK : err;
61 1.1 christos }
62 1.1 christos
63 1.1 christos /* ===========================================================================
64 1.1 christos */
65 1.5 christos int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source,
66 1.5 christos uLong sourceLen) {
67 1.1 christos return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
68 1.1 christos }
69 1.1 christos
70 1.1 christos /* ===========================================================================
71 1.1 christos If the default memLevel or windowBits for deflateInit() is changed, then
72 1.1 christos this function needs to be updated.
73 1.1 christos */
74 1.5 christos uLong ZEXPORT compressBound(uLong sourceLen) {
75 1.3 christos return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
76 1.3 christos (sourceLen >> 25) + 13;
77 1.1 christos }
78