17eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* example.c -- usage example of the zlib compression library
27eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Copyright (C) 1995-2006, 2011 Jean-loup Gailly.
37eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * For conditions of distribution and use, see copyright notice in zlib.h
47eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
57eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
67eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* @(#) $Id$ */
77eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
87eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include "zlib.h"
97eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include <stdio.h>
107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef STDC
127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  include <string.h>
137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  include <stdlib.h>
147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(VMS) || defined(RISCOS)
177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define TESTFILE "foo-gz"
187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else
197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define TESTFILE "foo.gz"
207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define CHECK_ERR(err, msg) { \
237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (err != Z_OK) { \
247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "%s error: %d\n", msg, err); \
257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1); \
267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } \
277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielz_const char hello[] = "hello, hello!";
307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* "hello world" would be more standard, but the repeated "hello"
317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * stresses the compression code better, sorry...
327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielconst char dictionary[] = "hello";
357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanieluLong dictId; /* Adler32 value of the dictionary */
367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_deflate       OF((Byte *compr, uLong comprLen));
387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_inflate       OF((Byte *compr, uLong comprLen,
397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                            Byte *uncompr, uLong uncomprLen));
407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_large_deflate OF((Byte *compr, uLong comprLen,
417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                            Byte *uncompr, uLong uncomprLen));
427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_large_inflate OF((Byte *compr, uLong comprLen,
437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                            Byte *uncompr, uLong uncomprLen));
447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_flush         OF((Byte *compr, uLong *comprLen));
457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_sync          OF((Byte *compr, uLong comprLen,
467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                            Byte *uncompr, uLong uncomprLen));
477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_dict_deflate  OF((Byte *compr, uLong comprLen));
487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_dict_inflate  OF((Byte *compr, uLong comprLen,
497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                            Byte *uncompr, uLong uncomprLen));
507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint  main               OF((int argc, char *argv[]));
517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef Z_SOLO
547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid *myalloc OF((void *, unsigned, unsigned));
567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid myfree OF((void *, void *));
577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid *myalloc(q, n, m)
597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    void *q;
607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unsigned n, m;
617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    q = Z_NULL;
637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return calloc(n, m);
647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid myfree(void *q, void *p)
677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    q = Z_NULL;
697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    free(p);
707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic alloc_func zalloc = myalloc;
737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic free_func zfree = myfree;
747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else /* !Z_SOLO */
767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic alloc_func zalloc = (alloc_func)0;
787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic free_func zfree = (free_func)0;
797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_compress      OF((Byte *compr, uLong comprLen,
817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                            Byte *uncompr, uLong uncomprLen));
827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_gzio          OF((const char *fname,
837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                            Byte *uncompr, uLong uncomprLen));
847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Test compress() and uncompress()
877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_compress(compr, comprLen, uncompr, uncomprLen)
897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Byte *compr, *uncompr;
907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong comprLen, uncomprLen;
917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong len = (uLong)strlen(hello)+1;
947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = compress(compr, &comprLen, (const Bytef*)hello, len);
967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "compress");
977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strcpy((char*)uncompr, "garbage");
997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = uncompress(uncompr, &uncomprLen, compr, comprLen);
1017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "uncompress");
1027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (strcmp((char*)uncompr, hello)) {
1047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "bad uncompress\n");
1057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
1067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } else {
1077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        printf("uncompress(): %s\n", (char *)uncompr);
1087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
1127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Test read/write of .gz files
1137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
1147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_gzio(fname, uncompr, uncomprLen)
1157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *fname; /* compressed file name */
1167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Byte *uncompr;
1177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong uncomprLen;
1187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
1197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef NO_GZCOMPRESS
1207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n");
1217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else
1227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
1237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int len = (int)strlen(hello)+1;
1247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzFile file;
1257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_off_t pos;
1267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    file = gzopen(fname, "wb");
1287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (file == NULL) {
1297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "gzopen error\n");
1307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
1317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzputc(file, 'h');
1337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gzputs(file, "ello") != 4) {
1347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));
1357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
1367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gzprintf(file, ", %s!", "hello") != 8) {
1387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));
1397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
1407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
1427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzclose(file);
1437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    file = gzopen(fname, "rb");
1457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (file == NULL) {
1467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "gzopen error\n");
1477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
1487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strcpy((char*)uncompr, "garbage");
1507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gzread(file, uncompr, (unsigned)uncomprLen) != len) {
1527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
1537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
1547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (strcmp((char*)uncompr, hello)) {
1567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
1577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
1587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } else {
1597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        printf("gzread(): %s\n", (char*)uncompr);
1607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    pos = gzseek(file, -8L, SEEK_CUR);
1637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (pos != 6 || gztell(file) != pos) {
1647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",
1657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                (long)pos, (long)gztell(file));
1667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
1677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gzgetc(file) != ' ') {
1707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "gzgetc error\n");
1717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
1727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gzungetc(' ', file) != ' ') {
1757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "gzungetc error\n");
1767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
1777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzgets(file, (char*)uncompr, (int)uncomprLen);
1807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (strlen((char*)uncompr) != 7) { /* " hello!" */
1817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
1827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
1837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (strcmp((char*)uncompr, hello + 6)) {
1857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "bad gzgets after gzseek\n");
1867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
1877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } else {
1887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        printf("gzgets() after gzseek: %s\n", (char*)uncompr);
1897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzclose(file);
1927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
1937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* Z_SOLO */
1967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
1987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Test deflate() with small buffers
1997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
2007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_deflate(compr, comprLen)
2017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Byte *compr;
2027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong comprLen;
2037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
2047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_stream c_stream; /* compression stream */
2057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
2067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong len = (uLong)strlen(hello)+1;
2077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.zalloc = zalloc;
2097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.zfree = zfree;
2107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.opaque = (voidpf)0;
2117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
2137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflateInit");
2147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.next_in  = (z_const unsigned char *)hello;
2167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.next_out = compr;
2177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    while (c_stream.total_in != len && c_stream.total_out < comprLen) {
2197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
2207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        err = deflate(&c_stream, Z_NO_FLUSH);
2217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        CHECK_ERR(err, "deflate");
2227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
2237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* Finish the stream, still forcing small buffers: */
2247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    for (;;) {
2257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        c_stream.avail_out = 1;
2267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        err = deflate(&c_stream, Z_FINISH);
2277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (err == Z_STREAM_END) break;
2287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        CHECK_ERR(err, "deflate");
2297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
2307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflateEnd(&c_stream);
2327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflateEnd");
2337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
2347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
2367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Test inflate() with small buffers
2377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
2387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_inflate(compr, comprLen, uncompr, uncomprLen)
2397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Byte *compr, *uncompr;
2407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong comprLen, uncomprLen;
2417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
2427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
2437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_stream d_stream; /* decompression stream */
2447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strcpy((char*)uncompr, "garbage");
2467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.zalloc = zalloc;
2487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.zfree = zfree;
2497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.opaque = (voidpf)0;
2507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.next_in  = compr;
2527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.avail_in = 0;
2537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.next_out = uncompr;
2547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = inflateInit(&d_stream);
2567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "inflateInit");
2577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
2597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
2607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        err = inflate(&d_stream, Z_NO_FLUSH);
2617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (err == Z_STREAM_END) break;
2627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        CHECK_ERR(err, "inflate");
2637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
2647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = inflateEnd(&d_stream);
2667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "inflateEnd");
2677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (strcmp((char*)uncompr, hello)) {
2697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "bad inflate\n");
2707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
2717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } else {
2727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        printf("inflate(): %s\n", (char *)uncompr);
2737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
2747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
2757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
2777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Test deflate() with large buffers and dynamic change of compression level
2787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
2797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_large_deflate(compr, comprLen, uncompr, uncomprLen)
2807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Byte *compr, *uncompr;
2817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong comprLen, uncomprLen;
2827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
2837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_stream c_stream; /* compression stream */
2847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
2857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.zalloc = zalloc;
2877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.zfree = zfree;
2887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.opaque = (voidpf)0;
2897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflateInit(&c_stream, Z_BEST_SPEED);
2917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflateInit");
2927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.next_out = compr;
2947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.avail_out = (uInt)comprLen;
2957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* At this point, uncompr is still mostly zeroes, so it should compress
2977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     * very well:
2987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     */
2997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.next_in = uncompr;
3007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.avail_in = (uInt)uncomprLen;
3017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflate(&c_stream, Z_NO_FLUSH);
3027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflate");
3037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (c_stream.avail_in != 0) {
3047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "deflate not greedy\n");
3057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
3067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
3077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* Feed in already compressed data and switch to no compression: */
3097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
3107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.next_in = compr;
3117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.avail_in = (uInt)comprLen/2;
3127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflate(&c_stream, Z_NO_FLUSH);
3137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflate");
3147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* Switch back to compressing mode: */
3167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
3177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.next_in = uncompr;
3187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.avail_in = (uInt)uncomprLen;
3197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflate(&c_stream, Z_NO_FLUSH);
3207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflate");
3217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflate(&c_stream, Z_FINISH);
3237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (err != Z_STREAM_END) {
3247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "deflate should report Z_STREAM_END\n");
3257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
3267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
3277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflateEnd(&c_stream);
3287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflateEnd");
3297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
3307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
3327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Test inflate() with large buffers
3337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
3347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_large_inflate(compr, comprLen, uncompr, uncomprLen)
3357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Byte *compr, *uncompr;
3367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong comprLen, uncomprLen;
3377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
3397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_stream d_stream; /* decompression stream */
3407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strcpy((char*)uncompr, "garbage");
3427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.zalloc = zalloc;
3447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.zfree = zfree;
3457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.opaque = (voidpf)0;
3467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.next_in  = compr;
3487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.avail_in = (uInt)comprLen;
3497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = inflateInit(&d_stream);
3517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "inflateInit");
3527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    for (;;) {
3547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        d_stream.next_out = uncompr;            /* discard the output */
3557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        d_stream.avail_out = (uInt)uncomprLen;
3567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        err = inflate(&d_stream, Z_NO_FLUSH);
3577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (err == Z_STREAM_END) break;
3587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        CHECK_ERR(err, "large inflate");
3597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
3607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = inflateEnd(&d_stream);
3627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "inflateEnd");
3637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
3657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
3667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
3677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } else {
3687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        printf("large_inflate(): OK\n");
3697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
3707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
3717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
3737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Test deflate() with full flush
3747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
3757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_flush(compr, comprLen)
3767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Byte *compr;
3777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong *comprLen;
3787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_stream c_stream; /* compression stream */
3807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
3817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uInt len = (uInt)strlen(hello)+1;
3827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.zalloc = zalloc;
3847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.zfree = zfree;
3857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.opaque = (voidpf)0;
3867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
3887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflateInit");
3897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.next_in  = (z_const unsigned char *)hello;
3917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.next_out = compr;
3927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.avail_in = 3;
3937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.avail_out = (uInt)*comprLen;
3947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflate(&c_stream, Z_FULL_FLUSH);
3957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflate");
3967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    compr[3]++; /* force an error in first compressed block */
3987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.avail_in = len - 3;
3997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflate(&c_stream, Z_FINISH);
4017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (err != Z_STREAM_END) {
4027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        CHECK_ERR(err, "deflate");
4037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
4047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflateEnd(&c_stream);
4057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflateEnd");
4067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *comprLen = c_stream.total_out;
4087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
4117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Test inflateSync()
4127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
4137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_sync(compr, comprLen, uncompr, uncomprLen)
4147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Byte *compr, *uncompr;
4157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong comprLen, uncomprLen;
4167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
4187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_stream d_stream; /* decompression stream */
4197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strcpy((char*)uncompr, "garbage");
4217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.zalloc = zalloc;
4237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.zfree = zfree;
4247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.opaque = (voidpf)0;
4257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.next_in  = compr;
4277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.avail_in = 2; /* just read the zlib header */
4287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = inflateInit(&d_stream);
4307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "inflateInit");
4317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.next_out = uncompr;
4337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.avail_out = (uInt)uncomprLen;
4347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    inflate(&d_stream, Z_NO_FLUSH);
4367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "inflate");
4377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.avail_in = (uInt)comprLen-2;   /* read all compressed data */
4397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = inflateSync(&d_stream);           /* but skip the damaged part */
4407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "inflateSync");
4417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = inflate(&d_stream, Z_FINISH);
4437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (err != Z_DATA_ERROR) {
4447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "inflate should report DATA_ERROR\n");
4457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        /* Because of incorrect adler32 */
4467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
4477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
4487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = inflateEnd(&d_stream);
4497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "inflateEnd");
4507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    printf("after inflateSync(): hel%s\n", (char *)uncompr);
4527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
4557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Test deflate() with preset dictionary
4567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
4577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_dict_deflate(compr, comprLen)
4587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Byte *compr;
4597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong comprLen;
4607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_stream c_stream; /* compression stream */
4627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
4637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.zalloc = zalloc;
4657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.zfree = zfree;
4667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.opaque = (voidpf)0;
4677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflateInit(&c_stream, Z_BEST_COMPRESSION);
4697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflateInit");
4707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflateSetDictionary(&c_stream,
4727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                (const Bytef*)dictionary, (int)sizeof(dictionary));
4737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflateSetDictionary");
4747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    dictId = c_stream.adler;
4767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.next_out = compr;
4777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.avail_out = (uInt)comprLen;
4787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.next_in = (z_const unsigned char *)hello;
4807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    c_stream.avail_in = (uInt)strlen(hello)+1;
4817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflate(&c_stream, Z_FINISH);
4837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (err != Z_STREAM_END) {
4847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "deflate should report Z_STREAM_END\n");
4857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
4867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
4877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = deflateEnd(&c_stream);
4887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "deflateEnd");
4897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
4927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Test inflate() with a preset dictionary
4937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
4947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
4957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Byte *compr, *uncompr;
4967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong comprLen, uncomprLen;
4977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
4997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_stream d_stream; /* decompression stream */
5007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strcpy((char*)uncompr, "garbage");
5027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.zalloc = zalloc;
5047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.zfree = zfree;
5057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.opaque = (voidpf)0;
5067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.next_in  = compr;
5087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.avail_in = (uInt)comprLen;
5097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = inflateInit(&d_stream);
5117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "inflateInit");
5127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.next_out = uncompr;
5147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    d_stream.avail_out = (uInt)uncomprLen;
5157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    for (;;) {
5177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        err = inflate(&d_stream, Z_NO_FLUSH);
5187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (err == Z_STREAM_END) break;
5197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (err == Z_NEED_DICT) {
5207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            if (d_stream.adler != dictId) {
5217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                fprintf(stderr, "unexpected dictionary");
5227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                exit(1);
5237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            }
5247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,
5257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                                       (int)sizeof(dictionary));
5267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
5277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        CHECK_ERR(err, "inflate with dict");
5287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
5297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    err = inflateEnd(&d_stream);
5317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    CHECK_ERR(err, "inflateEnd");
5327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (strcmp((char*)uncompr, hello)) {
5347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "bad inflate with dict\n");
5357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
5367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } else {
5377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        printf("inflate with dictionary: %s\n", (char *)uncompr);
5387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
5397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
5407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
5427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Usage:  example [output.gz  [input.gz]]
5437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
5447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint main(argc, argv)
5467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int argc;
5477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    char *argv[];
5487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
5497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    Byte *compr, *uncompr;
5507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
5517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uLong uncomprLen = comprLen;
5527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    static const char* myVersion = ZLIB_VERSION;
5537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (zlibVersion()[0] != myVersion[0]) {
5557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "incompatible zlib version\n");
5567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
5577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
5597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "warning: different zlib version\n");
5607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
5617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n",
5637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags());
5647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    compr    = (Byte*)calloc((uInt)comprLen, 1);
5667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    uncompr  = (Byte*)calloc((uInt)uncomprLen, 1);
5677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* compr and uncompr are cleared to avoid reading uninitialized
5687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     * data and to ensure that uncompr compresses well.
5697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     */
5707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (compr == Z_NULL || uncompr == Z_NULL) {
5717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        printf("out of memory\n");
5727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
5737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
5747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef Z_SOLO
5767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    argc = strlen(argv[0]);
5777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else
5787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    test_compress(compr, comprLen, uncompr, uncomprLen);
5797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    test_gzio((argc > 1 ? argv[1] : TESTFILE),
5817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel              uncompr, uncomprLen);
5827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
5837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    test_deflate(compr, comprLen);
5857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    test_inflate(compr, comprLen, uncompr, uncomprLen);
5867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    test_large_deflate(compr, comprLen, uncompr, uncomprLen);
5887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    test_large_inflate(compr, comprLen, uncompr, uncomprLen);
5897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    test_flush(compr, &comprLen);
5917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    test_sync(compr, comprLen, uncompr, uncomprLen);
5927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    comprLen = uncomprLen;
5937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    test_dict_deflate(compr, comprLen);
5957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
5967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    free(compr);
5987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    free(uncompr);
5997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return 0;
6017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
602