xref: /src/sys/contrib/zstd/zlibWrapper/examples/example.c (revision 0c16b53773565120a8f80a31a0af2ef56ccd368e)
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