1a19eddc3SBaptiste Daroussin /* example.c contains minimal changes required to be compiled with zlibWrapper:
2a19eddc3SBaptiste Daroussin * - #include "zlib.h" was changed to #include "zstd_zlibwrapper.h"
3a19eddc3SBaptiste Daroussin * - test_flush() and test_sync() use functions not supported by zlibWrapper
4a19eddc3SBaptiste Daroussin therefore they are disabled while zstd compression is turned on */
5a19eddc3SBaptiste Daroussin
6a19eddc3SBaptiste Daroussin /* example.c -- usage example of the zlib compression library
7a19eddc3SBaptiste Daroussin */
8a19eddc3SBaptiste Daroussin /*
9a19eddc3SBaptiste Daroussin Copyright (c) 1995-2006, 2011 Jean-loup Gailly
10a19eddc3SBaptiste Daroussin
11a19eddc3SBaptiste Daroussin This software is provided 'as-is', without any express or implied
12a19eddc3SBaptiste Daroussin warranty. In no event will the authors be held liable for any damages
13a19eddc3SBaptiste Daroussin arising from the use of this software.
14a19eddc3SBaptiste Daroussin
15a19eddc3SBaptiste Daroussin Permission is granted to anyone to use this software for any purpose,
16a19eddc3SBaptiste Daroussin including commercial applications, and to alter it and redistribute it
17a19eddc3SBaptiste Daroussin freely, subject to the following restrictions:
18a19eddc3SBaptiste Daroussin
19a19eddc3SBaptiste Daroussin 1. The origin of this software must not be misrepresented; you must not
20a19eddc3SBaptiste Daroussin claim that you wrote the original software. If you use this software
21a19eddc3SBaptiste Daroussin in a product, an acknowledgement in the product documentation would be
22a19eddc3SBaptiste Daroussin appreciated but is not required.
23a19eddc3SBaptiste Daroussin 2. Altered source versions must be plainly marked as such, and must not be
24a19eddc3SBaptiste Daroussin misrepresented as being the original software.
25a19eddc3SBaptiste Daroussin 3. This notice may not be removed or altered from any source distribution.
26a19eddc3SBaptiste Daroussin */
27a19eddc3SBaptiste Daroussin
28a19eddc3SBaptiste Daroussin /* @(#) $Id$ */
29a19eddc3SBaptiste Daroussin
30a19eddc3SBaptiste Daroussin #include "zstd_zlibwrapper.h"
31a19eddc3SBaptiste Daroussin #include <stdio.h>
32a19eddc3SBaptiste Daroussin
33a19eddc3SBaptiste Daroussin #ifdef STDC
34a19eddc3SBaptiste Daroussin # include <string.h>
35a19eddc3SBaptiste Daroussin # include <stdlib.h>
36a19eddc3SBaptiste Daroussin #endif
37a19eddc3SBaptiste Daroussin
38a19eddc3SBaptiste Daroussin #if defined(VMS) || defined(RISCOS)
39a19eddc3SBaptiste Daroussin # define TESTFILE "foo-gz"
40a19eddc3SBaptiste Daroussin #else
41a19eddc3SBaptiste Daroussin # define TESTFILE "foo.gz"
42a19eddc3SBaptiste Daroussin #endif
43a19eddc3SBaptiste Daroussin
44a19eddc3SBaptiste Daroussin #define CHECK_ERR(err, msg) { \
45a19eddc3SBaptiste Daroussin if (err != Z_OK) { \
46a19eddc3SBaptiste Daroussin fprintf(stderr, "%s error: %d\n", msg, err); \
47a19eddc3SBaptiste Daroussin exit(1); \
48a19eddc3SBaptiste Daroussin } \
49a19eddc3SBaptiste Daroussin }
50a19eddc3SBaptiste Daroussin
51a19eddc3SBaptiste Daroussin z_const char hello[] = "hello, hello! I said hello, hello!";
52a19eddc3SBaptiste Daroussin /* "hello world" would be more standard, but the repeated "hello"
53a19eddc3SBaptiste Daroussin * stresses the compression code better, sorry...
54a19eddc3SBaptiste Daroussin */
55a19eddc3SBaptiste Daroussin
56a19eddc3SBaptiste Daroussin const char dictionary[] = "hello, hello!";
57a19eddc3SBaptiste Daroussin uLong dictId; /* Adler32 value of the dictionary */
58a19eddc3SBaptiste Daroussin
59a19eddc3SBaptiste Daroussin void test_deflate OF((Byte *compr, uLong comprLen));
60a19eddc3SBaptiste Daroussin void test_inflate OF((Byte *compr, uLong comprLen,
61a19eddc3SBaptiste Daroussin Byte *uncompr, uLong uncomprLen));
62a19eddc3SBaptiste Daroussin void test_large_deflate OF((Byte *compr, uLong comprLen,
63a19eddc3SBaptiste Daroussin Byte *uncompr, uLong uncomprLen));
64a19eddc3SBaptiste Daroussin void test_large_inflate OF((Byte *compr, uLong comprLen,
65a19eddc3SBaptiste Daroussin Byte *uncompr, uLong uncomprLen));
66a19eddc3SBaptiste Daroussin void test_flush OF((Byte *compr, uLong *comprLen));
67a19eddc3SBaptiste Daroussin void test_sync OF((Byte *compr, uLong comprLen,
68a19eddc3SBaptiste Daroussin Byte *uncompr, uLong uncomprLen));
69a19eddc3SBaptiste Daroussin void test_dict_deflate OF((Byte *compr, uLong comprLen));
70a19eddc3SBaptiste Daroussin void test_dict_inflate OF((Byte *compr, uLong comprLen,
71a19eddc3SBaptiste Daroussin Byte *uncompr, uLong uncomprLen));
72a19eddc3SBaptiste Daroussin int main OF((int argc, char *argv[]));
73a19eddc3SBaptiste Daroussin
74a19eddc3SBaptiste Daroussin
75a19eddc3SBaptiste Daroussin #ifdef Z_SOLO
76a19eddc3SBaptiste Daroussin
77a19eddc3SBaptiste Daroussin void *myalloc OF((void *, unsigned, unsigned));
78a19eddc3SBaptiste Daroussin void myfree OF((void *, void *));
79a19eddc3SBaptiste Daroussin
myalloc(q,n,m)80a19eddc3SBaptiste Daroussin void *myalloc(q, n, m)
81a19eddc3SBaptiste Daroussin void *q;
82a19eddc3SBaptiste Daroussin unsigned n, m;
83a19eddc3SBaptiste Daroussin {
84a19eddc3SBaptiste Daroussin void *buf = calloc(n, m);
85a19eddc3SBaptiste Daroussin q = Z_NULL;
86a19eddc3SBaptiste Daroussin /* printf("myalloc %p n=%d m=%d\n", buf, n, m); */
87a19eddc3SBaptiste Daroussin return buf;
88a19eddc3SBaptiste Daroussin }
89a19eddc3SBaptiste Daroussin
myfree(void * q,void * p)90a19eddc3SBaptiste Daroussin void myfree(void *q, void *p)
91a19eddc3SBaptiste Daroussin {
92a19eddc3SBaptiste Daroussin /* printf("myfree %p\n", p); */
93a19eddc3SBaptiste Daroussin q = Z_NULL;
94a19eddc3SBaptiste Daroussin free(p);
95a19eddc3SBaptiste Daroussin }
96a19eddc3SBaptiste Daroussin
97a19eddc3SBaptiste Daroussin static alloc_func zalloc = myalloc;
98a19eddc3SBaptiste Daroussin static free_func zfree = myfree;
99a19eddc3SBaptiste Daroussin
100a19eddc3SBaptiste Daroussin #else /* !Z_SOLO */
101a19eddc3SBaptiste Daroussin
102a19eddc3SBaptiste Daroussin static alloc_func zalloc = (alloc_func)0;
103a19eddc3SBaptiste Daroussin static free_func zfree = (free_func)0;
104a19eddc3SBaptiste Daroussin
105a19eddc3SBaptiste Daroussin void test_compress OF((Byte *compr, uLong comprLen,
106a19eddc3SBaptiste Daroussin Byte *uncompr, uLong uncomprLen));
107a19eddc3SBaptiste Daroussin void test_gzio OF((const char *fname,
108a19eddc3SBaptiste Daroussin Byte *uncompr, uLong uncomprLen));
109a19eddc3SBaptiste Daroussin
110a19eddc3SBaptiste Daroussin /* ===========================================================================
111a19eddc3SBaptiste Daroussin * Test compress() and uncompress()
112a19eddc3SBaptiste Daroussin */
test_compress(compr,comprLen,uncompr,uncomprLen)113a19eddc3SBaptiste Daroussin void test_compress(compr, comprLen, uncompr, uncomprLen)
114a19eddc3SBaptiste Daroussin Byte *compr, *uncompr;
115a19eddc3SBaptiste Daroussin uLong comprLen, uncomprLen;
116a19eddc3SBaptiste Daroussin {
117a19eddc3SBaptiste Daroussin int err;
118a19eddc3SBaptiste Daroussin uLong len = (uLong)strlen(hello)+1;
119a19eddc3SBaptiste Daroussin
120a19eddc3SBaptiste Daroussin err = compress(compr, &comprLen, (const Bytef*)hello, len);
121a19eddc3SBaptiste Daroussin CHECK_ERR(err, "compress");
122a19eddc3SBaptiste Daroussin
123a19eddc3SBaptiste Daroussin strcpy((char*)uncompr, "garbage");
124a19eddc3SBaptiste Daroussin
125a19eddc3SBaptiste Daroussin err = uncompress(uncompr, &uncomprLen, compr, comprLen);
126a19eddc3SBaptiste Daroussin CHECK_ERR(err, "uncompress");
127a19eddc3SBaptiste Daroussin
128a19eddc3SBaptiste Daroussin if (strcmp((char*)uncompr, hello)) {
129a19eddc3SBaptiste Daroussin fprintf(stderr, "bad uncompress\n");
130a19eddc3SBaptiste Daroussin exit(1);
131a19eddc3SBaptiste Daroussin } else {
132a19eddc3SBaptiste Daroussin printf("uncompress(): %s\n", (char *)uncompr);
133a19eddc3SBaptiste Daroussin }
134a19eddc3SBaptiste Daroussin }
135a19eddc3SBaptiste Daroussin
136a19eddc3SBaptiste Daroussin /* ===========================================================================
137a19eddc3SBaptiste Daroussin * Test read/write of .gz files
138a19eddc3SBaptiste Daroussin */
test_gzio(fname,uncompr,uncomprLen)139a19eddc3SBaptiste Daroussin void test_gzio(fname, uncompr, uncomprLen)
140a19eddc3SBaptiste Daroussin const char *fname; /* compressed file name */
141a19eddc3SBaptiste Daroussin Byte *uncompr;
142a19eddc3SBaptiste Daroussin uLong uncomprLen;
143a19eddc3SBaptiste Daroussin {
144a19eddc3SBaptiste Daroussin #ifdef NO_GZCOMPRESS
145a19eddc3SBaptiste Daroussin fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n");
146a19eddc3SBaptiste Daroussin #else
147a19eddc3SBaptiste Daroussin int err;
148a19eddc3SBaptiste Daroussin int len = (int)strlen(hello)+1;
149a19eddc3SBaptiste Daroussin gzFile file;
150a19eddc3SBaptiste Daroussin z_off_t pos;
151a19eddc3SBaptiste Daroussin
152a19eddc3SBaptiste Daroussin file = gzopen(fname, "wb");
153a19eddc3SBaptiste Daroussin if (file == NULL) {
154a19eddc3SBaptiste Daroussin fprintf(stderr, "gzopen error\n");
155a19eddc3SBaptiste Daroussin exit(1);
156a19eddc3SBaptiste Daroussin }
157a19eddc3SBaptiste Daroussin gzputc(file, 'h');
158a19eddc3SBaptiste Daroussin if (gzputs(file, "ello") != 4) {
159a19eddc3SBaptiste Daroussin fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));
160a19eddc3SBaptiste Daroussin exit(1);
161a19eddc3SBaptiste Daroussin }
162a19eddc3SBaptiste Daroussin if (gzprintf(file, ", %s! I said hello, hello!", "hello") != 8+21) {
163a19eddc3SBaptiste Daroussin fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));
164a19eddc3SBaptiste Daroussin exit(1);
165a19eddc3SBaptiste Daroussin }
166a19eddc3SBaptiste Daroussin gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
167a19eddc3SBaptiste Daroussin gzclose(file);
168a19eddc3SBaptiste Daroussin
169a19eddc3SBaptiste Daroussin file = gzopen(fname, "rb");
170a19eddc3SBaptiste Daroussin if (file == NULL) {
171a19eddc3SBaptiste Daroussin fprintf(stderr, "gzopen error\n");
172a19eddc3SBaptiste Daroussin exit(1);
173a19eddc3SBaptiste Daroussin }
174a19eddc3SBaptiste Daroussin strcpy((char*)uncompr, "garbage");
175a19eddc3SBaptiste Daroussin
176a19eddc3SBaptiste Daroussin if (gzread(file, uncompr, (unsigned)uncomprLen) != len) {
177a19eddc3SBaptiste Daroussin fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
178a19eddc3SBaptiste Daroussin exit(1);
179a19eddc3SBaptiste Daroussin }
180a19eddc3SBaptiste Daroussin if (strcmp((char*)uncompr, hello)) {
181a19eddc3SBaptiste Daroussin fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
182a19eddc3SBaptiste Daroussin exit(1);
183a19eddc3SBaptiste Daroussin } else {
184a19eddc3SBaptiste Daroussin printf("gzread(): %s\n", (char*)uncompr);
185a19eddc3SBaptiste Daroussin }
186a19eddc3SBaptiste Daroussin
187a19eddc3SBaptiste Daroussin pos = gzseek(file, -8L, SEEK_CUR);
188a19eddc3SBaptiste Daroussin if (pos != 6+21 || gztell(file) != pos) {
189a19eddc3SBaptiste Daroussin fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",
190a19eddc3SBaptiste Daroussin (long)pos, (long)gztell(file));
191a19eddc3SBaptiste Daroussin exit(1);
192a19eddc3SBaptiste Daroussin }
193a19eddc3SBaptiste Daroussin
194a19eddc3SBaptiste Daroussin if (gzgetc(file) != ' ') {
195a19eddc3SBaptiste Daroussin fprintf(stderr, "gzgetc error\n");
196a19eddc3SBaptiste Daroussin exit(1);
197a19eddc3SBaptiste Daroussin }
198a19eddc3SBaptiste Daroussin
199a19eddc3SBaptiste Daroussin if (gzungetc(' ', file) != ' ') {
200a19eddc3SBaptiste Daroussin fprintf(stderr, "gzungetc error\n");
201a19eddc3SBaptiste Daroussin exit(1);
202a19eddc3SBaptiste Daroussin }
203a19eddc3SBaptiste Daroussin
204a19eddc3SBaptiste Daroussin gzgets(file, (char*)uncompr, (int)uncomprLen);
205a19eddc3SBaptiste Daroussin if (strlen((char*)uncompr) != 7) { /* " hello!" */
206a19eddc3SBaptiste Daroussin fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
207a19eddc3SBaptiste Daroussin exit(1);
208a19eddc3SBaptiste Daroussin }
209a19eddc3SBaptiste Daroussin if (strcmp((char*)uncompr, hello + 6+21)) {
210a19eddc3SBaptiste Daroussin fprintf(stderr, "bad gzgets after gzseek\n");
211a19eddc3SBaptiste Daroussin exit(1);
212a19eddc3SBaptiste Daroussin } else {
213a19eddc3SBaptiste Daroussin printf("gzgets() after gzseek: %s\n", (char*)uncompr);
214a19eddc3SBaptiste Daroussin }
215a19eddc3SBaptiste Daroussin
216a19eddc3SBaptiste Daroussin gzclose(file);
217a19eddc3SBaptiste Daroussin #endif
218a19eddc3SBaptiste Daroussin }
219a19eddc3SBaptiste Daroussin
220a19eddc3SBaptiste Daroussin #endif /* Z_SOLO */
221a19eddc3SBaptiste Daroussin
222a19eddc3SBaptiste Daroussin /* ===========================================================================
223a19eddc3SBaptiste Daroussin * Test deflate() with small buffers
224a19eddc3SBaptiste Daroussin */
test_deflate(compr,comprLen)225a19eddc3SBaptiste Daroussin void test_deflate(compr, comprLen)
226a19eddc3SBaptiste Daroussin Byte *compr;
227a19eddc3SBaptiste Daroussin uLong comprLen;
228a19eddc3SBaptiste Daroussin {
229a19eddc3SBaptiste Daroussin z_stream c_stream; /* compression stream */
230a19eddc3SBaptiste Daroussin int err;
231a19eddc3SBaptiste Daroussin uLong len = (uLong)strlen(hello)+1;
232a19eddc3SBaptiste Daroussin
233a19eddc3SBaptiste Daroussin c_stream.zalloc = zalloc;
234a19eddc3SBaptiste Daroussin c_stream.zfree = zfree;
235a19eddc3SBaptiste Daroussin c_stream.opaque = (voidpf)0;
236a19eddc3SBaptiste Daroussin
237a19eddc3SBaptiste Daroussin err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
238a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflateInit");
239a19eddc3SBaptiste Daroussin
240a19eddc3SBaptiste Daroussin c_stream.next_in = (z_const unsigned char *)hello;
241a19eddc3SBaptiste Daroussin c_stream.next_out = compr;
242a19eddc3SBaptiste Daroussin
243a19eddc3SBaptiste Daroussin while (c_stream.total_in != len && c_stream.total_out < comprLen) {
244a19eddc3SBaptiste Daroussin c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
245a19eddc3SBaptiste Daroussin err = deflate(&c_stream, Z_NO_FLUSH);
246a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflate");
247a19eddc3SBaptiste Daroussin }
248a19eddc3SBaptiste Daroussin /* Finish the stream, still forcing small buffers: */
249a19eddc3SBaptiste Daroussin for (;;) {
250a19eddc3SBaptiste Daroussin c_stream.avail_out = 1;
251a19eddc3SBaptiste Daroussin err = deflate(&c_stream, Z_FINISH);
252a19eddc3SBaptiste Daroussin if (err == Z_STREAM_END) break;
253a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflate");
254a19eddc3SBaptiste Daroussin }
255a19eddc3SBaptiste Daroussin
256a19eddc3SBaptiste Daroussin err = deflateEnd(&c_stream);
257a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflateEnd");
258a19eddc3SBaptiste Daroussin }
259a19eddc3SBaptiste Daroussin
260a19eddc3SBaptiste Daroussin /* ===========================================================================
261a19eddc3SBaptiste Daroussin * Test inflate() with small buffers
262a19eddc3SBaptiste Daroussin */
test_inflate(compr,comprLen,uncompr,uncomprLen)263a19eddc3SBaptiste Daroussin void test_inflate(compr, comprLen, uncompr, uncomprLen)
264a19eddc3SBaptiste Daroussin Byte *compr, *uncompr;
265a19eddc3SBaptiste Daroussin uLong comprLen, uncomprLen;
266a19eddc3SBaptiste Daroussin {
267a19eddc3SBaptiste Daroussin int err;
268a19eddc3SBaptiste Daroussin z_stream d_stream; /* decompression stream */
269a19eddc3SBaptiste Daroussin
270a19eddc3SBaptiste Daroussin strcpy((char*)uncompr, "garbage");
271a19eddc3SBaptiste Daroussin
272a19eddc3SBaptiste Daroussin d_stream.zalloc = zalloc;
273a19eddc3SBaptiste Daroussin d_stream.zfree = zfree;
274a19eddc3SBaptiste Daroussin d_stream.opaque = (voidpf)0;
275a19eddc3SBaptiste Daroussin
276a19eddc3SBaptiste Daroussin d_stream.next_in = compr;
277a19eddc3SBaptiste Daroussin d_stream.avail_in = 0;
278a19eddc3SBaptiste Daroussin d_stream.next_out = uncompr;
279a19eddc3SBaptiste Daroussin
280a19eddc3SBaptiste Daroussin err = inflateInit(&d_stream);
281a19eddc3SBaptiste Daroussin CHECK_ERR(err, "inflateInit");
282a19eddc3SBaptiste Daroussin
283a19eddc3SBaptiste Daroussin while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
284a19eddc3SBaptiste Daroussin d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
285a19eddc3SBaptiste Daroussin err = inflate(&d_stream, Z_NO_FLUSH);
286a19eddc3SBaptiste Daroussin if (err == Z_STREAM_END) break;
287a19eddc3SBaptiste Daroussin CHECK_ERR(err, "inflate");
288a19eddc3SBaptiste Daroussin }
289a19eddc3SBaptiste Daroussin
290a19eddc3SBaptiste Daroussin err = inflateEnd(&d_stream);
291a19eddc3SBaptiste Daroussin CHECK_ERR(err, "inflateEnd");
292a19eddc3SBaptiste Daroussin
293a19eddc3SBaptiste Daroussin if (strcmp((char*)uncompr, hello)) {
294a19eddc3SBaptiste Daroussin fprintf(stderr, "bad inflate\n");
295a19eddc3SBaptiste Daroussin exit(1);
296a19eddc3SBaptiste Daroussin } else {
297a19eddc3SBaptiste Daroussin printf("inflate(): %s\n", (char *)uncompr);
298a19eddc3SBaptiste Daroussin }
299a19eddc3SBaptiste Daroussin }
300a19eddc3SBaptiste Daroussin
301a19eddc3SBaptiste Daroussin /* ===========================================================================
302a19eddc3SBaptiste Daroussin * Test deflate() with large buffers and dynamic change of compression level
303a19eddc3SBaptiste Daroussin */
test_large_deflate(compr,comprLen,uncompr,uncomprLen)304a19eddc3SBaptiste Daroussin void test_large_deflate(compr, comprLen, uncompr, uncomprLen)
305a19eddc3SBaptiste Daroussin Byte *compr, *uncompr;
306a19eddc3SBaptiste Daroussin uLong comprLen, uncomprLen;
307a19eddc3SBaptiste Daroussin {
308a19eddc3SBaptiste Daroussin z_stream c_stream; /* compression stream */
309a19eddc3SBaptiste Daroussin int err;
310a19eddc3SBaptiste Daroussin
311a19eddc3SBaptiste Daroussin c_stream.zalloc = zalloc;
312a19eddc3SBaptiste Daroussin c_stream.zfree = zfree;
313a19eddc3SBaptiste Daroussin c_stream.opaque = (voidpf)0;
314a19eddc3SBaptiste Daroussin
315a19eddc3SBaptiste Daroussin err = deflateInit(&c_stream, Z_BEST_SPEED);
316a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflateInit");
317a19eddc3SBaptiste Daroussin
318a19eddc3SBaptiste Daroussin c_stream.next_out = compr;
319a19eddc3SBaptiste Daroussin c_stream.avail_out = (uInt)comprLen;
320a19eddc3SBaptiste Daroussin
321a19eddc3SBaptiste Daroussin /* At this point, uncompr is still mostly zeroes, so it should compress
322a19eddc3SBaptiste Daroussin * very well:
323a19eddc3SBaptiste Daroussin */
324a19eddc3SBaptiste Daroussin c_stream.next_in = uncompr;
325a19eddc3SBaptiste Daroussin c_stream.avail_in = (uInt)uncomprLen;
326a19eddc3SBaptiste Daroussin err = deflate(&c_stream, Z_NO_FLUSH);
327a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflate");
328a19eddc3SBaptiste Daroussin if (c_stream.avail_in != 0) {
329a19eddc3SBaptiste Daroussin fprintf(stderr, "deflate not greedy\n");
330a19eddc3SBaptiste Daroussin exit(1);
331a19eddc3SBaptiste Daroussin }
332a19eddc3SBaptiste Daroussin
333a19eddc3SBaptiste Daroussin /* Feed in already compressed data and switch to no compression: */
334a19eddc3SBaptiste Daroussin deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
335a19eddc3SBaptiste Daroussin c_stream.next_in = compr;
336a19eddc3SBaptiste Daroussin c_stream.avail_in = (uInt)comprLen/2;
337a19eddc3SBaptiste Daroussin err = deflate(&c_stream, Z_NO_FLUSH);
338a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflate");
339a19eddc3SBaptiste Daroussin
340a19eddc3SBaptiste Daroussin /* Switch back to compressing mode: */
341a19eddc3SBaptiste Daroussin deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
342a19eddc3SBaptiste Daroussin c_stream.next_in = uncompr;
343a19eddc3SBaptiste Daroussin c_stream.avail_in = (uInt)uncomprLen;
344a19eddc3SBaptiste Daroussin err = deflate(&c_stream, Z_NO_FLUSH);
345a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflate");
346a19eddc3SBaptiste Daroussin
347a19eddc3SBaptiste Daroussin err = deflate(&c_stream, Z_FINISH);
348a19eddc3SBaptiste Daroussin if (err != Z_STREAM_END) {
349a19eddc3SBaptiste Daroussin fprintf(stderr, "deflate should report Z_STREAM_END\n");
350a19eddc3SBaptiste Daroussin exit(1);
351a19eddc3SBaptiste Daroussin }
352a19eddc3SBaptiste Daroussin err = deflateEnd(&c_stream);
353a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflateEnd");
354a19eddc3SBaptiste Daroussin }
355a19eddc3SBaptiste Daroussin
356a19eddc3SBaptiste Daroussin /* ===========================================================================
357a19eddc3SBaptiste Daroussin * Test inflate() with large buffers
358a19eddc3SBaptiste Daroussin */
test_large_inflate(compr,comprLen,uncompr,uncomprLen)359a19eddc3SBaptiste Daroussin void test_large_inflate(compr, comprLen, uncompr, uncomprLen)
360a19eddc3SBaptiste Daroussin Byte *compr, *uncompr;
361a19eddc3SBaptiste Daroussin uLong comprLen, uncomprLen;
362a19eddc3SBaptiste Daroussin {
363a19eddc3SBaptiste Daroussin int err;
364a19eddc3SBaptiste Daroussin z_stream d_stream; /* decompression stream */
365a19eddc3SBaptiste Daroussin
366a19eddc3SBaptiste Daroussin strcpy((char*)uncompr, "garbage");
367a19eddc3SBaptiste Daroussin
368a19eddc3SBaptiste Daroussin d_stream.zalloc = zalloc;
369a19eddc3SBaptiste Daroussin d_stream.zfree = zfree;
370a19eddc3SBaptiste Daroussin d_stream.opaque = (voidpf)0;
371a19eddc3SBaptiste Daroussin
372a19eddc3SBaptiste Daroussin d_stream.next_in = compr;
373a19eddc3SBaptiste Daroussin d_stream.avail_in = (uInt)comprLen;
374a19eddc3SBaptiste Daroussin
375a19eddc3SBaptiste Daroussin err = inflateInit(&d_stream);
376a19eddc3SBaptiste Daroussin CHECK_ERR(err, "inflateInit");
377a19eddc3SBaptiste Daroussin
378a19eddc3SBaptiste Daroussin for (;;) {
379a19eddc3SBaptiste Daroussin d_stream.next_out = uncompr; /* discard the output */
380a19eddc3SBaptiste Daroussin d_stream.avail_out = (uInt)uncomprLen;
381a19eddc3SBaptiste Daroussin err = inflate(&d_stream, Z_NO_FLUSH);
382a19eddc3SBaptiste Daroussin if (err == Z_STREAM_END) break;
383a19eddc3SBaptiste Daroussin CHECK_ERR(err, "large inflate");
384a19eddc3SBaptiste Daroussin }
385a19eddc3SBaptiste Daroussin
386a19eddc3SBaptiste Daroussin err = inflateEnd(&d_stream);
387a19eddc3SBaptiste Daroussin CHECK_ERR(err, "inflateEnd");
388a19eddc3SBaptiste Daroussin
389a19eddc3SBaptiste Daroussin if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
390a19eddc3SBaptiste Daroussin fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
391a19eddc3SBaptiste Daroussin exit(1);
392a19eddc3SBaptiste Daroussin } else {
393a19eddc3SBaptiste Daroussin printf("large_inflate(): OK\n");
394a19eddc3SBaptiste Daroussin }
395a19eddc3SBaptiste Daroussin }
396a19eddc3SBaptiste Daroussin
397a19eddc3SBaptiste Daroussin /* ===========================================================================
398a19eddc3SBaptiste Daroussin * Test deflate() with full flush
399a19eddc3SBaptiste Daroussin */
test_flush(compr,comprLen)400a19eddc3SBaptiste Daroussin void test_flush(compr, comprLen)
401a19eddc3SBaptiste Daroussin Byte *compr;
402a19eddc3SBaptiste Daroussin uLong *comprLen;
403a19eddc3SBaptiste Daroussin {
404a19eddc3SBaptiste Daroussin z_stream c_stream; /* compression stream */
405a19eddc3SBaptiste Daroussin int err;
406a19eddc3SBaptiste Daroussin uInt len = (uInt)strlen(hello)+1;
407a19eddc3SBaptiste Daroussin
408a19eddc3SBaptiste Daroussin c_stream.zalloc = zalloc;
409a19eddc3SBaptiste Daroussin c_stream.zfree = zfree;
410a19eddc3SBaptiste Daroussin c_stream.opaque = (voidpf)0;
411a19eddc3SBaptiste Daroussin
412a19eddc3SBaptiste Daroussin err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
413a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflateInit");
414a19eddc3SBaptiste Daroussin
415a19eddc3SBaptiste Daroussin c_stream.next_in = (z_const unsigned char *)hello;
416a19eddc3SBaptiste Daroussin c_stream.next_out = compr;
417a19eddc3SBaptiste Daroussin c_stream.avail_in = 3;
418a19eddc3SBaptiste Daroussin c_stream.avail_out = (uInt)*comprLen;
419a19eddc3SBaptiste Daroussin err = deflate(&c_stream, Z_FULL_FLUSH);
420a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflate");
421a19eddc3SBaptiste Daroussin
422a19eddc3SBaptiste Daroussin compr[3]++; /* force an error in first compressed block */
423a19eddc3SBaptiste Daroussin c_stream.avail_in = len - 3;
424a19eddc3SBaptiste Daroussin
425a19eddc3SBaptiste Daroussin err = deflate(&c_stream, Z_FINISH);
426a19eddc3SBaptiste Daroussin if (err != Z_STREAM_END) {
427a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflate");
428a19eddc3SBaptiste Daroussin }
429a19eddc3SBaptiste Daroussin err = deflateEnd(&c_stream);
430a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflateEnd");
431a19eddc3SBaptiste Daroussin
432a19eddc3SBaptiste Daroussin *comprLen = c_stream.total_out;
433a19eddc3SBaptiste Daroussin }
434a19eddc3SBaptiste Daroussin
435a19eddc3SBaptiste Daroussin /* ===========================================================================
436a19eddc3SBaptiste Daroussin * Test inflateSync()
437a19eddc3SBaptiste Daroussin */
test_sync(compr,comprLen,uncompr,uncomprLen)438a19eddc3SBaptiste Daroussin void test_sync(compr, comprLen, uncompr, uncomprLen)
439a19eddc3SBaptiste Daroussin Byte *compr, *uncompr;
440a19eddc3SBaptiste Daroussin uLong comprLen, uncomprLen;
441a19eddc3SBaptiste Daroussin {
442a19eddc3SBaptiste Daroussin int err;
443a19eddc3SBaptiste Daroussin z_stream d_stream; /* decompression stream */
444a19eddc3SBaptiste Daroussin
445a19eddc3SBaptiste Daroussin strcpy((char*)uncompr, "garbage");
446a19eddc3SBaptiste Daroussin
447a19eddc3SBaptiste Daroussin d_stream.zalloc = zalloc;
448a19eddc3SBaptiste Daroussin d_stream.zfree = zfree;
449a19eddc3SBaptiste Daroussin d_stream.opaque = (voidpf)0;
450a19eddc3SBaptiste Daroussin
451a19eddc3SBaptiste Daroussin d_stream.next_in = compr;
452a19eddc3SBaptiste Daroussin d_stream.avail_in = 2; /* just read the zlib header */
453a19eddc3SBaptiste Daroussin
454a19eddc3SBaptiste Daroussin err = inflateInit(&d_stream);
455a19eddc3SBaptiste Daroussin CHECK_ERR(err, "inflateInit");
456a19eddc3SBaptiste Daroussin
457a19eddc3SBaptiste Daroussin d_stream.next_out = uncompr;
458a19eddc3SBaptiste Daroussin d_stream.avail_out = (uInt)uncomprLen;
459a19eddc3SBaptiste Daroussin
460a19eddc3SBaptiste Daroussin inflate(&d_stream, Z_NO_FLUSH);
461a19eddc3SBaptiste Daroussin CHECK_ERR(err, "inflate");
462a19eddc3SBaptiste Daroussin
463a19eddc3SBaptiste Daroussin d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */
464a19eddc3SBaptiste Daroussin err = inflateSync(&d_stream); /* but skip the damaged part */
465a19eddc3SBaptiste Daroussin CHECK_ERR(err, "inflateSync");
466a19eddc3SBaptiste Daroussin
467a19eddc3SBaptiste Daroussin err = inflate(&d_stream, Z_FINISH);
468a19eddc3SBaptiste Daroussin if (err != Z_DATA_ERROR) {
469a19eddc3SBaptiste Daroussin fprintf(stderr, "inflate should report DATA_ERROR\n");
470a19eddc3SBaptiste Daroussin /* Because of incorrect adler32 */
471a19eddc3SBaptiste Daroussin exit(1);
472a19eddc3SBaptiste Daroussin }
473a19eddc3SBaptiste Daroussin err = inflateEnd(&d_stream);
474a19eddc3SBaptiste Daroussin CHECK_ERR(err, "inflateEnd");
475a19eddc3SBaptiste Daroussin
476a19eddc3SBaptiste Daroussin printf("after inflateSync(): hel%s\n", (char *)uncompr);
477a19eddc3SBaptiste Daroussin }
478a19eddc3SBaptiste Daroussin
479a19eddc3SBaptiste Daroussin /* ===========================================================================
480a19eddc3SBaptiste Daroussin * Test deflate() with preset dictionary
481a19eddc3SBaptiste Daroussin */
test_dict_deflate(compr,comprLen)482a19eddc3SBaptiste Daroussin void test_dict_deflate(compr, comprLen)
483a19eddc3SBaptiste Daroussin Byte *compr;
484a19eddc3SBaptiste Daroussin uLong comprLen;
485a19eddc3SBaptiste Daroussin {
486a19eddc3SBaptiste Daroussin z_stream c_stream; /* compression stream */
487a19eddc3SBaptiste Daroussin int err;
488a19eddc3SBaptiste Daroussin
489a19eddc3SBaptiste Daroussin c_stream.zalloc = zalloc;
490a19eddc3SBaptiste Daroussin c_stream.zfree = zfree;
491a19eddc3SBaptiste Daroussin c_stream.opaque = (voidpf)0;
492a19eddc3SBaptiste Daroussin
493a19eddc3SBaptiste Daroussin err = deflateInit(&c_stream, Z_BEST_COMPRESSION);
494a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflateInit");
495a19eddc3SBaptiste Daroussin
496a19eddc3SBaptiste Daroussin err = deflateSetDictionary(&c_stream,
497a19eddc3SBaptiste Daroussin (const Bytef*)dictionary, (int)sizeof(dictionary));
498a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflateSetDictionary");
499a19eddc3SBaptiste Daroussin
500a19eddc3SBaptiste Daroussin dictId = c_stream.adler;
501a19eddc3SBaptiste Daroussin c_stream.next_out = compr;
502a19eddc3SBaptiste Daroussin c_stream.avail_out = (uInt)comprLen;
503a19eddc3SBaptiste Daroussin
504a19eddc3SBaptiste Daroussin c_stream.next_in = (z_const unsigned char *)hello;
505a19eddc3SBaptiste Daroussin c_stream.avail_in = (uInt)strlen(hello)+1;
506a19eddc3SBaptiste Daroussin
507a19eddc3SBaptiste Daroussin err = deflate(&c_stream, Z_FINISH);
508a19eddc3SBaptiste Daroussin if (err != Z_STREAM_END) {
509a19eddc3SBaptiste Daroussin fprintf(stderr, "deflate should report Z_STREAM_END\n");
510a19eddc3SBaptiste Daroussin exit(1);
511a19eddc3SBaptiste Daroussin }
512a19eddc3SBaptiste Daroussin err = deflateEnd(&c_stream);
513a19eddc3SBaptiste Daroussin CHECK_ERR(err, "deflateEnd");
514a19eddc3SBaptiste Daroussin }
515a19eddc3SBaptiste Daroussin
516a19eddc3SBaptiste Daroussin /* ===========================================================================
517a19eddc3SBaptiste Daroussin * Test inflate() with a preset dictionary
518a19eddc3SBaptiste Daroussin */
test_dict_inflate(compr,comprLen,uncompr,uncomprLen)519a19eddc3SBaptiste Daroussin void test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
520a19eddc3SBaptiste Daroussin Byte *compr, *uncompr;
521a19eddc3SBaptiste Daroussin uLong comprLen, uncomprLen;
522a19eddc3SBaptiste Daroussin {
523a19eddc3SBaptiste Daroussin int err;
524a19eddc3SBaptiste Daroussin z_stream d_stream; /* decompression stream */
525a19eddc3SBaptiste Daroussin
526a19eddc3SBaptiste Daroussin strcpy((char*)uncompr, "garbage");
527a19eddc3SBaptiste Daroussin
528a19eddc3SBaptiste Daroussin d_stream.zalloc = zalloc;
529a19eddc3SBaptiste Daroussin d_stream.zfree = zfree;
530a19eddc3SBaptiste Daroussin d_stream.opaque = (voidpf)0;
531a19eddc3SBaptiste Daroussin
532a19eddc3SBaptiste Daroussin d_stream.next_in = compr;
533a19eddc3SBaptiste Daroussin d_stream.avail_in = (uInt)comprLen;
534a19eddc3SBaptiste Daroussin
535a19eddc3SBaptiste Daroussin err = inflateInit(&d_stream);
536a19eddc3SBaptiste Daroussin CHECK_ERR(err, "inflateInit");
537a19eddc3SBaptiste Daroussin
538a19eddc3SBaptiste Daroussin d_stream.next_out = uncompr;
539a19eddc3SBaptiste Daroussin d_stream.avail_out = (uInt)uncomprLen;
540a19eddc3SBaptiste Daroussin
541a19eddc3SBaptiste Daroussin for (;;) {
542a19eddc3SBaptiste Daroussin err = inflate(&d_stream, Z_NO_FLUSH);
543a19eddc3SBaptiste Daroussin if (err == Z_STREAM_END) break;
544a19eddc3SBaptiste Daroussin if (err == Z_NEED_DICT) {
545a19eddc3SBaptiste Daroussin if (d_stream.adler != dictId) {
546a19eddc3SBaptiste Daroussin fprintf(stderr, "unexpected dictionary");
547a19eddc3SBaptiste Daroussin exit(1);
548a19eddc3SBaptiste Daroussin }
549a19eddc3SBaptiste Daroussin err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,
550a19eddc3SBaptiste Daroussin (int)sizeof(dictionary));
551a19eddc3SBaptiste Daroussin }
552a19eddc3SBaptiste Daroussin CHECK_ERR(err, "inflate with dict");
553a19eddc3SBaptiste Daroussin }
554a19eddc3SBaptiste Daroussin
555a19eddc3SBaptiste Daroussin err = inflateEnd(&d_stream);
556a19eddc3SBaptiste Daroussin CHECK_ERR(err, "inflateEnd");
557a19eddc3SBaptiste Daroussin
558a19eddc3SBaptiste Daroussin if (strcmp((char*)uncompr, hello)) {
559a19eddc3SBaptiste Daroussin fprintf(stderr, "bad inflate with dict\n");
560a19eddc3SBaptiste Daroussin exit(1);
561a19eddc3SBaptiste Daroussin } else {
562a19eddc3SBaptiste Daroussin printf("inflate with dictionary: %s\n", (char *)uncompr);
563a19eddc3SBaptiste Daroussin }
564a19eddc3SBaptiste Daroussin }
565a19eddc3SBaptiste Daroussin
566a19eddc3SBaptiste Daroussin /* ===========================================================================
567a19eddc3SBaptiste Daroussin * Usage: example [output.gz [input.gz]]
568a19eddc3SBaptiste Daroussin */
569a19eddc3SBaptiste Daroussin
main(argc,argv)570a19eddc3SBaptiste Daroussin int main(argc, argv)
571a19eddc3SBaptiste Daroussin int argc;
572a19eddc3SBaptiste Daroussin char *argv[];
573a19eddc3SBaptiste Daroussin {
574a19eddc3SBaptiste Daroussin Byte *compr, *uncompr;
575a19eddc3SBaptiste Daroussin uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
576a19eddc3SBaptiste Daroussin uLong uncomprLen = comprLen;
577a19eddc3SBaptiste Daroussin static const char* myVersion = ZLIB_VERSION;
578a19eddc3SBaptiste Daroussin
579a19eddc3SBaptiste Daroussin if (zlibVersion()[0] != myVersion[0]) {
580a19eddc3SBaptiste Daroussin fprintf(stderr, "incompatible zlib version\n");
581a19eddc3SBaptiste Daroussin exit(1);
582a19eddc3SBaptiste Daroussin
583a19eddc3SBaptiste Daroussin } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
584a19eddc3SBaptiste Daroussin fprintf(stderr, "warning: different zlib version\n");
585a19eddc3SBaptiste Daroussin }
586a19eddc3SBaptiste Daroussin
587a19eddc3SBaptiste Daroussin printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n",
588a19eddc3SBaptiste Daroussin ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags());
589a19eddc3SBaptiste Daroussin if (ZWRAP_isUsingZSTDcompression()) printf("zstd version %s\n", zstdVersion());
590a19eddc3SBaptiste Daroussin
591a19eddc3SBaptiste Daroussin compr = (Byte*)calloc((uInt)comprLen, 1);
592a19eddc3SBaptiste Daroussin uncompr = (Byte*)calloc((uInt)uncomprLen, 1);
593a19eddc3SBaptiste Daroussin /* compr and uncompr are cleared to avoid reading uninitialized
594a19eddc3SBaptiste Daroussin * data and to ensure that uncompr compresses well.
595a19eddc3SBaptiste Daroussin */
596a19eddc3SBaptiste Daroussin if (compr == Z_NULL || uncompr == Z_NULL) {
597a19eddc3SBaptiste Daroussin printf("out of memory\n");
598a19eddc3SBaptiste Daroussin exit(1);
599a19eddc3SBaptiste Daroussin }
600a19eddc3SBaptiste Daroussin
601a19eddc3SBaptiste Daroussin #ifdef Z_SOLO
602a19eddc3SBaptiste Daroussin argc = strlen(argv[0]);
603a19eddc3SBaptiste Daroussin #else
604a19eddc3SBaptiste Daroussin test_compress(compr, comprLen, uncompr, uncomprLen);
605a19eddc3SBaptiste Daroussin
606a19eddc3SBaptiste Daroussin test_gzio((argc > 1 ? argv[1] : TESTFILE),
607a19eddc3SBaptiste Daroussin uncompr, uncomprLen);
608a19eddc3SBaptiste Daroussin #endif
609a19eddc3SBaptiste Daroussin
610a19eddc3SBaptiste Daroussin test_deflate(compr, comprLen);
611a19eddc3SBaptiste Daroussin test_inflate(compr, comprLen, uncompr, uncomprLen);
612a19eddc3SBaptiste Daroussin
613a19eddc3SBaptiste Daroussin test_large_deflate(compr, comprLen, uncompr, uncomprLen);
614a19eddc3SBaptiste Daroussin test_large_inflate(compr, comprLen, uncompr, uncomprLen);
615a19eddc3SBaptiste Daroussin
616a19eddc3SBaptiste Daroussin if (!ZWRAP_isUsingZSTDcompression()) {
617a19eddc3SBaptiste Daroussin test_flush(compr, &comprLen);
618a19eddc3SBaptiste Daroussin test_sync(compr, comprLen, uncompr, uncomprLen);
619a19eddc3SBaptiste Daroussin }
620a19eddc3SBaptiste Daroussin comprLen = uncomprLen;
621a19eddc3SBaptiste Daroussin
622a19eddc3SBaptiste Daroussin test_dict_deflate(compr, comprLen);
623a19eddc3SBaptiste Daroussin test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
624a19eddc3SBaptiste Daroussin
625a19eddc3SBaptiste Daroussin free(compr);
626a19eddc3SBaptiste Daroussin free(uncompr);
627a19eddc3SBaptiste Daroussin
628a19eddc3SBaptiste Daroussin return 0;
629a19eddc3SBaptiste Daroussin }
630