xref: /third_party/zlib/test/example.c (revision 275793ea)
1275793eaSopenharmony_ci/* example.c -- usage example of the zlib compression library
2275793eaSopenharmony_ci * Copyright (C) 1995-2006, 2011, 2016 Jean-loup Gailly
3275793eaSopenharmony_ci * For conditions of distribution and use, see copyright notice in zlib.h
4275793eaSopenharmony_ci */
5275793eaSopenharmony_ci
6275793eaSopenharmony_ci/* @(#) $Id$ */
7275793eaSopenharmony_ci
8275793eaSopenharmony_ci#include "zlib.h"
9275793eaSopenharmony_ci#include <stdio.h>
10275793eaSopenharmony_ci
11275793eaSopenharmony_ci#ifdef STDC
12275793eaSopenharmony_ci#  include <string.h>
13275793eaSopenharmony_ci#  include <stdlib.h>
14275793eaSopenharmony_ci#endif
15275793eaSopenharmony_ci
16275793eaSopenharmony_ci#if defined(VMS) || defined(RISCOS)
17275793eaSopenharmony_ci#  define TESTFILE "foo-gz"
18275793eaSopenharmony_ci#else
19275793eaSopenharmony_ci#  define TESTFILE "foo.gz"
20275793eaSopenharmony_ci#endif
21275793eaSopenharmony_ci
22275793eaSopenharmony_ci#define CHECK_ERR(err, msg) { \
23275793eaSopenharmony_ci    if (err != Z_OK) { \
24275793eaSopenharmony_ci        fprintf(stderr, "%s error: %d\n", msg, err); \
25275793eaSopenharmony_ci        exit(1); \
26275793eaSopenharmony_ci    } \
27275793eaSopenharmony_ci}
28275793eaSopenharmony_ci
29275793eaSopenharmony_cistatic z_const char hello[] = "hello, hello!";
30275793eaSopenharmony_ci/* "hello world" would be more standard, but the repeated "hello"
31275793eaSopenharmony_ci * stresses the compression code better, sorry...
32275793eaSopenharmony_ci */
33275793eaSopenharmony_ci
34275793eaSopenharmony_cistatic const char dictionary[] = "hello";
35275793eaSopenharmony_cistatic uLong dictId;    /* Adler32 value of the dictionary */
36275793eaSopenharmony_ci
37275793eaSopenharmony_ci#ifdef Z_SOLO
38275793eaSopenharmony_ci
39275793eaSopenharmony_cistatic void *myalloc(void *q, unsigned n, unsigned m)
40275793eaSopenharmony_ci{
41275793eaSopenharmony_ci    (void)q;
42275793eaSopenharmony_ci    return calloc(n, m);
43275793eaSopenharmony_ci}
44275793eaSopenharmony_ci
45275793eaSopenharmony_cistatic void myfree(void *q, void *p)
46275793eaSopenharmony_ci{
47275793eaSopenharmony_ci    (void)q;
48275793eaSopenharmony_ci    free(p);
49275793eaSopenharmony_ci}
50275793eaSopenharmony_ci
51275793eaSopenharmony_cistatic alloc_func zalloc = myalloc;
52275793eaSopenharmony_cistatic free_func zfree = myfree;
53275793eaSopenharmony_ci
54275793eaSopenharmony_ci#else /* !Z_SOLO */
55275793eaSopenharmony_ci
56275793eaSopenharmony_cistatic alloc_func zalloc = (alloc_func)0;
57275793eaSopenharmony_cistatic free_func zfree = (free_func)0;
58275793eaSopenharmony_ci
59275793eaSopenharmony_ci/* ===========================================================================
60275793eaSopenharmony_ci * Test compress() and uncompress()
61275793eaSopenharmony_ci */
62275793eaSopenharmony_cistatic void test_compress(Byte *compr, uLong comprLen, Byte *uncompr,
63275793eaSopenharmony_ci                   uLong uncomprLen)
64275793eaSopenharmony_ci{
65275793eaSopenharmony_ci    int err;
66275793eaSopenharmony_ci    uLong len = (uLong)strlen(hello)+1;
67275793eaSopenharmony_ci
68275793eaSopenharmony_ci    err = compress(compr, &comprLen, (const Bytef*)hello, len);
69275793eaSopenharmony_ci    CHECK_ERR(err, "compress");
70275793eaSopenharmony_ci
71275793eaSopenharmony_ci    strcpy((char*)uncompr, "garbage");
72275793eaSopenharmony_ci
73275793eaSopenharmony_ci    err = uncompress(uncompr, &uncomprLen, compr, comprLen);
74275793eaSopenharmony_ci    CHECK_ERR(err, "uncompress");
75275793eaSopenharmony_ci
76275793eaSopenharmony_ci    if (strcmp((char*)uncompr, hello)) {
77275793eaSopenharmony_ci        fprintf(stderr, "bad uncompress\n");
78275793eaSopenharmony_ci        exit(1);
79275793eaSopenharmony_ci    } else {
80275793eaSopenharmony_ci        printf("uncompress(): %s\n", (char *)uncompr);
81275793eaSopenharmony_ci    }
82275793eaSopenharmony_ci}
83275793eaSopenharmony_ci
84275793eaSopenharmony_ci/* ===========================================================================
85275793eaSopenharmony_ci * Test read/write of .gz files
86275793eaSopenharmony_ci */
87275793eaSopenharmony_cistatic void test_gzio(const char *fname, Byte *uncompr, uLong uncomprLen)
88275793eaSopenharmony_ci{
89275793eaSopenharmony_ci#ifdef NO_GZCOMPRESS
90275793eaSopenharmony_ci    fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n");
91275793eaSopenharmony_ci#else
92275793eaSopenharmony_ci    int err;
93275793eaSopenharmony_ci    int len = (int)strlen(hello)+1;
94275793eaSopenharmony_ci    gzFile file;
95275793eaSopenharmony_ci    z_off_t pos;
96275793eaSopenharmony_ci
97275793eaSopenharmony_ci    file = gzopen(fname, "wb");
98275793eaSopenharmony_ci    if (file == NULL) {
99275793eaSopenharmony_ci        fprintf(stderr, "gzopen error\n");
100275793eaSopenharmony_ci        exit(1);
101275793eaSopenharmony_ci    }
102275793eaSopenharmony_ci    gzputc(file, 'h');
103275793eaSopenharmony_ci    if (gzputs(file, "ello") != 4) {
104275793eaSopenharmony_ci        fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));
105275793eaSopenharmony_ci        exit(1);
106275793eaSopenharmony_ci    }
107275793eaSopenharmony_ci    if (gzprintf(file, ", %s!", "hello") != 8) {
108275793eaSopenharmony_ci        fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));
109275793eaSopenharmony_ci        exit(1);
110275793eaSopenharmony_ci    }
111275793eaSopenharmony_ci    gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
112275793eaSopenharmony_ci    gzclose(file);
113275793eaSopenharmony_ci
114275793eaSopenharmony_ci    file = gzopen(fname, "rb");
115275793eaSopenharmony_ci    if (file == NULL) {
116275793eaSopenharmony_ci        fprintf(stderr, "gzopen error\n");
117275793eaSopenharmony_ci        exit(1);
118275793eaSopenharmony_ci    }
119275793eaSopenharmony_ci    strcpy((char*)uncompr, "garbage");
120275793eaSopenharmony_ci
121275793eaSopenharmony_ci    if (gzread(file, uncompr, (unsigned)uncomprLen) != len) {
122275793eaSopenharmony_ci        fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
123275793eaSopenharmony_ci        exit(1);
124275793eaSopenharmony_ci    }
125275793eaSopenharmony_ci    if (strcmp((char*)uncompr, hello)) {
126275793eaSopenharmony_ci        fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
127275793eaSopenharmony_ci        exit(1);
128275793eaSopenharmony_ci    } else {
129275793eaSopenharmony_ci        printf("gzread(): %s\n", (char*)uncompr);
130275793eaSopenharmony_ci    }
131275793eaSopenharmony_ci
132275793eaSopenharmony_ci    pos = gzseek(file, -8L, SEEK_CUR);
133275793eaSopenharmony_ci    if (pos != 6 || gztell(file) != pos) {
134275793eaSopenharmony_ci        fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",
135275793eaSopenharmony_ci                (long)pos, (long)gztell(file));
136275793eaSopenharmony_ci        exit(1);
137275793eaSopenharmony_ci    }
138275793eaSopenharmony_ci
139275793eaSopenharmony_ci    if (gzgetc(file) != ' ') {
140275793eaSopenharmony_ci        fprintf(stderr, "gzgetc error\n");
141275793eaSopenharmony_ci        exit(1);
142275793eaSopenharmony_ci    }
143275793eaSopenharmony_ci
144275793eaSopenharmony_ci    if (gzungetc(' ', file) != ' ') {
145275793eaSopenharmony_ci        fprintf(stderr, "gzungetc error\n");
146275793eaSopenharmony_ci        exit(1);
147275793eaSopenharmony_ci    }
148275793eaSopenharmony_ci
149275793eaSopenharmony_ci    gzgets(file, (char*)uncompr, (int)uncomprLen);
150275793eaSopenharmony_ci    if (strlen((char*)uncompr) != 7) { /* " hello!" */
151275793eaSopenharmony_ci        fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
152275793eaSopenharmony_ci        exit(1);
153275793eaSopenharmony_ci    }
154275793eaSopenharmony_ci    if (strcmp((char*)uncompr, hello + 6)) {
155275793eaSopenharmony_ci        fprintf(stderr, "bad gzgets after gzseek\n");
156275793eaSopenharmony_ci        exit(1);
157275793eaSopenharmony_ci    } else {
158275793eaSopenharmony_ci        printf("gzgets() after gzseek: %s\n", (char*)uncompr);
159275793eaSopenharmony_ci    }
160275793eaSopenharmony_ci
161275793eaSopenharmony_ci    gzclose(file);
162275793eaSopenharmony_ci#endif
163275793eaSopenharmony_ci}
164275793eaSopenharmony_ci
165275793eaSopenharmony_ci#endif /* Z_SOLO */
166275793eaSopenharmony_ci
167275793eaSopenharmony_ci/* ===========================================================================
168275793eaSopenharmony_ci * Test deflate() with small buffers
169275793eaSopenharmony_ci */
170275793eaSopenharmony_cistatic void test_deflate(Byte *compr, uLong comprLen)
171275793eaSopenharmony_ci{
172275793eaSopenharmony_ci    z_stream c_stream; /* compression stream */
173275793eaSopenharmony_ci    int err;
174275793eaSopenharmony_ci    uLong len = (uLong)strlen(hello)+1;
175275793eaSopenharmony_ci
176275793eaSopenharmony_ci    c_stream.zalloc = zalloc;
177275793eaSopenharmony_ci    c_stream.zfree = zfree;
178275793eaSopenharmony_ci    c_stream.opaque = (voidpf)0;
179275793eaSopenharmony_ci
180275793eaSopenharmony_ci    err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
181275793eaSopenharmony_ci    CHECK_ERR(err, "deflateInit");
182275793eaSopenharmony_ci
183275793eaSopenharmony_ci    c_stream.next_in  = (z_const unsigned char *)hello;
184275793eaSopenharmony_ci    c_stream.next_out = compr;
185275793eaSopenharmony_ci
186275793eaSopenharmony_ci    while (c_stream.total_in != len && c_stream.total_out < comprLen) {
187275793eaSopenharmony_ci        c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
188275793eaSopenharmony_ci        err = deflate(&c_stream, Z_NO_FLUSH);
189275793eaSopenharmony_ci        CHECK_ERR(err, "deflate");
190275793eaSopenharmony_ci    }
191275793eaSopenharmony_ci    /* Finish the stream, still forcing small buffers: */
192275793eaSopenharmony_ci    for (;;) {
193275793eaSopenharmony_ci        c_stream.avail_out = 1;
194275793eaSopenharmony_ci        err = deflate(&c_stream, Z_FINISH);
195275793eaSopenharmony_ci        if (err == Z_STREAM_END)
196275793eaSopenharmony_ci        {
197275793eaSopenharmony_ci            break;
198275793eaSopenharmony_ci        }
199275793eaSopenharmony_ci        CHECK_ERR(err, "deflate");
200275793eaSopenharmony_ci    }
201275793eaSopenharmony_ci
202275793eaSopenharmony_ci    err = deflateEnd(&c_stream);
203275793eaSopenharmony_ci    CHECK_ERR(err, "deflateEnd");
204275793eaSopenharmony_ci}
205275793eaSopenharmony_ci
206275793eaSopenharmony_ci/* ===========================================================================
207275793eaSopenharmony_ci * Test inflate() with small buffers
208275793eaSopenharmony_ci */
209275793eaSopenharmony_cistatic void test_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
210275793eaSopenharmony_ci                  uLong uncomprLen)
211275793eaSopenharmony_ci{
212275793eaSopenharmony_ci    int err;
213275793eaSopenharmony_ci    z_stream d_stream; /* decompression stream */
214275793eaSopenharmony_ci
215275793eaSopenharmony_ci    strcpy((char*)uncompr, "garbage");
216275793eaSopenharmony_ci
217275793eaSopenharmony_ci    d_stream.zalloc = zalloc;
218275793eaSopenharmony_ci    d_stream.zfree = zfree;
219275793eaSopenharmony_ci    d_stream.opaque = (voidpf)0;
220275793eaSopenharmony_ci
221275793eaSopenharmony_ci    d_stream.next_in  = compr;
222275793eaSopenharmony_ci    d_stream.avail_in = 0;
223275793eaSopenharmony_ci    d_stream.next_out = uncompr;
224275793eaSopenharmony_ci
225275793eaSopenharmony_ci    err = inflateInit(&d_stream);
226275793eaSopenharmony_ci    CHECK_ERR(err, "inflateInit");
227275793eaSopenharmony_ci
228275793eaSopenharmony_ci    while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
229275793eaSopenharmony_ci        d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
230275793eaSopenharmony_ci        err = inflate(&d_stream, Z_NO_FLUSH);
231275793eaSopenharmony_ci        if (err == Z_STREAM_END)
232275793eaSopenharmony_ci        {
233275793eaSopenharmony_ci            break;
234275793eaSopenharmony_ci        }
235275793eaSopenharmony_ci        CHECK_ERR(err, "inflate");
236275793eaSopenharmony_ci    }
237275793eaSopenharmony_ci
238275793eaSopenharmony_ci    err = inflateEnd(&d_stream);
239275793eaSopenharmony_ci    CHECK_ERR(err, "inflateEnd");
240275793eaSopenharmony_ci
241275793eaSopenharmony_ci    if (strcmp((char*)uncompr, hello)) {
242275793eaSopenharmony_ci        fprintf(stderr, "bad inflate\n");
243275793eaSopenharmony_ci        exit(1);
244275793eaSopenharmony_ci    } else {
245275793eaSopenharmony_ci        printf("inflate(): %s\n", (char *)uncompr);
246275793eaSopenharmony_ci    }
247275793eaSopenharmony_ci}
248275793eaSopenharmony_ci
249275793eaSopenharmony_ci/* ===========================================================================
250275793eaSopenharmony_ci * Test deflate() with large buffers and dynamic change of compression level
251275793eaSopenharmony_ci */
252275793eaSopenharmony_cistatic void test_large_deflate(Byte *compr, uLong comprLen, Byte *uncompr,
253275793eaSopenharmony_ci                        uLong uncomprLen)
254275793eaSopenharmony_ci{
255275793eaSopenharmony_ci    z_stream c_stream; /* compression stream */
256275793eaSopenharmony_ci    int err;
257275793eaSopenharmony_ci
258275793eaSopenharmony_ci    c_stream.zalloc = zalloc;
259275793eaSopenharmony_ci    c_stream.zfree = zfree;
260275793eaSopenharmony_ci    c_stream.opaque = (voidpf)0;
261275793eaSopenharmony_ci
262275793eaSopenharmony_ci    err = deflateInit(&c_stream, Z_BEST_SPEED);
263275793eaSopenharmony_ci    CHECK_ERR(err, "deflateInit");
264275793eaSopenharmony_ci
265275793eaSopenharmony_ci    c_stream.next_out = compr;
266275793eaSopenharmony_ci    c_stream.avail_out = (uInt)comprLen;
267275793eaSopenharmony_ci
268275793eaSopenharmony_ci    /* At this point, uncompr is still mostly zeroes, so it should compress
269275793eaSopenharmony_ci     * very well:
270275793eaSopenharmony_ci     */
271275793eaSopenharmony_ci    c_stream.next_in = uncompr;
272275793eaSopenharmony_ci    c_stream.avail_in = (uInt)uncomprLen;
273275793eaSopenharmony_ci    err = deflate(&c_stream, Z_NO_FLUSH);
274275793eaSopenharmony_ci    CHECK_ERR(err, "deflate");
275275793eaSopenharmony_ci    if (c_stream.avail_in != 0) {
276275793eaSopenharmony_ci        fprintf(stderr, "deflate not greedy\n");
277275793eaSopenharmony_ci        exit(1);
278275793eaSopenharmony_ci    }
279275793eaSopenharmony_ci
280275793eaSopenharmony_ci    /* Feed in already compressed data and switch to no compression: */
281275793eaSopenharmony_ci    deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
282275793eaSopenharmony_ci    c_stream.next_in = compr;
283275793eaSopenharmony_ci    c_stream.avail_in = (uInt)uncomprLen/2;
284275793eaSopenharmony_ci    err = deflate(&c_stream, Z_NO_FLUSH);
285275793eaSopenharmony_ci    CHECK_ERR(err, "deflate");
286275793eaSopenharmony_ci
287275793eaSopenharmony_ci    /* Switch back to compressing mode: */
288275793eaSopenharmony_ci    deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
289275793eaSopenharmony_ci    c_stream.next_in = uncompr;
290275793eaSopenharmony_ci    c_stream.avail_in = (uInt)uncomprLen;
291275793eaSopenharmony_ci    err = deflate(&c_stream, Z_NO_FLUSH);
292275793eaSopenharmony_ci    CHECK_ERR(err, "deflate");
293275793eaSopenharmony_ci
294275793eaSopenharmony_ci    err = deflate(&c_stream, Z_FINISH);
295275793eaSopenharmony_ci    if (err != Z_STREAM_END) {
296275793eaSopenharmony_ci        fprintf(stderr, "deflate should report Z_STREAM_END\n");
297275793eaSopenharmony_ci        exit(1);
298275793eaSopenharmony_ci    }
299275793eaSopenharmony_ci    err = deflateEnd(&c_stream);
300275793eaSopenharmony_ci    CHECK_ERR(err, "deflateEnd");
301275793eaSopenharmony_ci}
302275793eaSopenharmony_ci
303275793eaSopenharmony_ci/* ===========================================================================
304275793eaSopenharmony_ci * Test inflate() with large buffers
305275793eaSopenharmony_ci */
306275793eaSopenharmony_cistatic void test_large_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
307275793eaSopenharmony_ci                        uLong uncomprLen)
308275793eaSopenharmony_ci{
309275793eaSopenharmony_ci    int err;
310275793eaSopenharmony_ci    z_stream d_stream; /* decompression stream */
311275793eaSopenharmony_ci
312275793eaSopenharmony_ci    strcpy((char*)uncompr, "garbage");
313275793eaSopenharmony_ci
314275793eaSopenharmony_ci    d_stream.zalloc = zalloc;
315275793eaSopenharmony_ci    d_stream.zfree = zfree;
316275793eaSopenharmony_ci    d_stream.opaque = (voidpf)0;
317275793eaSopenharmony_ci
318275793eaSopenharmony_ci    d_stream.next_in  = compr;
319275793eaSopenharmony_ci    d_stream.avail_in = (uInt)comprLen;
320275793eaSopenharmony_ci
321275793eaSopenharmony_ci    err = inflateInit(&d_stream);
322275793eaSopenharmony_ci    CHECK_ERR(err, "inflateInit");
323275793eaSopenharmony_ci
324275793eaSopenharmony_ci    for (;;) {
325275793eaSopenharmony_ci        d_stream.next_out = uncompr;            /* discard the output */
326275793eaSopenharmony_ci        d_stream.avail_out = (uInt)uncomprLen;
327275793eaSopenharmony_ci        err = inflate(&d_stream, Z_NO_FLUSH);
328275793eaSopenharmony_ci        if (err == Z_STREAM_END)
329275793eaSopenharmony_ci        {
330275793eaSopenharmony_ci            break;
331275793eaSopenharmony_ci        }
332275793eaSopenharmony_ci        CHECK_ERR(err, "large inflate");
333275793eaSopenharmony_ci    }
334275793eaSopenharmony_ci
335275793eaSopenharmony_ci    err = inflateEnd(&d_stream);
336275793eaSopenharmony_ci    CHECK_ERR(err, "inflateEnd");
337275793eaSopenharmony_ci
338275793eaSopenharmony_ci    if (d_stream.total_out != 2*uncomprLen + uncomprLen/2) {
339275793eaSopenharmony_ci        fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
340275793eaSopenharmony_ci        exit(1);
341275793eaSopenharmony_ci    } else {
342275793eaSopenharmony_ci        printf("large_inflate(): OK\n");
343275793eaSopenharmony_ci    }
344275793eaSopenharmony_ci}
345275793eaSopenharmony_ci
346275793eaSopenharmony_ci/* ===========================================================================
347275793eaSopenharmony_ci * Test deflate() with full flush
348275793eaSopenharmony_ci */
349275793eaSopenharmony_cistatic void test_flush(Byte *compr, uLong *comprLen)
350275793eaSopenharmony_ci{
351275793eaSopenharmony_ci    z_stream c_stream; /* compression stream */
352275793eaSopenharmony_ci    int err;
353275793eaSopenharmony_ci    uInt len = (uInt)strlen(hello)+1;
354275793eaSopenharmony_ci
355275793eaSopenharmony_ci    c_stream.zalloc = zalloc;
356275793eaSopenharmony_ci    c_stream.zfree = zfree;
357275793eaSopenharmony_ci    c_stream.opaque = (voidpf)0;
358275793eaSopenharmony_ci
359275793eaSopenharmony_ci    err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
360275793eaSopenharmony_ci    CHECK_ERR(err, "deflateInit");
361275793eaSopenharmony_ci
362275793eaSopenharmony_ci    c_stream.next_in  = (z_const unsigned char *)hello;
363275793eaSopenharmony_ci    c_stream.next_out = compr;
364275793eaSopenharmony_ci    c_stream.avail_in = 3;
365275793eaSopenharmony_ci    c_stream.avail_out = (uInt)*comprLen;
366275793eaSopenharmony_ci    err = deflate(&c_stream, Z_FULL_FLUSH);
367275793eaSopenharmony_ci    CHECK_ERR(err, "deflate");
368275793eaSopenharmony_ci
369275793eaSopenharmony_ci    compr[3]++; /* force an error in first compressed block */
370275793eaSopenharmony_ci    c_stream.avail_in = len - 3;
371275793eaSopenharmony_ci
372275793eaSopenharmony_ci    err = deflate(&c_stream, Z_FINISH);
373275793eaSopenharmony_ci    if (err != Z_STREAM_END) {
374275793eaSopenharmony_ci        CHECK_ERR(err, "deflate");
375275793eaSopenharmony_ci    }
376275793eaSopenharmony_ci    err = deflateEnd(&c_stream);
377275793eaSopenharmony_ci    CHECK_ERR(err, "deflateEnd");
378275793eaSopenharmony_ci
379275793eaSopenharmony_ci    *comprLen = c_stream.total_out;
380275793eaSopenharmony_ci}
381275793eaSopenharmony_ci
382275793eaSopenharmony_ci/* ===========================================================================
383275793eaSopenharmony_ci * Test inflateSync()
384275793eaSopenharmony_ci */
385275793eaSopenharmony_cistatic void test_sync(Byte *compr, uLong comprLen, Byte *uncompr,
386275793eaSopenharmony_ci                      uLong uncomprLen)
387275793eaSopenharmony_ci{
388275793eaSopenharmony_ci    int err;
389275793eaSopenharmony_ci    z_stream d_stream; /* decompression stream */
390275793eaSopenharmony_ci
391275793eaSopenharmony_ci    strcpy((char*)uncompr, "garbage");
392275793eaSopenharmony_ci
393275793eaSopenharmony_ci    d_stream.zalloc = zalloc;
394275793eaSopenharmony_ci    d_stream.zfree = zfree;
395275793eaSopenharmony_ci    d_stream.opaque = (voidpf)0;
396275793eaSopenharmony_ci
397275793eaSopenharmony_ci    d_stream.next_in  = compr;
398275793eaSopenharmony_ci    d_stream.avail_in = 2; /* just read the zlib header */
399275793eaSopenharmony_ci
400275793eaSopenharmony_ci    err = inflateInit(&d_stream);
401275793eaSopenharmony_ci    CHECK_ERR(err, "inflateInit");
402275793eaSopenharmony_ci
403275793eaSopenharmony_ci    d_stream.next_out = uncompr;
404275793eaSopenharmony_ci    d_stream.avail_out = (uInt)uncomprLen;
405275793eaSopenharmony_ci
406275793eaSopenharmony_ci    err = inflate(&d_stream, Z_NO_FLUSH);
407275793eaSopenharmony_ci    CHECK_ERR(err, "inflate");
408275793eaSopenharmony_ci
409275793eaSopenharmony_ci    d_stream.avail_in = (uInt)comprLen-2;   /* read all compressed data */
410275793eaSopenharmony_ci    err = inflateSync(&d_stream);           /* but skip the damaged part */
411275793eaSopenharmony_ci    CHECK_ERR(err, "inflateSync");
412275793eaSopenharmony_ci
413275793eaSopenharmony_ci    err = inflate(&d_stream, Z_FINISH);
414275793eaSopenharmony_ci    if (err != Z_STREAM_END) {
415275793eaSopenharmony_ci        fprintf(stderr, "inflate should report Z_STREAM_END\n");
416275793eaSopenharmony_ci        exit(1);
417275793eaSopenharmony_ci    }
418275793eaSopenharmony_ci    err = inflateEnd(&d_stream);
419275793eaSopenharmony_ci    CHECK_ERR(err, "inflateEnd");
420275793eaSopenharmony_ci
421275793eaSopenharmony_ci    printf("after inflateSync(): hel%s\n", (char *)uncompr);
422275793eaSopenharmony_ci}
423275793eaSopenharmony_ci
424275793eaSopenharmony_ci/* ===========================================================================
425275793eaSopenharmony_ci * Test deflate() with preset dictionary
426275793eaSopenharmony_ci */
427275793eaSopenharmony_cistatic void test_dict_deflate(Byte *compr, uLong comprLen)
428275793eaSopenharmony_ci{
429275793eaSopenharmony_ci    z_stream c_stream; /* compression stream */
430275793eaSopenharmony_ci    int err;
431275793eaSopenharmony_ci
432275793eaSopenharmony_ci    c_stream.zalloc = zalloc;
433275793eaSopenharmony_ci    c_stream.zfree = zfree;
434275793eaSopenharmony_ci    c_stream.opaque = (voidpf)0;
435275793eaSopenharmony_ci
436275793eaSopenharmony_ci    err = deflateInit(&c_stream, Z_BEST_COMPRESSION);
437275793eaSopenharmony_ci    CHECK_ERR(err, "deflateInit");
438275793eaSopenharmony_ci
439275793eaSopenharmony_ci    err = deflateSetDictionary(&c_stream,
440275793eaSopenharmony_ci                (const Bytef*)dictionary, (int)sizeof(dictionary));
441275793eaSopenharmony_ci    CHECK_ERR(err, "deflateSetDictionary");
442275793eaSopenharmony_ci
443275793eaSopenharmony_ci    dictId = c_stream.adler;
444275793eaSopenharmony_ci    c_stream.next_out = compr;
445275793eaSopenharmony_ci    c_stream.avail_out = (uInt)comprLen;
446275793eaSopenharmony_ci
447275793eaSopenharmony_ci    c_stream.next_in = (z_const unsigned char *)hello;
448275793eaSopenharmony_ci    c_stream.avail_in = (uInt)strlen(hello)+1;
449275793eaSopenharmony_ci
450275793eaSopenharmony_ci    err = deflate(&c_stream, Z_FINISH);
451275793eaSopenharmony_ci    if (err != Z_STREAM_END) {
452275793eaSopenharmony_ci        fprintf(stderr, "deflate should report Z_STREAM_END\n");
453275793eaSopenharmony_ci        exit(1);
454275793eaSopenharmony_ci    }
455275793eaSopenharmony_ci    err = deflateEnd(&c_stream);
456275793eaSopenharmony_ci    CHECK_ERR(err, "deflateEnd");
457275793eaSopenharmony_ci}
458275793eaSopenharmony_ci
459275793eaSopenharmony_ci/* ===========================================================================
460275793eaSopenharmony_ci * Test inflate() with a preset dictionary
461275793eaSopenharmony_ci */
462275793eaSopenharmony_cistatic void test_dict_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
463275793eaSopenharmony_ci                       uLong uncomprLen)
464275793eaSopenharmony_ci{
465275793eaSopenharmony_ci    int err;
466275793eaSopenharmony_ci    z_stream d_stream; /* decompression stream */
467275793eaSopenharmony_ci
468275793eaSopenharmony_ci    strcpy((char*)uncompr, "garbage");
469275793eaSopenharmony_ci
470275793eaSopenharmony_ci    d_stream.zalloc = zalloc;
471275793eaSopenharmony_ci    d_stream.zfree = zfree;
472275793eaSopenharmony_ci    d_stream.opaque = (voidpf)0;
473275793eaSopenharmony_ci
474275793eaSopenharmony_ci    d_stream.next_in  = compr;
475275793eaSopenharmony_ci    d_stream.avail_in = (uInt)comprLen;
476275793eaSopenharmony_ci
477275793eaSopenharmony_ci    err = inflateInit(&d_stream);
478275793eaSopenharmony_ci    CHECK_ERR(err, "inflateInit");
479275793eaSopenharmony_ci
480275793eaSopenharmony_ci    d_stream.next_out = uncompr;
481275793eaSopenharmony_ci    d_stream.avail_out = (uInt)uncomprLen;
482275793eaSopenharmony_ci
483275793eaSopenharmony_ci    for (;;) {
484275793eaSopenharmony_ci        err = inflate(&d_stream, Z_NO_FLUSH);
485275793eaSopenharmony_ci        if (err == Z_STREAM_END)
486275793eaSopenharmony_ci        {
487275793eaSopenharmony_ci            break;
488275793eaSopenharmony_ci        }
489275793eaSopenharmony_ci        if (err == Z_NEED_DICT) {
490275793eaSopenharmony_ci            if (d_stream.adler != dictId) {
491275793eaSopenharmony_ci                fprintf(stderr, "unexpected dictionary");
492275793eaSopenharmony_ci                exit(1);
493275793eaSopenharmony_ci            }
494275793eaSopenharmony_ci            err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,
495275793eaSopenharmony_ci                                       (int)sizeof(dictionary));
496275793eaSopenharmony_ci        }
497275793eaSopenharmony_ci        CHECK_ERR(err, "inflate with dict");
498275793eaSopenharmony_ci    }
499275793eaSopenharmony_ci
500275793eaSopenharmony_ci    err = inflateEnd(&d_stream);
501275793eaSopenharmony_ci    CHECK_ERR(err, "inflateEnd");
502275793eaSopenharmony_ci
503275793eaSopenharmony_ci    if (strcmp((char*)uncompr, hello)) {
504275793eaSopenharmony_ci        fprintf(stderr, "bad inflate with dict\n");
505275793eaSopenharmony_ci        exit(1);
506275793eaSopenharmony_ci    } else {
507275793eaSopenharmony_ci        printf("inflate with dictionary: %s\n", (char *)uncompr);
508275793eaSopenharmony_ci    }
509275793eaSopenharmony_ci}
510275793eaSopenharmony_ci
511275793eaSopenharmony_ci/* ===========================================================================
512275793eaSopenharmony_ci * Usage:  example [output.gz  [input.gz]]
513275793eaSopenharmony_ci */
514275793eaSopenharmony_ci#define THREE 3
515275793eaSopenharmony_ciint main(int argc, char *argv[])
516275793eaSopenharmony_ci{
517275793eaSopenharmony_ci    Byte *compr, *uncompr;
518275793eaSopenharmony_ci    uLong uncomprLen = 20000;
519275793eaSopenharmony_ci    uLong comprLen = 3 * uncomprLen;
520275793eaSopenharmony_ci    static const char* myVersion = ZLIB_VERSION;
521275793eaSopenharmony_ci
522275793eaSopenharmony_ci    if (zlibVersion()[0] != myVersion[0]) {
523275793eaSopenharmony_ci        fprintf(stderr, "incompatible zlib version\n");
524275793eaSopenharmony_ci        exit(1);
525275793eaSopenharmony_ci
526275793eaSopenharmony_ci    } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
527275793eaSopenharmony_ci        fprintf(stderr, "warning: different zlib version linked: %s\n",
528275793eaSopenharmony_ci                zlibVersion());
529275793eaSopenharmony_ci    }
530275793eaSopenharmony_ci
531275793eaSopenharmony_ci    printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n",
532275793eaSopenharmony_ci            ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags());
533275793eaSopenharmony_ci
534275793eaSopenharmony_ci    compr    = (Byte*)calloc((uInt)comprLen, 1);
535275793eaSopenharmony_ci    uncompr  = (Byte*)calloc((uInt)uncomprLen, 1);
536275793eaSopenharmony_ci    /* compr and uncompr are cleared to avoid reading uninitialized
537275793eaSopenharmony_ci     * data and to ensure that uncompr compresses well.
538275793eaSopenharmony_ci     */
539275793eaSopenharmony_ci    if (compr == Z_NULL || uncompr == Z_NULL) {
540275793eaSopenharmony_ci        printf("out of memory\n");
541275793eaSopenharmony_ci        exit(1);
542275793eaSopenharmony_ci    }
543275793eaSopenharmony_ci
544275793eaSopenharmony_ci#ifdef Z_SOLO
545275793eaSopenharmony_ci    (void)argc;
546275793eaSopenharmony_ci    (void)argv;
547275793eaSopenharmony_ci#else
548275793eaSopenharmony_ci    test_compress(compr, comprLen, uncompr, uncomprLen);
549275793eaSopenharmony_ci
550275793eaSopenharmony_ci    test_gzio((argc > 1 ? argv[1] : TESTFILE),
551275793eaSopenharmony_ci              uncompr, uncomprLen);
552275793eaSopenharmony_ci#endif
553275793eaSopenharmony_ci
554275793eaSopenharmony_ci    test_deflate(compr, comprLen);
555275793eaSopenharmony_ci    test_inflate(compr, comprLen, uncompr, uncomprLen);
556275793eaSopenharmony_ci
557275793eaSopenharmony_ci    test_large_deflate(compr, comprLen, uncompr, uncomprLen);
558275793eaSopenharmony_ci    test_large_inflate(compr, comprLen, uncompr, uncomprLen);
559275793eaSopenharmony_ci
560275793eaSopenharmony_ci    test_flush(compr, &comprLen);
561275793eaSopenharmony_ci    test_sync(compr, comprLen, uncompr, uncomprLen);
562275793eaSopenharmony_ci    comprLen = THREE * uncomprLen;
563275793eaSopenharmony_ci
564275793eaSopenharmony_ci    test_dict_deflate(compr, comprLen);
565275793eaSopenharmony_ci    test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
566275793eaSopenharmony_ci
567275793eaSopenharmony_ci    free(compr);
568275793eaSopenharmony_ci    free(uncompr);
569275793eaSopenharmony_ci
570275793eaSopenharmony_ci    return 0;
571275793eaSopenharmony_ci}
572