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