19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* example.c -- usage example of the zlib compression library
2ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes * Copyright (C) 1995-2006, 2011 Jean-loup Gailly.
39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * For conditions of distribution and use, see copyright notice in zlib.h
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* @(#) $Id$ */
79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "zlib.h"
9381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#include <stdio.h>
109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef STDC
129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#  include <string.h>
139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#  include <stdlib.h>
149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#if defined(VMS) || defined(RISCOS)
179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#  define TESTFILE "foo-gz"
189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else
199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#  define TESTFILE "foo.gz"
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define CHECK_ERR(err, msg) { \
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err != Z_OK) { \
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "%s error: %d\n", msg, err); \
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1); \
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    } \
279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2904351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughesz_const char hello[] = "hello, hello!";
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* "hello world" would be more standard, but the repeated "hello"
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * stresses the compression code better, sorry...
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconst char dictionary[] = "hello";
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectuLong dictId; /* Adler32 value of the dictionary */
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_deflate       OF((Byte *compr, uLong comprLen));
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_inflate       OF((Byte *compr, uLong comprLen,
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                            Byte *uncompr, uLong uncomprLen));
409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_large_deflate OF((Byte *compr, uLong comprLen,
419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                            Byte *uncompr, uLong uncomprLen));
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_large_inflate OF((Byte *compr, uLong comprLen,
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                            Byte *uncompr, uLong uncomprLen));
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_flush         OF((Byte *compr, uLong *comprLen));
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_sync          OF((Byte *compr, uLong comprLen,
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                            Byte *uncompr, uLong uncomprLen));
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_dict_deflate  OF((Byte *compr, uLong comprLen));
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_dict_inflate  OF((Byte *compr, uLong comprLen,
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                            Byte *uncompr, uLong uncomprLen));
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint  main               OF((int argc, char *argv[]));
519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
52ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
53ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#ifdef Z_SOLO
54ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
55ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughesvoid *myalloc OF((void *, unsigned, unsigned));
56ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughesvoid myfree OF((void *, void *));
57ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
58ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughesvoid *myalloc(q, n, m)
59ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    void *q;
60ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    unsigned n, m;
61ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes{
62ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    q = Z_NULL;
63ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    return calloc(n, m);
64ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes}
65ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
66ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughesvoid myfree(void *q, void *p)
67ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes{
68ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    q = Z_NULL;
69ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    free(p);
70ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes}
71ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
72ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughesstatic alloc_func zalloc = myalloc;
73ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughesstatic free_func zfree = myfree;
74ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
75ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#else /* !Z_SOLO */
76ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
77ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughesstatic alloc_func zalloc = (alloc_func)0;
78ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughesstatic free_func zfree = (free_func)0;
79ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
80ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughesvoid test_compress      OF((Byte *compr, uLong comprLen,
81ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes                            Byte *uncompr, uLong uncomprLen));
82ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughesvoid test_gzio          OF((const char *fname,
83ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes                            Byte *uncompr, uLong uncomprLen));
84ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test compress() and uncompress()
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_compress(compr, comprLen, uncompr, uncomprLen)
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Byte *compr, *uncompr;
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong comprLen, uncomprLen;
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong len = (uLong)strlen(hello)+1;
949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = compress(compr, &comprLen, (const Bytef*)hello, len);
969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "compress");
979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strcpy((char*)uncompr, "garbage");
999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = uncompress(uncompr, &uncomprLen, compr, comprLen);
1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "uncompress");
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (strcmp((char*)uncompr, hello)) {
1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "bad uncompress\n");
1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    } else {
1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        printf("uncompress(): %s\n", (char *)uncompr);
1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test read/write of .gz files
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_gzio(fname, uncompr, uncomprLen)
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    const char *fname; /* compressed file name */
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Byte *uncompr;
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong uncomprLen;
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef NO_GZCOMPRESS
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n");
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int len = (int)strlen(hello)+1;
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    gzFile file;
1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    z_off_t pos;
1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    file = gzopen(fname, "wb");
1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file == NULL) {
1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "gzopen error\n");
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    gzputc(file, 'h');
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (gzputs(file, "ello") != 4) {
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (gzprintf(file, ", %s!", "hello") != 8) {
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));
1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    gzclose(file);
1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    file = gzopen(fname, "rb");
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (file == NULL) {
1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "gzopen error\n");
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strcpy((char*)uncompr, "garbage");
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (gzread(file, uncompr, (unsigned)uncomprLen) != len) {
1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (strcmp((char*)uncompr, hello)) {
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    } else {
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        printf("gzread(): %s\n", (char*)uncompr);
1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pos = gzseek(file, -8L, SEEK_CUR);
1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (pos != 6 || gztell(file) != pos) {
1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",
1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                (long)pos, (long)gztell(file));
1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (gzgetc(file) != ' ') {
1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "gzgetc error\n");
1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (gzungetc(' ', file) != ' ') {
1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "gzungetc error\n");
1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    gzgets(file, (char*)uncompr, (int)uncomprLen);
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (strlen((char*)uncompr) != 7) { /* " hello!" */
1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (strcmp((char*)uncompr, hello + 6)) {
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "bad gzgets after gzseek\n");
1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    } else {
1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        printf("gzgets() after gzseek: %s\n", (char*)uncompr);
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    gzclose(file);
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
195ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#endif /* Z_SOLO */
196ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test deflate() with small buffers
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_deflate(compr, comprLen)
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Byte *compr;
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong comprLen;
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    z_stream c_stream; /* compression stream */
2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong len = (uLong)strlen(hello)+1;
2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
208ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    c_stream.zalloc = zalloc;
209ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    c_stream.zfree = zfree;
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.opaque = (voidpf)0;
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflateInit");
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
21504351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes    c_stream.next_in  = (z_const unsigned char *)hello;
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.next_out = compr;
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    while (c_stream.total_in != len && c_stream.total_out < comprLen) {
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err = deflate(&c_stream, Z_NO_FLUSH);
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        CHECK_ERR(err, "deflate");
2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Finish the stream, still forcing small buffers: */
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    for (;;) {
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        c_stream.avail_out = 1;
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err = deflate(&c_stream, Z_FINISH);
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (err == Z_STREAM_END) break;
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        CHECK_ERR(err, "deflate");
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflateEnd(&c_stream);
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflateEnd");
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test inflate() with small buffers
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_inflate(compr, comprLen, uncompr, uncomprLen)
2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Byte *compr, *uncompr;
2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong comprLen, uncomprLen;
2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    z_stream d_stream; /* decompression stream */
2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strcpy((char*)uncompr, "garbage");
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
247ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    d_stream.zalloc = zalloc;
248ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    d_stream.zfree = zfree;
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.opaque = (voidpf)0;
2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.next_in  = compr;
2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.avail_in = 0;
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.next_out = uncompr;
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflateInit(&d_stream);
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "inflateInit");
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err = inflate(&d_stream, Z_NO_FLUSH);
2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (err == Z_STREAM_END) break;
2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        CHECK_ERR(err, "inflate");
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflateEnd(&d_stream);
2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "inflateEnd");
2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (strcmp((char*)uncompr, hello)) {
2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "bad inflate\n");
2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    } else {
2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        printf("inflate(): %s\n", (char *)uncompr);
2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test deflate() with large buffers and dynamic change of compression level
2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_large_deflate(compr, comprLen, uncompr, uncomprLen)
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Byte *compr, *uncompr;
2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong comprLen, uncomprLen;
2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    z_stream c_stream; /* compression stream */
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
286ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    c_stream.zalloc = zalloc;
287ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    c_stream.zfree = zfree;
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.opaque = (voidpf)0;
2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflateInit(&c_stream, Z_BEST_SPEED);
2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflateInit");
2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.next_out = compr;
2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.avail_out = (uInt)comprLen;
2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* At this point, uncompr is still mostly zeroes, so it should compress
2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * very well:
2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.next_in = uncompr;
3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.avail_in = (uInt)uncomprLen;
3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflate(&c_stream, Z_NO_FLUSH);
3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflate");
3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (c_stream.avail_in != 0) {
3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "deflate not greedy\n");
3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Feed in already compressed data and switch to no compression: */
3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.next_in = compr;
3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.avail_in = (uInt)comprLen/2;
3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflate(&c_stream, Z_NO_FLUSH);
3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflate");
3149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Switch back to compressing mode: */
3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.next_in = uncompr;
3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.avail_in = (uInt)uncomprLen;
3199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflate(&c_stream, Z_NO_FLUSH);
3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflate");
3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflate(&c_stream, Z_FINISH);
3239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err != Z_STREAM_END) {
3249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "deflate should report Z_STREAM_END\n");
3259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
3269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
3279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflateEnd(&c_stream);
3289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflateEnd");
3299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
3309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
3329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test inflate() with large buffers
3339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
3349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_large_inflate(compr, comprLen, uncompr, uncomprLen)
3359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Byte *compr, *uncompr;
3369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong comprLen, uncomprLen;
3379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
3399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    z_stream d_stream; /* decompression stream */
3409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strcpy((char*)uncompr, "garbage");
3429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
343ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    d_stream.zalloc = zalloc;
344ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    d_stream.zfree = zfree;
3459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.opaque = (voidpf)0;
3469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.next_in  = compr;
3489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.avail_in = (uInt)comprLen;
3499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflateInit(&d_stream);
3519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "inflateInit");
3529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    for (;;) {
3549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        d_stream.next_out = uncompr;            /* discard the output */
3559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        d_stream.avail_out = (uInt)uncomprLen;
3569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err = inflate(&d_stream, Z_NO_FLUSH);
3579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (err == Z_STREAM_END) break;
3589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        CHECK_ERR(err, "large inflate");
3599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
3609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflateEnd(&d_stream);
3629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "inflateEnd");
3639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
3659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
3669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
3679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    } else {
3689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        printf("large_inflate(): OK\n");
3699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
3709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
3719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
3739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test deflate() with full flush
3749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
3759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_flush(compr, comprLen)
3769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Byte *compr;
3779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong *comprLen;
3789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
3799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    z_stream c_stream; /* compression stream */
3809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
3819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt len = (uInt)strlen(hello)+1;
3829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
383ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    c_stream.zalloc = zalloc;
384ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    c_stream.zfree = zfree;
3859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.opaque = (voidpf)0;
3869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
3889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflateInit");
3899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
39004351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes    c_stream.next_in  = (z_const unsigned char *)hello;
3919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.next_out = compr;
3929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.avail_in = 3;
3939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.avail_out = (uInt)*comprLen;
3949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflate(&c_stream, Z_FULL_FLUSH);
3959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflate");
3969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    compr[3]++; /* force an error in first compressed block */
3989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.avail_in = len - 3;
3999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflate(&c_stream, Z_FINISH);
4019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err != Z_STREAM_END) {
4029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        CHECK_ERR(err, "deflate");
4039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
4049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflateEnd(&c_stream);
4059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflateEnd");
4069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *comprLen = c_stream.total_out;
4089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
4099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
4119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test inflateSync()
4129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
4139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_sync(compr, comprLen, uncompr, uncomprLen)
4149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Byte *compr, *uncompr;
4159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong comprLen, uncomprLen;
4169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
4179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
4189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    z_stream d_stream; /* decompression stream */
4199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strcpy((char*)uncompr, "garbage");
4219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
422ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    d_stream.zalloc = zalloc;
423ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    d_stream.zfree = zfree;
4249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.opaque = (voidpf)0;
4259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.next_in  = compr;
4279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.avail_in = 2; /* just read the zlib header */
4289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflateInit(&d_stream);
4309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "inflateInit");
4319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.next_out = uncompr;
4339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.avail_out = (uInt)uncomprLen;
4349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    inflate(&d_stream, Z_NO_FLUSH);
4369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "inflate");
4379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.avail_in = (uInt)comprLen-2;   /* read all compressed data */
4399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflateSync(&d_stream);           /* but skip the damaged part */
4409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "inflateSync");
4419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflate(&d_stream, Z_FINISH);
4439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err != Z_DATA_ERROR) {
4449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "inflate should report DATA_ERROR\n");
4459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* Because of incorrect adler32 */
4469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
4479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
4489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflateEnd(&d_stream);
4499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "inflateEnd");
4509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    printf("after inflateSync(): hel%s\n", (char *)uncompr);
4529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
4539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
4559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test deflate() with preset dictionary
4569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
4579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_dict_deflate(compr, comprLen)
4589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Byte *compr;
4599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong comprLen;
4609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
4619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    z_stream c_stream; /* compression stream */
4629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
4639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
464ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    c_stream.zalloc = zalloc;
465ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    c_stream.zfree = zfree;
4669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.opaque = (voidpf)0;
4679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflateInit(&c_stream, Z_BEST_COMPRESSION);
4699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflateInit");
4709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflateSetDictionary(&c_stream,
472ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes                (const Bytef*)dictionary, (int)sizeof(dictionary));
4739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflateSetDictionary");
4749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    dictId = c_stream.adler;
4769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.next_out = compr;
4779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.avail_out = (uInt)comprLen;
4789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
47904351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes    c_stream.next_in = (z_const unsigned char *)hello;
4809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.avail_in = (uInt)strlen(hello)+1;
4819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflate(&c_stream, Z_FINISH);
4839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err != Z_STREAM_END) {
4849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "deflate should report Z_STREAM_END\n");
4859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
4869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
4879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = deflateEnd(&c_stream);
4889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "deflateEnd");
4899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
4909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
4929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test inflate() with a preset dictionary
4939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
4949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvoid test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
4959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Byte *compr, *uncompr;
4969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong comprLen, uncomprLen;
4979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
4989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
4999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    z_stream d_stream; /* decompression stream */
5009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strcpy((char*)uncompr, "garbage");
5029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
503ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    d_stream.zalloc = zalloc;
504ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    d_stream.zfree = zfree;
5059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.opaque = (voidpf)0;
5069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.next_in  = compr;
5089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.avail_in = (uInt)comprLen;
5099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflateInit(&d_stream);
5119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "inflateInit");
5129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.next_out = uncompr;
5149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.avail_out = (uInt)uncomprLen;
5159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    for (;;) {
5179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        err = inflate(&d_stream, Z_NO_FLUSH);
5189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (err == Z_STREAM_END) break;
5199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (err == Z_NEED_DICT) {
5209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            if (d_stream.adler != dictId) {
5219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                fprintf(stderr, "unexpected dictionary");
5229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                exit(1);
5239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            }
5249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,
525ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes                                       (int)sizeof(dictionary));
5269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
5279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        CHECK_ERR(err, "inflate with dict");
5289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
5299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflateEnd(&d_stream);
5319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, "inflateEnd");
5329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (strcmp((char*)uncompr, hello)) {
5349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "bad inflate with dict\n");
5359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
5369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    } else {
5379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        printf("inflate with dictionary: %s\n", (char *)uncompr);
5389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
5399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
5409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
5429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Usage:  example [output.gz  [input.gz]]
5439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
5449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint main(argc, argv)
5469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int argc;
5479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    char *argv[];
5489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
5499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Byte *compr, *uncompr;
5509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
5519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong uncomprLen = comprLen;
5529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    static const char* myVersion = ZLIB_VERSION;
5539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (zlibVersion()[0] != myVersion[0]) {
5559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "incompatible zlib version\n");
5569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
5579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
5599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        fprintf(stderr, "warning: different zlib version\n");
5609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
5619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n",
5639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags());
5649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    compr    = (Byte*)calloc((uInt)comprLen, 1);
5669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uncompr  = (Byte*)calloc((uInt)uncomprLen, 1);
5679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* compr and uncompr are cleared to avoid reading uninitialized
5689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * data and to ensure that uncompr compresses well.
5699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
5709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (compr == Z_NULL || uncompr == Z_NULL) {
5719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        printf("out of memory\n");
5729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        exit(1);
5739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
574ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
575ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#ifdef Z_SOLO
576ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    argc = strlen(argv[0]);
577ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#else
5789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    test_compress(compr, comprLen, uncompr, uncomprLen);
5799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    test_gzio((argc > 1 ? argv[1] : TESTFILE),
5819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project              uncompr, uncomprLen);
582ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#endif
5839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    test_deflate(compr, comprLen);
5859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    test_inflate(compr, comprLen, uncompr, uncomprLen);
5869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    test_large_deflate(compr, comprLen, uncompr, uncomprLen);
5889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    test_large_inflate(compr, comprLen, uncompr, uncomprLen);
5899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    test_flush(compr, &comprLen);
5919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    test_sync(compr, comprLen, uncompr, uncomprLen);
5929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    comprLen = uncomprLen;
5939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    test_dict_deflate(compr, comprLen);
5959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
5969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    free(compr);
5989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    free(uncompr);
5999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
6009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return 0;
6019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
602