Home | History | Annotate | Line # | Download | only in test
example.c revision 1.1.1.1.16.2
      1           1.1  christos /* example.c -- usage example of the zlib compression library
      2           1.1  christos  * Copyright (C) 1995-2006, 2011, 2016 Jean-loup Gailly
      3           1.1  christos  * For conditions of distribution and use, see copyright notice in zlib.h
      4           1.1  christos  */
      5           1.1  christos 
      6  1.1.1.1.16.1    martin /* @(#) $Id: example.c,v 1.1.1.1.16.2 2020/04/21 19:37:40 martin Exp $ */
      7           1.1  christos 
      8           1.1  christos #include "zlib.h"
      9           1.1  christos #include <stdio.h>
     10           1.1  christos 
     11           1.1  christos #ifdef STDC
     12           1.1  christos #  include <string.h>
     13           1.1  christos #  include <stdlib.h>
     14           1.1  christos #endif
     15           1.1  christos 
     16           1.1  christos #if defined(VMS) || defined(RISCOS)
     17           1.1  christos #  define TESTFILE "foo-gz"
     18           1.1  christos #else
     19           1.1  christos #  define TESTFILE "foo.gz"
     20           1.1  christos #endif
     21           1.1  christos 
     22           1.1  christos #define CHECK_ERR(err, msg) { \
     23           1.1  christos     if (err != Z_OK) { \
     24           1.1  christos         fprintf(stderr, "%s error: %d\n", msg, err); \
     25           1.1  christos         exit(1); \
     26           1.1  christos     } \
     27           1.1  christos }
     28           1.1  christos 
     29           1.1  christos static z_const char hello[] = "hello, hello!";
     30           1.1  christos /* "hello world" would be more standard, but the repeated "hello"
     31           1.1  christos  * stresses the compression code better, sorry...
     32           1.1  christos  */
     33           1.1  christos 
     34           1.1  christos static const char dictionary[] = "hello";
     35           1.1  christos static uLong dictId;    /* Adler32 value of the dictionary */
     36           1.1  christos 
     37           1.1  christos void test_deflate       OF((Byte *compr, uLong comprLen));
     38           1.1  christos void test_inflate       OF((Byte *compr, uLong comprLen,
     39           1.1  christos                             Byte *uncompr, uLong uncomprLen));
     40           1.1  christos void test_large_deflate OF((Byte *compr, uLong comprLen,
     41           1.1  christos                             Byte *uncompr, uLong uncomprLen));
     42           1.1  christos void test_large_inflate OF((Byte *compr, uLong comprLen,
     43           1.1  christos                             Byte *uncompr, uLong uncomprLen));
     44           1.1  christos void test_flush         OF((Byte *compr, uLong *comprLen));
     45           1.1  christos void test_sync          OF((Byte *compr, uLong comprLen,
     46           1.1  christos                             Byte *uncompr, uLong uncomprLen));
     47           1.1  christos void test_dict_deflate  OF((Byte *compr, uLong comprLen));
     48           1.1  christos void test_dict_inflate  OF((Byte *compr, uLong comprLen,
     49           1.1  christos                             Byte *uncompr, uLong uncomprLen));
     50           1.1  christos int  main               OF((int argc, char *argv[]));
     51           1.1  christos 
     52           1.1  christos 
     53           1.1  christos #ifdef Z_SOLO
     54           1.1  christos 
     55           1.1  christos void *myalloc OF((void *, unsigned, unsigned));
     56           1.1  christos void myfree OF((void *, void *));
     57           1.1  christos 
     58           1.1  christos void *myalloc(q, n, m)
     59           1.1  christos     void *q;
     60           1.1  christos     unsigned n, m;
     61           1.1  christos {
     62           1.1  christos     (void)q;
     63           1.1  christos     return calloc(n, m);
     64           1.1  christos }
     65           1.1  christos 
     66           1.1  christos void myfree(void *q, void *p)
     67           1.1  christos {
     68           1.1  christos     (void)q;
     69           1.1  christos     free(p);
     70           1.1  christos }
     71           1.1  christos 
     72           1.1  christos static alloc_func zalloc = myalloc;
     73           1.1  christos static free_func zfree = myfree;
     74           1.1  christos 
     75           1.1  christos #else /* !Z_SOLO */
     76           1.1  christos 
     77           1.1  christos static alloc_func zalloc = (alloc_func)0;
     78           1.1  christos static free_func zfree = (free_func)0;
     79           1.1  christos 
     80           1.1  christos void test_compress      OF((Byte *compr, uLong comprLen,
     81           1.1  christos                             Byte *uncompr, uLong uncomprLen));
     82           1.1  christos void test_gzio          OF((const char *fname,
     83           1.1  christos                             Byte *uncompr, uLong uncomprLen));
     84           1.1  christos 
     85           1.1  christos /* ===========================================================================
     86           1.1  christos  * Test compress() and uncompress()
     87           1.1  christos  */
     88           1.1  christos void test_compress(compr, comprLen, uncompr, uncomprLen)
     89           1.1  christos     Byte *compr, *uncompr;
     90           1.1  christos     uLong comprLen, uncomprLen;
     91           1.1  christos {
     92           1.1  christos     int err;
     93           1.1  christos     uLong len = (uLong)strlen(hello)+1;
     94           1.1  christos 
     95           1.1  christos     err = compress(compr, &comprLen, (const Bytef*)hello, len);
     96           1.1  christos     CHECK_ERR(err, "compress");
     97           1.1  christos 
     98           1.1  christos     strcpy((char*)uncompr, "garbage");
     99           1.1  christos 
    100           1.1  christos     err = uncompress(uncompr, &uncomprLen, compr, comprLen);
    101           1.1  christos     CHECK_ERR(err, "uncompress");
    102           1.1  christos 
    103           1.1  christos     if (strcmp((char*)uncompr, hello)) {
    104           1.1  christos         fprintf(stderr, "bad uncompress\n");
    105           1.1  christos         exit(1);
    106           1.1  christos     } else {
    107           1.1  christos         printf("uncompress(): %s\n", (char *)uncompr);
    108           1.1  christos     }
    109           1.1  christos }
    110           1.1  christos 
    111           1.1  christos /* ===========================================================================
    112           1.1  christos  * Test read/write of .gz files
    113           1.1  christos  */
    114           1.1  christos void test_gzio(fname, uncompr, uncomprLen)
    115           1.1  christos     const char *fname; /* compressed file name */
    116           1.1  christos     Byte *uncompr;
    117           1.1  christos     uLong uncomprLen;
    118           1.1  christos {
    119           1.1  christos #ifdef NO_GZCOMPRESS
    120           1.1  christos     fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n");
    121           1.1  christos #else
    122           1.1  christos     int err;
    123           1.1  christos     int len = (int)strlen(hello)+1;
    124           1.1  christos     gzFile file;
    125           1.1  christos     z_off_t pos;
    126           1.1  christos 
    127           1.1  christos     file = gzopen(fname, "wb");
    128           1.1  christos     if (file == NULL) {
    129           1.1  christos         fprintf(stderr, "gzopen error\n");
    130           1.1  christos         exit(1);
    131           1.1  christos     }
    132           1.1  christos     gzputc(file, 'h');
    133           1.1  christos     if (gzputs(file, "ello") != 4) {
    134           1.1  christos         fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));
    135           1.1  christos         exit(1);
    136           1.1  christos     }
    137           1.1  christos     if (gzprintf(file, ", %s!", "hello") != 8) {
    138           1.1  christos         fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));
    139           1.1  christos         exit(1);
    140           1.1  christos     }
    141           1.1  christos     gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
    142           1.1  christos     gzclose(file);
    143           1.1  christos 
    144           1.1  christos     file = gzopen(fname, "rb");
    145           1.1  christos     if (file == NULL) {
    146           1.1  christos         fprintf(stderr, "gzopen error\n");
    147           1.1  christos         exit(1);
    148           1.1  christos     }
    149           1.1  christos     strcpy((char*)uncompr, "garbage");
    150           1.1  christos 
    151           1.1  christos     if (gzread(file, uncompr, (unsigned)uncomprLen) != len) {
    152           1.1  christos         fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
    153           1.1  christos         exit(1);
    154           1.1  christos     }
    155           1.1  christos     if (strcmp((char*)uncompr, hello)) {
    156           1.1  christos         fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
    157           1.1  christos         exit(1);
    158           1.1  christos     } else {
    159           1.1  christos         printf("gzread(): %s\n", (char*)uncompr);
    160           1.1  christos     }
    161           1.1  christos 
    162           1.1  christos     pos = gzseek(file, -8L, SEEK_CUR);
    163           1.1  christos     if (pos != 6 || gztell(file) != pos) {
    164           1.1  christos         fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",
    165           1.1  christos                 (long)pos, (long)gztell(file));
    166           1.1  christos         exit(1);
    167           1.1  christos     }
    168           1.1  christos 
    169           1.1  christos     if (gzgetc(file) != ' ') {
    170           1.1  christos         fprintf(stderr, "gzgetc error\n");
    171           1.1  christos         exit(1);
    172           1.1  christos     }
    173           1.1  christos 
    174           1.1  christos     if (gzungetc(' ', file) != ' ') {
    175           1.1  christos         fprintf(stderr, "gzungetc error\n");
    176           1.1  christos         exit(1);
    177           1.1  christos     }
    178           1.1  christos 
    179           1.1  christos     gzgets(file, (char*)uncompr, (int)uncomprLen);
    180           1.1  christos     if (strlen((char*)uncompr) != 7) { /* " hello!" */
    181           1.1  christos         fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
    182           1.1  christos         exit(1);
    183           1.1  christos     }
    184           1.1  christos     if (strcmp((char*)uncompr, hello + 6)) {
    185           1.1  christos         fprintf(stderr, "bad gzgets after gzseek\n");
    186           1.1  christos         exit(1);
    187           1.1  christos     } else {
    188           1.1  christos         printf("gzgets() after gzseek: %s\n", (char*)uncompr);
    189           1.1  christos     }
    190           1.1  christos 
    191           1.1  christos     gzclose(file);
    192           1.1  christos #endif
    193           1.1  christos }
    194           1.1  christos 
    195           1.1  christos #endif /* Z_SOLO */
    196           1.1  christos 
    197           1.1  christos /* ===========================================================================
    198           1.1  christos  * Test deflate() with small buffers
    199           1.1  christos  */
    200           1.1  christos void test_deflate(compr, comprLen)
    201           1.1  christos     Byte *compr;
    202           1.1  christos     uLong comprLen;
    203           1.1  christos {
    204           1.1  christos     z_stream c_stream; /* compression stream */
    205           1.1  christos     int err;
    206           1.1  christos     uLong len = (uLong)strlen(hello)+1;
    207           1.1  christos 
    208           1.1  christos     c_stream.zalloc = zalloc;
    209           1.1  christos     c_stream.zfree = zfree;
    210           1.1  christos     c_stream.opaque = (voidpf)0;
    211           1.1  christos 
    212           1.1  christos     err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
    213           1.1  christos     CHECK_ERR(err, "deflateInit");
    214           1.1  christos 
    215           1.1  christos     c_stream.next_in  = (z_const unsigned char *)hello;
    216           1.1  christos     c_stream.next_out = compr;
    217           1.1  christos 
    218           1.1  christos     while (c_stream.total_in != len && c_stream.total_out < comprLen) {
    219           1.1  christos         c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
    220           1.1  christos         err = deflate(&c_stream, Z_NO_FLUSH);
    221           1.1  christos         CHECK_ERR(err, "deflate");
    222           1.1  christos     }
    223           1.1  christos     /* Finish the stream, still forcing small buffers: */
    224           1.1  christos     for (;;) {
    225           1.1  christos         c_stream.avail_out = 1;
    226           1.1  christos         err = deflate(&c_stream, Z_FINISH);
    227           1.1  christos         if (err == Z_STREAM_END) break;
    228           1.1  christos         CHECK_ERR(err, "deflate");
    229           1.1  christos     }
    230           1.1  christos 
    231           1.1  christos     err = deflateEnd(&c_stream);
    232           1.1  christos     CHECK_ERR(err, "deflateEnd");
    233           1.1  christos }
    234           1.1  christos 
    235           1.1  christos /* ===========================================================================
    236           1.1  christos  * Test inflate() with small buffers
    237           1.1  christos  */
    238           1.1  christos void test_inflate(compr, comprLen, uncompr, uncomprLen)
    239           1.1  christos     Byte *compr, *uncompr;
    240           1.1  christos     uLong comprLen, uncomprLen;
    241           1.1  christos {
    242           1.1  christos     int err;
    243           1.1  christos     z_stream d_stream; /* decompression stream */
    244           1.1  christos 
    245           1.1  christos     strcpy((char*)uncompr, "garbage");
    246           1.1  christos 
    247           1.1  christos     d_stream.zalloc = zalloc;
    248           1.1  christos     d_stream.zfree = zfree;
    249           1.1  christos     d_stream.opaque = (voidpf)0;
    250           1.1  christos 
    251           1.1  christos     d_stream.next_in  = compr;
    252           1.1  christos     d_stream.avail_in = 0;
    253           1.1  christos     d_stream.next_out = uncompr;
    254           1.1  christos 
    255           1.1  christos     err = inflateInit(&d_stream);
    256           1.1  christos     CHECK_ERR(err, "inflateInit");
    257           1.1  christos 
    258           1.1  christos     while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
    259           1.1  christos         d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
    260           1.1  christos         err = inflate(&d_stream, Z_NO_FLUSH);
    261           1.1  christos         if (err == Z_STREAM_END) break;
    262           1.1  christos         CHECK_ERR(err, "inflate");
    263           1.1  christos     }
    264           1.1  christos 
    265           1.1  christos     err = inflateEnd(&d_stream);
    266           1.1  christos     CHECK_ERR(err, "inflateEnd");
    267           1.1  christos 
    268           1.1  christos     if (strcmp((char*)uncompr, hello)) {
    269           1.1  christos         fprintf(stderr, "bad inflate\n");
    270           1.1  christos         exit(1);
    271           1.1  christos     } else {
    272           1.1  christos         printf("inflate(): %s\n", (char *)uncompr);
    273           1.1  christos     }
    274           1.1  christos }
    275           1.1  christos 
    276           1.1  christos /* ===========================================================================
    277           1.1  christos  * Test deflate() with large buffers and dynamic change of compression level
    278           1.1  christos  */
    279           1.1  christos void test_large_deflate(compr, comprLen, uncompr, uncomprLen)
    280           1.1  christos     Byte *compr, *uncompr;
    281           1.1  christos     uLong comprLen, uncomprLen;
    282           1.1  christos {
    283           1.1  christos     z_stream c_stream; /* compression stream */
    284           1.1  christos     int err;
    285           1.1  christos 
    286           1.1  christos     c_stream.zalloc = zalloc;
    287           1.1  christos     c_stream.zfree = zfree;
    288           1.1  christos     c_stream.opaque = (voidpf)0;
    289           1.1  christos 
    290           1.1  christos     err = deflateInit(&c_stream, Z_BEST_SPEED);
    291           1.1  christos     CHECK_ERR(err, "deflateInit");
    292           1.1  christos 
    293           1.1  christos     c_stream.next_out = compr;
    294           1.1  christos     c_stream.avail_out = (uInt)comprLen;
    295           1.1  christos 
    296           1.1  christos     /* At this point, uncompr is still mostly zeroes, so it should compress
    297           1.1  christos      * very well:
    298           1.1  christos      */
    299           1.1  christos     c_stream.next_in = uncompr;
    300           1.1  christos     c_stream.avail_in = (uInt)uncomprLen;
    301           1.1  christos     err = deflate(&c_stream, Z_NO_FLUSH);
    302           1.1  christos     CHECK_ERR(err, "deflate");
    303           1.1  christos     if (c_stream.avail_in != 0) {
    304           1.1  christos         fprintf(stderr, "deflate not greedy\n");
    305           1.1  christos         exit(1);
    306           1.1  christos     }
    307           1.1  christos 
    308           1.1  christos     /* Feed in already compressed data and switch to no compression: */
    309           1.1  christos     deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
    310           1.1  christos     c_stream.next_in = compr;
    311           1.1  christos     c_stream.avail_in = (uInt)comprLen/2;
    312           1.1  christos     err = deflate(&c_stream, Z_NO_FLUSH);
    313           1.1  christos     CHECK_ERR(err, "deflate");
    314           1.1  christos 
    315           1.1  christos     /* Switch back to compressing mode: */
    316           1.1  christos     deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
    317           1.1  christos     c_stream.next_in = uncompr;
    318           1.1  christos     c_stream.avail_in = (uInt)uncomprLen;
    319           1.1  christos     err = deflate(&c_stream, Z_NO_FLUSH);
    320           1.1  christos     CHECK_ERR(err, "deflate");
    321           1.1  christos 
    322           1.1  christos     err = deflate(&c_stream, Z_FINISH);
    323           1.1  christos     if (err != Z_STREAM_END) {
    324           1.1  christos         fprintf(stderr, "deflate should report Z_STREAM_END\n");
    325           1.1  christos         exit(1);
    326           1.1  christos     }
    327           1.1  christos     err = deflateEnd(&c_stream);
    328           1.1  christos     CHECK_ERR(err, "deflateEnd");
    329           1.1  christos }
    330           1.1  christos 
    331           1.1  christos /* ===========================================================================
    332           1.1  christos  * Test inflate() with large buffers
    333           1.1  christos  */
    334           1.1  christos void test_large_inflate(compr, comprLen, uncompr, uncomprLen)
    335           1.1  christos     Byte *compr, *uncompr;
    336           1.1  christos     uLong comprLen, uncomprLen;
    337           1.1  christos {
    338           1.1  christos     int err;
    339           1.1  christos     z_stream d_stream; /* decompression stream */
    340           1.1  christos 
    341           1.1  christos     strcpy((char*)uncompr, "garbage");
    342           1.1  christos 
    343           1.1  christos     d_stream.zalloc = zalloc;
    344           1.1  christos     d_stream.zfree = zfree;
    345           1.1  christos     d_stream.opaque = (voidpf)0;
    346           1.1  christos 
    347           1.1  christos     d_stream.next_in  = compr;
    348           1.1  christos     d_stream.avail_in = (uInt)comprLen;
    349           1.1  christos 
    350           1.1  christos     err = inflateInit(&d_stream);
    351           1.1  christos     CHECK_ERR(err, "inflateInit");
    352           1.1  christos 
    353           1.1  christos     for (;;) {
    354           1.1  christos         d_stream.next_out = uncompr;            /* discard the output */
    355           1.1  christos         d_stream.avail_out = (uInt)uncomprLen;
    356           1.1  christos         err = inflate(&d_stream, Z_NO_FLUSH);
    357           1.1  christos         if (err == Z_STREAM_END) break;
    358           1.1  christos         CHECK_ERR(err, "large inflate");
    359           1.1  christos     }
    360           1.1  christos 
    361           1.1  christos     err = inflateEnd(&d_stream);
    362           1.1  christos     CHECK_ERR(err, "inflateEnd");
    363           1.1  christos 
    364           1.1  christos     if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
    365           1.1  christos         fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
    366           1.1  christos         exit(1);
    367           1.1  christos     } else {
    368           1.1  christos         printf("large_inflate(): OK\n");
    369           1.1  christos     }
    370           1.1  christos }
    371           1.1  christos 
    372           1.1  christos /* ===========================================================================
    373           1.1  christos  * Test deflate() with full flush
    374           1.1  christos  */
    375           1.1  christos void test_flush(compr, comprLen)
    376           1.1  christos     Byte *compr;
    377           1.1  christos     uLong *comprLen;
    378           1.1  christos {
    379           1.1  christos     z_stream c_stream; /* compression stream */
    380           1.1  christos     int err;
    381           1.1  christos     uInt len = (uInt)strlen(hello)+1;
    382           1.1  christos 
    383           1.1  christos     c_stream.zalloc = zalloc;
    384           1.1  christos     c_stream.zfree = zfree;
    385           1.1  christos     c_stream.opaque = (voidpf)0;
    386           1.1  christos 
    387           1.1  christos     err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
    388           1.1  christos     CHECK_ERR(err, "deflateInit");
    389           1.1  christos 
    390           1.1  christos     c_stream.next_in  = (z_const unsigned char *)hello;
    391           1.1  christos     c_stream.next_out = compr;
    392           1.1  christos     c_stream.avail_in = 3;
    393           1.1  christos     c_stream.avail_out = (uInt)*comprLen;
    394           1.1  christos     err = deflate(&c_stream, Z_FULL_FLUSH);
    395           1.1  christos     CHECK_ERR(err, "deflate");
    396           1.1  christos 
    397           1.1  christos     compr[3]++; /* force an error in first compressed block */
    398           1.1  christos     c_stream.avail_in = len - 3;
    399           1.1  christos 
    400           1.1  christos     err = deflate(&c_stream, Z_FINISH);
    401           1.1  christos     if (err != Z_STREAM_END) {
    402           1.1  christos         CHECK_ERR(err, "deflate");
    403           1.1  christos     }
    404           1.1  christos     err = deflateEnd(&c_stream);
    405           1.1  christos     CHECK_ERR(err, "deflateEnd");
    406           1.1  christos 
    407           1.1  christos     *comprLen = c_stream.total_out;
    408           1.1  christos }
    409           1.1  christos 
    410           1.1  christos /* ===========================================================================
    411           1.1  christos  * Test inflateSync()
    412           1.1  christos  */
    413           1.1  christos void test_sync(compr, comprLen, uncompr, uncomprLen)
    414           1.1  christos     Byte *compr, *uncompr;
    415           1.1  christos     uLong comprLen, uncomprLen;
    416           1.1  christos {
    417           1.1  christos     int err;
    418           1.1  christos     z_stream d_stream; /* decompression stream */
    419           1.1  christos 
    420           1.1  christos     strcpy((char*)uncompr, "garbage");
    421           1.1  christos 
    422           1.1  christos     d_stream.zalloc = zalloc;
    423           1.1  christos     d_stream.zfree = zfree;
    424           1.1  christos     d_stream.opaque = (voidpf)0;
    425           1.1  christos 
    426           1.1  christos     d_stream.next_in  = compr;
    427           1.1  christos     d_stream.avail_in = 2; /* just read the zlib header */
    428           1.1  christos 
    429           1.1  christos     err = inflateInit(&d_stream);
    430           1.1  christos     CHECK_ERR(err, "inflateInit");
    431           1.1  christos 
    432           1.1  christos     d_stream.next_out = uncompr;
    433           1.1  christos     d_stream.avail_out = (uInt)uncomprLen;
    434           1.1  christos 
    435           1.1  christos     err = inflate(&d_stream, Z_NO_FLUSH);
    436           1.1  christos     CHECK_ERR(err, "inflate");
    437           1.1  christos 
    438           1.1  christos     d_stream.avail_in = (uInt)comprLen-2;   /* read all compressed data */
    439           1.1  christos     err = inflateSync(&d_stream);           /* but skip the damaged part */
    440           1.1  christos     CHECK_ERR(err, "inflateSync");
    441           1.1  christos 
    442           1.1  christos     err = inflate(&d_stream, Z_FINISH);
    443           1.1  christos     if (err != Z_DATA_ERROR) {
    444           1.1  christos         fprintf(stderr, "inflate should report DATA_ERROR\n");
    445           1.1  christos         /* Because of incorrect adler32 */
    446           1.1  christos         exit(1);
    447           1.1  christos     }
    448           1.1  christos     err = inflateEnd(&d_stream);
    449           1.1  christos     CHECK_ERR(err, "inflateEnd");
    450           1.1  christos 
    451           1.1  christos     printf("after inflateSync(): hel%s\n", (char *)uncompr);
    452           1.1  christos }
    453           1.1  christos 
    454           1.1  christos /* ===========================================================================
    455           1.1  christos  * Test deflate() with preset dictionary
    456           1.1  christos  */
    457           1.1  christos void test_dict_deflate(compr, comprLen)
    458           1.1  christos     Byte *compr;
    459           1.1  christos     uLong comprLen;
    460           1.1  christos {
    461           1.1  christos     z_stream c_stream; /* compression stream */
    462           1.1  christos     int err;
    463           1.1  christos 
    464           1.1  christos     c_stream.zalloc = zalloc;
    465           1.1  christos     c_stream.zfree = zfree;
    466           1.1  christos     c_stream.opaque = (voidpf)0;
    467           1.1  christos 
    468           1.1  christos     err = deflateInit(&c_stream, Z_BEST_COMPRESSION);
    469           1.1  christos     CHECK_ERR(err, "deflateInit");
    470           1.1  christos 
    471           1.1  christos     err = deflateSetDictionary(&c_stream,
    472           1.1  christos                 (const Bytef*)dictionary, (int)sizeof(dictionary));
    473           1.1  christos     CHECK_ERR(err, "deflateSetDictionary");
    474           1.1  christos 
    475           1.1  christos     dictId = c_stream.adler;
    476           1.1  christos     c_stream.next_out = compr;
    477           1.1  christos     c_stream.avail_out = (uInt)comprLen;
    478           1.1  christos 
    479           1.1  christos     c_stream.next_in = (z_const unsigned char *)hello;
    480           1.1  christos     c_stream.avail_in = (uInt)strlen(hello)+1;
    481           1.1  christos 
    482           1.1  christos     err = deflate(&c_stream, Z_FINISH);
    483           1.1  christos     if (err != Z_STREAM_END) {
    484           1.1  christos         fprintf(stderr, "deflate should report Z_STREAM_END\n");
    485           1.1  christos         exit(1);
    486           1.1  christos     }
    487           1.1  christos     err = deflateEnd(&c_stream);
    488           1.1  christos     CHECK_ERR(err, "deflateEnd");
    489           1.1  christos }
    490           1.1  christos 
    491           1.1  christos /* ===========================================================================
    492           1.1  christos  * Test inflate() with a preset dictionary
    493           1.1  christos  */
    494           1.1  christos void test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
    495           1.1  christos     Byte *compr, *uncompr;
    496           1.1  christos     uLong comprLen, uncomprLen;
    497           1.1  christos {
    498           1.1  christos     int err;
    499           1.1  christos     z_stream d_stream; /* decompression stream */
    500           1.1  christos 
    501           1.1  christos     strcpy((char*)uncompr, "garbage");
    502           1.1  christos 
    503           1.1  christos     d_stream.zalloc = zalloc;
    504           1.1  christos     d_stream.zfree = zfree;
    505           1.1  christos     d_stream.opaque = (voidpf)0;
    506           1.1  christos 
    507           1.1  christos     d_stream.next_in  = compr;
    508           1.1  christos     d_stream.avail_in = (uInt)comprLen;
    509           1.1  christos 
    510           1.1  christos     err = inflateInit(&d_stream);
    511           1.1  christos     CHECK_ERR(err, "inflateInit");
    512           1.1  christos 
    513           1.1  christos     d_stream.next_out = uncompr;
    514           1.1  christos     d_stream.avail_out = (uInt)uncomprLen;
    515           1.1  christos 
    516           1.1  christos     for (;;) {
    517           1.1  christos         err = inflate(&d_stream, Z_NO_FLUSH);
    518           1.1  christos         if (err == Z_STREAM_END) break;
    519           1.1  christos         if (err == Z_NEED_DICT) {
    520           1.1  christos             if (d_stream.adler != dictId) {
    521           1.1  christos                 fprintf(stderr, "unexpected dictionary");
    522           1.1  christos                 exit(1);
    523           1.1  christos             }
    524           1.1  christos             err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,
    525           1.1  christos                                        (int)sizeof(dictionary));
    526           1.1  christos         }
    527           1.1  christos         CHECK_ERR(err, "inflate with dict");
    528           1.1  christos     }
    529           1.1  christos 
    530           1.1  christos     err = inflateEnd(&d_stream);
    531           1.1  christos     CHECK_ERR(err, "inflateEnd");
    532           1.1  christos 
    533           1.1  christos     if (strcmp((char*)uncompr, hello)) {
    534           1.1  christos         fprintf(stderr, "bad inflate with dict\n");
    535           1.1  christos         exit(1);
    536           1.1  christos     } else {
    537           1.1  christos         printf("inflate with dictionary: %s\n", (char *)uncompr);
    538           1.1  christos     }
    539           1.1  christos }
    540           1.1  christos 
    541           1.1  christos /* ===========================================================================
    542           1.1  christos  * Usage:  example [output.gz  [input.gz]]
    543           1.1  christos  */
    544           1.1  christos 
    545           1.1  christos int main(argc, argv)
    546           1.1  christos     int argc;
    547           1.1  christos     char *argv[];
    548           1.1  christos {
    549           1.1  christos     Byte *compr, *uncompr;
    550           1.1  christos     uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
    551           1.1  christos     uLong uncomprLen = comprLen;
    552           1.1  christos     static const char* myVersion = ZLIB_VERSION;
    553           1.1  christos 
    554           1.1  christos     if (zlibVersion()[0] != myVersion[0]) {
    555           1.1  christos         fprintf(stderr, "incompatible zlib version\n");
    556           1.1  christos         exit(1);
    557           1.1  christos 
    558           1.1  christos     } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
    559           1.1  christos         fprintf(stderr, "warning: different zlib version\n");
    560           1.1  christos     }
    561           1.1  christos 
    562           1.1  christos     printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n",
    563           1.1  christos             ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags());
    564           1.1  christos 
    565           1.1  christos     compr    = (Byte*)calloc((uInt)comprLen, 1);
    566           1.1  christos     uncompr  = (Byte*)calloc((uInt)uncomprLen, 1);
    567           1.1  christos     /* compr and uncompr are cleared to avoid reading uninitialized
    568           1.1  christos      * data and to ensure that uncompr compresses well.
    569           1.1  christos      */
    570           1.1  christos     if (compr == Z_NULL || uncompr == Z_NULL) {
    571           1.1  christos         printf("out of memory\n");
    572           1.1  christos         exit(1);
    573           1.1  christos     }
    574           1.1  christos 
    575           1.1  christos #ifdef Z_SOLO
    576           1.1  christos     (void)argc;
    577           1.1  christos     (void)argv;
    578           1.1  christos #else
    579           1.1  christos     test_compress(compr, comprLen, uncompr, uncomprLen);
    580           1.1  christos 
    581           1.1  christos     test_gzio((argc > 1 ? argv[1] : TESTFILE),
    582           1.1  christos               uncompr, uncomprLen);
    583           1.1  christos #endif
    584           1.1  christos 
    585           1.1  christos     test_deflate(compr, comprLen);
    586           1.1  christos     test_inflate(compr, comprLen, uncompr, uncomprLen);
    587           1.1  christos 
    588           1.1  christos     test_large_deflate(compr, comprLen, uncompr, uncomprLen);
    589           1.1  christos     test_large_inflate(compr, comprLen, uncompr, uncomprLen);
    590           1.1  christos 
    591           1.1  christos     test_flush(compr, &comprLen);
    592           1.1  christos     test_sync(compr, comprLen, uncompr, uncomprLen);
    593           1.1  christos     comprLen = uncomprLen;
    594           1.1  christos 
    595           1.1  christos     test_dict_deflate(compr, comprLen);
    596           1.1  christos     test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
    597           1.1  christos 
    598           1.1  christos     free(compr);
    599           1.1  christos     free(uncompr);
    600           1.1  christos 
    601           1.1  christos     return 0;
    602           1.1  christos }
    603