compress.c revision 1.4 1 1.4 christos /* $NetBSD: compress.c,v 1.4 2022/10/15 19:49:32 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.4 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.3 christos const uInt max = (uInt)-1;
34 1.3 christos uLong left;
35 1.1 christos
36 1.3 christos left = *destLen;
37 1.3 christos *destLen = 0;
38 1.1 christos
39 1.1 christos stream.zalloc = (alloc_func)0;
40 1.1 christos stream.zfree = (free_func)0;
41 1.1 christos stream.opaque = (voidpf)0;
42 1.1 christos
43 1.1 christos err = deflateInit(&stream, level);
44 1.1 christos if (err != Z_OK) return err;
45 1.1 christos
46 1.3 christos stream.next_out = dest;
47 1.3 christos stream.avail_out = 0;
48 1.3 christos stream.next_in = __UNCONST(source);
49 1.3 christos stream.avail_in = 0;
50 1.3 christos
51 1.3 christos do {
52 1.3 christos if (stream.avail_out == 0) {
53 1.3 christos stream.avail_out = left > (uLong)max ? max : (uInt)left;
54 1.3 christos left -= stream.avail_out;
55 1.3 christos }
56 1.3 christos if (stream.avail_in == 0) {
57 1.3 christos stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
58 1.3 christos sourceLen -= stream.avail_in;
59 1.3 christos }
60 1.3 christos err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
61 1.3 christos } while (err == Z_OK);
62 1.3 christos
63 1.1 christos *destLen = stream.total_out;
64 1.3 christos deflateEnd(&stream);
65 1.3 christos return err == Z_STREAM_END ? Z_OK : err;
66 1.1 christos }
67 1.1 christos
68 1.1 christos /* ===========================================================================
69 1.1 christos */
70 1.4 christos int ZEXPORT compress(dest, destLen, source, sourceLen)
71 1.1 christos Bytef *dest;
72 1.1 christos uLongf *destLen;
73 1.1 christos const Bytef *source;
74 1.1 christos uLong sourceLen;
75 1.1 christos {
76 1.1 christos return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
77 1.1 christos }
78 1.1 christos
79 1.1 christos /* ===========================================================================
80 1.1 christos If the default memLevel or windowBits for deflateInit() is changed, then
81 1.1 christos this function needs to be updated.
82 1.1 christos */
83 1.4 christos uLong ZEXPORT compressBound(sourceLen)
84 1.1 christos uLong sourceLen;
85 1.1 christos {
86 1.3 christos return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
87 1.3 christos (sourceLen >> 25) + 13;
88 1.1 christos }
89