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