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