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