14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* example.c -- usage example of the zlib compression library
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Copyright (C) 1995-2004 Jean-loup Gailly.
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * For conditions of distribution and use, see copyright notice in zlib.h
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* @(#) $Id$ */
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <stdio.h>
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "zlib.h"
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef STDC
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  include <string.h>
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  include <stdlib.h>
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(VMS) || defined(RISCOS)
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  define TESTFILE "foo-gz"
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  define TESTFILE "foo.gz"
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define CHECK_ERR(err, msg) { \
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (err != Z_OK) { \
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "%s error: %d\n", msg, err); \
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1); \
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } \
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconst char hello[] = "hello, hello!";
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* "hello world" would be more standard, but the repeated "hello"
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * stresses the compression code better, sorry...
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconst char dictionary[] = "hello";
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmuLong dictId; /* Adler32 value of the dictionary */
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_compress      OF((Byte *compr, uLong comprLen,
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Byte *uncompr, uLong uncomprLen));
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_gzio          OF((const char *fname,
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Byte *uncompr, uLong uncomprLen));
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_deflate       OF((Byte *compr, uLong comprLen));
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_inflate       OF((Byte *compr, uLong comprLen,
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Byte *uncompr, uLong uncomprLen));
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_large_deflate OF((Byte *compr, uLong comprLen,
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Byte *uncompr, uLong uncomprLen));
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_large_inflate OF((Byte *compr, uLong comprLen,
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Byte *uncompr, uLong uncomprLen));
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_flush         OF((Byte *compr, uLong *comprLen));
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_sync          OF((Byte *compr, uLong comprLen,
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Byte *uncompr, uLong uncomprLen));
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_dict_deflate  OF((Byte *compr, uLong comprLen));
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_dict_inflate  OF((Byte *compr, uLong comprLen,
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Byte *uncompr, uLong uncomprLen));
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint  main               OF((int argc, char *argv[]));
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ===========================================================================
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Test compress() and uncompress()
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_compress(compr, comprLen, uncompr, uncomprLen)
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Byte *compr, *uncompr;
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong comprLen, uncomprLen;
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int err;
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong len = (uLong)strlen(hello)+1;
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = compress(compr, &comprLen, (const Bytef*)hello, len);
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "compress");
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    strcpy((char*)uncompr, "garbage");
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = uncompress(uncompr, &uncomprLen, compr, comprLen);
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "uncompress");
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (strcmp((char*)uncompr, hello)) {
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "bad uncompress\n");
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        printf("uncompress(): %s\n", (char *)uncompr);
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ===========================================================================
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Test read/write of .gz files
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_gzio(fname, uncompr, uncomprLen)
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *fname; /* compressed file name */
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Byte *uncompr;
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong uncomprLen;
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NO_GZCOMPRESS
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n");
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int err;
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int len = (int)strlen(hello)+1;
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    gzFile file;
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    z_off_t pos;
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    file = gzopen(fname, "wb");
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (file == NULL) {
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "gzopen error\n");
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    gzputc(file, 'h');
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (gzputs(file, "ello") != 4) {
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (gzprintf(file, ", %s!", "hello") != 8) {
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    gzclose(file);
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    file = gzopen(fname, "rb");
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (file == NULL) {
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "gzopen error\n");
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    strcpy((char*)uncompr, "garbage");
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (gzread(file, uncompr, (unsigned)uncomprLen) != len) {
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (strcmp((char*)uncompr, hello)) {
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        printf("gzread(): %s\n", (char*)uncompr);
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pos = gzseek(file, -8L, SEEK_CUR);
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (pos != 6 || gztell(file) != pos) {
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (long)pos, (long)gztell(file));
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (gzgetc(file) != ' ') {
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "gzgetc error\n");
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (gzungetc(' ', file) != ' ') {
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "gzungetc error\n");
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    gzgets(file, (char*)uncompr, (int)uncomprLen);
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (strlen((char*)uncompr) != 7) { /* " hello!" */
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (strcmp((char*)uncompr, hello + 6)) {
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "bad gzgets after gzseek\n");
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        printf("gzgets() after gzseek: %s\n", (char*)uncompr);
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    gzclose(file);
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ===========================================================================
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Test deflate() with small buffers
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_deflate(compr, comprLen)
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Byte *compr;
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong comprLen;
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    z_stream c_stream; /* compression stream */
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int err;
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong len = (uLong)strlen(hello)+1;
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.zalloc = (alloc_func)0;
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.zfree = (free_func)0;
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.opaque = (voidpf)0;
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflateInit");
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.next_in  = (Bytef*)hello;
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.next_out = compr;
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (c_stream.total_in != len && c_stream.total_out < comprLen) {
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        err = deflate(&c_stream, Z_NO_FLUSH);
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        CHECK_ERR(err, "deflate");
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Finish the stream, still forcing small buffers: */
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (;;) {
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c_stream.avail_out = 1;
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        err = deflate(&c_stream, Z_FINISH);
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (err == Z_STREAM_END) break;
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        CHECK_ERR(err, "deflate");
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflateEnd(&c_stream);
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflateEnd");
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ===========================================================================
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Test inflate() with small buffers
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_inflate(compr, comprLen, uncompr, uncomprLen)
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Byte *compr, *uncompr;
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong comprLen, uncomprLen;
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int err;
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    z_stream d_stream; /* decompression stream */
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    strcpy((char*)uncompr, "garbage");
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.zalloc = (alloc_func)0;
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.zfree = (free_func)0;
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.opaque = (voidpf)0;
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.next_in  = compr;
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.avail_in = 0;
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.next_out = uncompr;
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = inflateInit(&d_stream);
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "inflateInit");
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        err = inflate(&d_stream, Z_NO_FLUSH);
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (err == Z_STREAM_END) break;
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        CHECK_ERR(err, "inflate");
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = inflateEnd(&d_stream);
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "inflateEnd");
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (strcmp((char*)uncompr, hello)) {
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "bad inflate\n");
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        printf("inflate(): %s\n", (char *)uncompr);
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ===========================================================================
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Test deflate() with large buffers and dynamic change of compression level
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_large_deflate(compr, comprLen, uncompr, uncomprLen)
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Byte *compr, *uncompr;
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong comprLen, uncomprLen;
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    z_stream c_stream; /* compression stream */
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int err;
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.zalloc = (alloc_func)0;
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.zfree = (free_func)0;
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.opaque = (voidpf)0;
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflateInit(&c_stream, Z_BEST_SPEED);
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflateInit");
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.next_out = compr;
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.avail_out = (uInt)comprLen;
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* At this point, uncompr is still mostly zeroes, so it should compress
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * very well:
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.next_in = uncompr;
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.avail_in = (uInt)uncomprLen;
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflate(&c_stream, Z_NO_FLUSH);
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflate");
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (c_stream.avail_in != 0) {
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "deflate not greedy\n");
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Feed in already compressed data and switch to no compression: */
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.next_in = compr;
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.avail_in = (uInt)comprLen/2;
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflate(&c_stream, Z_NO_FLUSH);
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflate");
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Switch back to compressing mode: */
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.next_in = uncompr;
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.avail_in = (uInt)uncomprLen;
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflate(&c_stream, Z_NO_FLUSH);
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflate");
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflate(&c_stream, Z_FINISH);
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (err != Z_STREAM_END) {
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "deflate should report Z_STREAM_END\n");
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflateEnd(&c_stream);
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflateEnd");
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ===========================================================================
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Test inflate() with large buffers
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_large_inflate(compr, comprLen, uncompr, uncomprLen)
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Byte *compr, *uncompr;
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong comprLen, uncomprLen;
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int err;
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    z_stream d_stream; /* decompression stream */
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    strcpy((char*)uncompr, "garbage");
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.zalloc = (alloc_func)0;
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.zfree = (free_func)0;
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.opaque = (voidpf)0;
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.next_in  = compr;
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.avail_in = (uInt)comprLen;
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = inflateInit(&d_stream);
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "inflateInit");
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (;;) {
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d_stream.next_out = uncompr;            /* discard the output */
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d_stream.avail_out = (uInt)uncomprLen;
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        err = inflate(&d_stream, Z_NO_FLUSH);
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (err == Z_STREAM_END) break;
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        CHECK_ERR(err, "large inflate");
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = inflateEnd(&d_stream);
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "inflateEnd");
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        printf("large_inflate(): OK\n");
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ===========================================================================
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Test deflate() with full flush
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_flush(compr, comprLen)
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Byte *compr;
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong *comprLen;
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    z_stream c_stream; /* compression stream */
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int err;
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uInt len = (uInt)strlen(hello)+1;
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.zalloc = (alloc_func)0;
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.zfree = (free_func)0;
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.opaque = (voidpf)0;
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflateInit");
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.next_in  = (Bytef*)hello;
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.next_out = compr;
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.avail_in = 3;
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.avail_out = (uInt)*comprLen;
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflate(&c_stream, Z_FULL_FLUSH);
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflate");
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    compr[3]++; /* force an error in first compressed block */
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.avail_in = len - 3;
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflate(&c_stream, Z_FINISH);
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (err != Z_STREAM_END) {
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        CHECK_ERR(err, "deflate");
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflateEnd(&c_stream);
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflateEnd");
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *comprLen = c_stream.total_out;
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ===========================================================================
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Test inflateSync()
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_sync(compr, comprLen, uncompr, uncomprLen)
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Byte *compr, *uncompr;
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong comprLen, uncomprLen;
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int err;
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    z_stream d_stream; /* decompression stream */
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    strcpy((char*)uncompr, "garbage");
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.zalloc = (alloc_func)0;
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.zfree = (free_func)0;
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.opaque = (voidpf)0;
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.next_in  = compr;
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.avail_in = 2; /* just read the zlib header */
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = inflateInit(&d_stream);
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "inflateInit");
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.next_out = uncompr;
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.avail_out = (uInt)uncomprLen;
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    inflate(&d_stream, Z_NO_FLUSH);
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "inflate");
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.avail_in = (uInt)comprLen-2;   /* read all compressed data */
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = inflateSync(&d_stream);           /* but skip the damaged part */
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "inflateSync");
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = inflate(&d_stream, Z_FINISH);
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (err != Z_DATA_ERROR) {
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "inflate should report DATA_ERROR\n");
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Because of incorrect adler32 */
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = inflateEnd(&d_stream);
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "inflateEnd");
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    printf("after inflateSync(): hel%s\n", (char *)uncompr);
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ===========================================================================
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Test deflate() with preset dictionary
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_dict_deflate(compr, comprLen)
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Byte *compr;
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong comprLen;
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    z_stream c_stream; /* compression stream */
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int err;
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.zalloc = (alloc_func)0;
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.zfree = (free_func)0;
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.opaque = (voidpf)0;
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflateInit(&c_stream, Z_BEST_COMPRESSION);
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflateInit");
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflateSetDictionary(&c_stream,
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               (const Bytef*)dictionary, sizeof(dictionary));
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflateSetDictionary");
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    dictId = c_stream.adler;
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.next_out = compr;
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.avail_out = (uInt)comprLen;
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.next_in = (Bytef*)hello;
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_stream.avail_in = (uInt)strlen(hello)+1;
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflate(&c_stream, Z_FINISH);
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (err != Z_STREAM_END) {
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "deflate should report Z_STREAM_END\n");
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = deflateEnd(&c_stream);
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "deflateEnd");
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ===========================================================================
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Test inflate() with a preset dictionary
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Byte *compr, *uncompr;
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong comprLen, uncomprLen;
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int err;
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    z_stream d_stream; /* decompression stream */
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    strcpy((char*)uncompr, "garbage");
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.zalloc = (alloc_func)0;
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.zfree = (free_func)0;
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.opaque = (voidpf)0;
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.next_in  = compr;
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.avail_in = (uInt)comprLen;
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = inflateInit(&d_stream);
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "inflateInit");
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.next_out = uncompr;
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    d_stream.avail_out = (uInt)uncomprLen;
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (;;) {
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        err = inflate(&d_stream, Z_NO_FLUSH);
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (err == Z_STREAM_END) break;
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (err == Z_NEED_DICT) {
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (d_stream.adler != dictId) {
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                fprintf(stderr, "unexpected dictionary");
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                exit(1);
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                       sizeof(dictionary));
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        CHECK_ERR(err, "inflate with dict");
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    err = inflateEnd(&d_stream);
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_ERR(err, "inflateEnd");
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (strcmp((char*)uncompr, hello)) {
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "bad inflate with dict\n");
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        printf("inflate with dictionary: %s\n", (char *)uncompr);
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ===========================================================================
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Usage:  example [output.gz  [input.gz]]
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint main(argc, argv)
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int argc;
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *argv[];
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Byte *compr, *uncompr;
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uLong uncomprLen = comprLen;
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static const char* myVersion = ZLIB_VERSION;
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (zlibVersion()[0] != myVersion[0]) {
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "incompatible zlib version\n");
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fprintf(stderr, "warning: different zlib version\n");
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n",
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags());
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    compr    = (Byte*)calloc((uInt)comprLen, 1);
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    uncompr  = (Byte*)calloc((uInt)uncomprLen, 1);
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* compr and uncompr are cleared to avoid reading uninitialized
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * data and to ensure that uncompr compresses well.
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (compr == Z_NULL || uncompr == Z_NULL) {
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        printf("out of memory\n");
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exit(1);
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_compress(compr, comprLen, uncompr, uncomprLen);
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_gzio((argc > 1 ? argv[1] : TESTFILE),
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              uncompr, uncomprLen);
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_deflate(compr, comprLen);
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_inflate(compr, comprLen, uncompr, uncomprLen);
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_large_deflate(compr, comprLen, uncompr, uncomprLen);
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_large_inflate(compr, comprLen, uncompr, uncomprLen);
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_flush(compr, &comprLen);
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_sync(compr, comprLen, uncompr, uncomprLen);
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    comprLen = uncomprLen;
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_dict_deflate(compr, comprLen);
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    free(compr);
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    free(uncompr);
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
566