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