1275793eaSopenharmony_ci/* example.c -- usage example of the zlib compression library 2275793eaSopenharmony_ci * Copyright (C) 1995-2006, 2011, 2016 Jean-loup Gailly 3275793eaSopenharmony_ci * For conditions of distribution and use, see copyright notice in zlib.h 4275793eaSopenharmony_ci */ 5275793eaSopenharmony_ci 6275793eaSopenharmony_ci/* @(#) $Id$ */ 7275793eaSopenharmony_ci 8275793eaSopenharmony_ci#include "zlib.h" 9275793eaSopenharmony_ci#include <stdio.h> 10275793eaSopenharmony_ci 11275793eaSopenharmony_ci#ifdef STDC 12275793eaSopenharmony_ci# include <string.h> 13275793eaSopenharmony_ci# include <stdlib.h> 14275793eaSopenharmony_ci#endif 15275793eaSopenharmony_ci 16275793eaSopenharmony_ci#if defined(VMS) || defined(RISCOS) 17275793eaSopenharmony_ci# define TESTFILE "foo-gz" 18275793eaSopenharmony_ci#else 19275793eaSopenharmony_ci# define TESTFILE "foo.gz" 20275793eaSopenharmony_ci#endif 21275793eaSopenharmony_ci 22275793eaSopenharmony_ci#define CHECK_ERR(err, msg) { \ 23275793eaSopenharmony_ci if (err != Z_OK) { \ 24275793eaSopenharmony_ci fprintf(stderr, "%s error: %d\n", msg, err); \ 25275793eaSopenharmony_ci exit(1); \ 26275793eaSopenharmony_ci } \ 27275793eaSopenharmony_ci} 28275793eaSopenharmony_ci 29275793eaSopenharmony_cistatic z_const char hello[] = "hello, hello!"; 30275793eaSopenharmony_ci/* "hello world" would be more standard, but the repeated "hello" 31275793eaSopenharmony_ci * stresses the compression code better, sorry... 32275793eaSopenharmony_ci */ 33275793eaSopenharmony_ci 34275793eaSopenharmony_cistatic const char dictionary[] = "hello"; 35275793eaSopenharmony_cistatic uLong dictId; /* Adler32 value of the dictionary */ 36275793eaSopenharmony_ci 37275793eaSopenharmony_ci#ifdef Z_SOLO 38275793eaSopenharmony_ci 39275793eaSopenharmony_cistatic void *myalloc(void *q, unsigned n, unsigned m) 40275793eaSopenharmony_ci{ 41275793eaSopenharmony_ci (void)q; 42275793eaSopenharmony_ci return calloc(n, m); 43275793eaSopenharmony_ci} 44275793eaSopenharmony_ci 45275793eaSopenharmony_cistatic void myfree(void *q, void *p) 46275793eaSopenharmony_ci{ 47275793eaSopenharmony_ci (void)q; 48275793eaSopenharmony_ci free(p); 49275793eaSopenharmony_ci} 50275793eaSopenharmony_ci 51275793eaSopenharmony_cistatic alloc_func zalloc = myalloc; 52275793eaSopenharmony_cistatic free_func zfree = myfree; 53275793eaSopenharmony_ci 54275793eaSopenharmony_ci#else /* !Z_SOLO */ 55275793eaSopenharmony_ci 56275793eaSopenharmony_cistatic alloc_func zalloc = (alloc_func)0; 57275793eaSopenharmony_cistatic free_func zfree = (free_func)0; 58275793eaSopenharmony_ci 59275793eaSopenharmony_ci/* =========================================================================== 60275793eaSopenharmony_ci * Test compress() and uncompress() 61275793eaSopenharmony_ci */ 62275793eaSopenharmony_cistatic void test_compress(Byte *compr, uLong comprLen, Byte *uncompr, 63275793eaSopenharmony_ci uLong uncomprLen) 64275793eaSopenharmony_ci{ 65275793eaSopenharmony_ci int err; 66275793eaSopenharmony_ci uLong len = (uLong)strlen(hello)+1; 67275793eaSopenharmony_ci 68275793eaSopenharmony_ci err = compress(compr, &comprLen, (const Bytef*)hello, len); 69275793eaSopenharmony_ci CHECK_ERR(err, "compress"); 70275793eaSopenharmony_ci 71275793eaSopenharmony_ci strcpy((char*)uncompr, "garbage"); 72275793eaSopenharmony_ci 73275793eaSopenharmony_ci err = uncompress(uncompr, &uncomprLen, compr, comprLen); 74275793eaSopenharmony_ci CHECK_ERR(err, "uncompress"); 75275793eaSopenharmony_ci 76275793eaSopenharmony_ci if (strcmp((char*)uncompr, hello)) { 77275793eaSopenharmony_ci fprintf(stderr, "bad uncompress\n"); 78275793eaSopenharmony_ci exit(1); 79275793eaSopenharmony_ci } else { 80275793eaSopenharmony_ci printf("uncompress(): %s\n", (char *)uncompr); 81275793eaSopenharmony_ci } 82275793eaSopenharmony_ci} 83275793eaSopenharmony_ci 84275793eaSopenharmony_ci/* =========================================================================== 85275793eaSopenharmony_ci * Test read/write of .gz files 86275793eaSopenharmony_ci */ 87275793eaSopenharmony_cistatic void test_gzio(const char *fname, Byte *uncompr, uLong uncomprLen) 88275793eaSopenharmony_ci{ 89275793eaSopenharmony_ci#ifdef NO_GZCOMPRESS 90275793eaSopenharmony_ci fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n"); 91275793eaSopenharmony_ci#else 92275793eaSopenharmony_ci int err; 93275793eaSopenharmony_ci int len = (int)strlen(hello)+1; 94275793eaSopenharmony_ci gzFile file; 95275793eaSopenharmony_ci z_off_t pos; 96275793eaSopenharmony_ci 97275793eaSopenharmony_ci file = gzopen(fname, "wb"); 98275793eaSopenharmony_ci if (file == NULL) { 99275793eaSopenharmony_ci fprintf(stderr, "gzopen error\n"); 100275793eaSopenharmony_ci exit(1); 101275793eaSopenharmony_ci } 102275793eaSopenharmony_ci gzputc(file, 'h'); 103275793eaSopenharmony_ci if (gzputs(file, "ello") != 4) { 104275793eaSopenharmony_ci fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err)); 105275793eaSopenharmony_ci exit(1); 106275793eaSopenharmony_ci } 107275793eaSopenharmony_ci if (gzprintf(file, ", %s!", "hello") != 8) { 108275793eaSopenharmony_ci fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err)); 109275793eaSopenharmony_ci exit(1); 110275793eaSopenharmony_ci } 111275793eaSopenharmony_ci gzseek(file, 1L, SEEK_CUR); /* add one zero byte */ 112275793eaSopenharmony_ci gzclose(file); 113275793eaSopenharmony_ci 114275793eaSopenharmony_ci file = gzopen(fname, "rb"); 115275793eaSopenharmony_ci if (file == NULL) { 116275793eaSopenharmony_ci fprintf(stderr, "gzopen error\n"); 117275793eaSopenharmony_ci exit(1); 118275793eaSopenharmony_ci } 119275793eaSopenharmony_ci strcpy((char*)uncompr, "garbage"); 120275793eaSopenharmony_ci 121275793eaSopenharmony_ci if (gzread(file, uncompr, (unsigned)uncomprLen) != len) { 122275793eaSopenharmony_ci fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); 123275793eaSopenharmony_ci exit(1); 124275793eaSopenharmony_ci } 125275793eaSopenharmony_ci if (strcmp((char*)uncompr, hello)) { 126275793eaSopenharmony_ci fprintf(stderr, "bad gzread: %s\n", (char*)uncompr); 127275793eaSopenharmony_ci exit(1); 128275793eaSopenharmony_ci } else { 129275793eaSopenharmony_ci printf("gzread(): %s\n", (char*)uncompr); 130275793eaSopenharmony_ci } 131275793eaSopenharmony_ci 132275793eaSopenharmony_ci pos = gzseek(file, -8L, SEEK_CUR); 133275793eaSopenharmony_ci if (pos != 6 || gztell(file) != pos) { 134275793eaSopenharmony_ci fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", 135275793eaSopenharmony_ci (long)pos, (long)gztell(file)); 136275793eaSopenharmony_ci exit(1); 137275793eaSopenharmony_ci } 138275793eaSopenharmony_ci 139275793eaSopenharmony_ci if (gzgetc(file) != ' ') { 140275793eaSopenharmony_ci fprintf(stderr, "gzgetc error\n"); 141275793eaSopenharmony_ci exit(1); 142275793eaSopenharmony_ci } 143275793eaSopenharmony_ci 144275793eaSopenharmony_ci if (gzungetc(' ', file) != ' ') { 145275793eaSopenharmony_ci fprintf(stderr, "gzungetc error\n"); 146275793eaSopenharmony_ci exit(1); 147275793eaSopenharmony_ci } 148275793eaSopenharmony_ci 149275793eaSopenharmony_ci gzgets(file, (char*)uncompr, (int)uncomprLen); 150275793eaSopenharmony_ci if (strlen((char*)uncompr) != 7) { /* " hello!" */ 151275793eaSopenharmony_ci fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err)); 152275793eaSopenharmony_ci exit(1); 153275793eaSopenharmony_ci } 154275793eaSopenharmony_ci if (strcmp((char*)uncompr, hello + 6)) { 155275793eaSopenharmony_ci fprintf(stderr, "bad gzgets after gzseek\n"); 156275793eaSopenharmony_ci exit(1); 157275793eaSopenharmony_ci } else { 158275793eaSopenharmony_ci printf("gzgets() after gzseek: %s\n", (char*)uncompr); 159275793eaSopenharmony_ci } 160275793eaSopenharmony_ci 161275793eaSopenharmony_ci gzclose(file); 162275793eaSopenharmony_ci#endif 163275793eaSopenharmony_ci} 164275793eaSopenharmony_ci 165275793eaSopenharmony_ci#endif /* Z_SOLO */ 166275793eaSopenharmony_ci 167275793eaSopenharmony_ci/* =========================================================================== 168275793eaSopenharmony_ci * Test deflate() with small buffers 169275793eaSopenharmony_ci */ 170275793eaSopenharmony_cistatic void test_deflate(Byte *compr, uLong comprLen) 171275793eaSopenharmony_ci{ 172275793eaSopenharmony_ci z_stream c_stream; /* compression stream */ 173275793eaSopenharmony_ci int err; 174275793eaSopenharmony_ci uLong len = (uLong)strlen(hello)+1; 175275793eaSopenharmony_ci 176275793eaSopenharmony_ci c_stream.zalloc = zalloc; 177275793eaSopenharmony_ci c_stream.zfree = zfree; 178275793eaSopenharmony_ci c_stream.opaque = (voidpf)0; 179275793eaSopenharmony_ci 180275793eaSopenharmony_ci err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); 181275793eaSopenharmony_ci CHECK_ERR(err, "deflateInit"); 182275793eaSopenharmony_ci 183275793eaSopenharmony_ci c_stream.next_in = (z_const unsigned char *)hello; 184275793eaSopenharmony_ci c_stream.next_out = compr; 185275793eaSopenharmony_ci 186275793eaSopenharmony_ci while (c_stream.total_in != len && c_stream.total_out < comprLen) { 187275793eaSopenharmony_ci c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ 188275793eaSopenharmony_ci err = deflate(&c_stream, Z_NO_FLUSH); 189275793eaSopenharmony_ci CHECK_ERR(err, "deflate"); 190275793eaSopenharmony_ci } 191275793eaSopenharmony_ci /* Finish the stream, still forcing small buffers: */ 192275793eaSopenharmony_ci for (;;) { 193275793eaSopenharmony_ci c_stream.avail_out = 1; 194275793eaSopenharmony_ci err = deflate(&c_stream, Z_FINISH); 195275793eaSopenharmony_ci if (err == Z_STREAM_END) 196275793eaSopenharmony_ci { 197275793eaSopenharmony_ci break; 198275793eaSopenharmony_ci } 199275793eaSopenharmony_ci CHECK_ERR(err, "deflate"); 200275793eaSopenharmony_ci } 201275793eaSopenharmony_ci 202275793eaSopenharmony_ci err = deflateEnd(&c_stream); 203275793eaSopenharmony_ci CHECK_ERR(err, "deflateEnd"); 204275793eaSopenharmony_ci} 205275793eaSopenharmony_ci 206275793eaSopenharmony_ci/* =========================================================================== 207275793eaSopenharmony_ci * Test inflate() with small buffers 208275793eaSopenharmony_ci */ 209275793eaSopenharmony_cistatic void test_inflate(Byte *compr, uLong comprLen, Byte *uncompr, 210275793eaSopenharmony_ci uLong uncomprLen) 211275793eaSopenharmony_ci{ 212275793eaSopenharmony_ci int err; 213275793eaSopenharmony_ci z_stream d_stream; /* decompression stream */ 214275793eaSopenharmony_ci 215275793eaSopenharmony_ci strcpy((char*)uncompr, "garbage"); 216275793eaSopenharmony_ci 217275793eaSopenharmony_ci d_stream.zalloc = zalloc; 218275793eaSopenharmony_ci d_stream.zfree = zfree; 219275793eaSopenharmony_ci d_stream.opaque = (voidpf)0; 220275793eaSopenharmony_ci 221275793eaSopenharmony_ci d_stream.next_in = compr; 222275793eaSopenharmony_ci d_stream.avail_in = 0; 223275793eaSopenharmony_ci d_stream.next_out = uncompr; 224275793eaSopenharmony_ci 225275793eaSopenharmony_ci err = inflateInit(&d_stream); 226275793eaSopenharmony_ci CHECK_ERR(err, "inflateInit"); 227275793eaSopenharmony_ci 228275793eaSopenharmony_ci while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { 229275793eaSopenharmony_ci d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ 230275793eaSopenharmony_ci err = inflate(&d_stream, Z_NO_FLUSH); 231275793eaSopenharmony_ci if (err == Z_STREAM_END) 232275793eaSopenharmony_ci { 233275793eaSopenharmony_ci break; 234275793eaSopenharmony_ci } 235275793eaSopenharmony_ci CHECK_ERR(err, "inflate"); 236275793eaSopenharmony_ci } 237275793eaSopenharmony_ci 238275793eaSopenharmony_ci err = inflateEnd(&d_stream); 239275793eaSopenharmony_ci CHECK_ERR(err, "inflateEnd"); 240275793eaSopenharmony_ci 241275793eaSopenharmony_ci if (strcmp((char*)uncompr, hello)) { 242275793eaSopenharmony_ci fprintf(stderr, "bad inflate\n"); 243275793eaSopenharmony_ci exit(1); 244275793eaSopenharmony_ci } else { 245275793eaSopenharmony_ci printf("inflate(): %s\n", (char *)uncompr); 246275793eaSopenharmony_ci } 247275793eaSopenharmony_ci} 248275793eaSopenharmony_ci 249275793eaSopenharmony_ci/* =========================================================================== 250275793eaSopenharmony_ci * Test deflate() with large buffers and dynamic change of compression level 251275793eaSopenharmony_ci */ 252275793eaSopenharmony_cistatic void test_large_deflate(Byte *compr, uLong comprLen, Byte *uncompr, 253275793eaSopenharmony_ci uLong uncomprLen) 254275793eaSopenharmony_ci{ 255275793eaSopenharmony_ci z_stream c_stream; /* compression stream */ 256275793eaSopenharmony_ci int err; 257275793eaSopenharmony_ci 258275793eaSopenharmony_ci c_stream.zalloc = zalloc; 259275793eaSopenharmony_ci c_stream.zfree = zfree; 260275793eaSopenharmony_ci c_stream.opaque = (voidpf)0; 261275793eaSopenharmony_ci 262275793eaSopenharmony_ci err = deflateInit(&c_stream, Z_BEST_SPEED); 263275793eaSopenharmony_ci CHECK_ERR(err, "deflateInit"); 264275793eaSopenharmony_ci 265275793eaSopenharmony_ci c_stream.next_out = compr; 266275793eaSopenharmony_ci c_stream.avail_out = (uInt)comprLen; 267275793eaSopenharmony_ci 268275793eaSopenharmony_ci /* At this point, uncompr is still mostly zeroes, so it should compress 269275793eaSopenharmony_ci * very well: 270275793eaSopenharmony_ci */ 271275793eaSopenharmony_ci c_stream.next_in = uncompr; 272275793eaSopenharmony_ci c_stream.avail_in = (uInt)uncomprLen; 273275793eaSopenharmony_ci err = deflate(&c_stream, Z_NO_FLUSH); 274275793eaSopenharmony_ci CHECK_ERR(err, "deflate"); 275275793eaSopenharmony_ci if (c_stream.avail_in != 0) { 276275793eaSopenharmony_ci fprintf(stderr, "deflate not greedy\n"); 277275793eaSopenharmony_ci exit(1); 278275793eaSopenharmony_ci } 279275793eaSopenharmony_ci 280275793eaSopenharmony_ci /* Feed in already compressed data and switch to no compression: */ 281275793eaSopenharmony_ci deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); 282275793eaSopenharmony_ci c_stream.next_in = compr; 283275793eaSopenharmony_ci c_stream.avail_in = (uInt)uncomprLen/2; 284275793eaSopenharmony_ci err = deflate(&c_stream, Z_NO_FLUSH); 285275793eaSopenharmony_ci CHECK_ERR(err, "deflate"); 286275793eaSopenharmony_ci 287275793eaSopenharmony_ci /* Switch back to compressing mode: */ 288275793eaSopenharmony_ci deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); 289275793eaSopenharmony_ci c_stream.next_in = uncompr; 290275793eaSopenharmony_ci c_stream.avail_in = (uInt)uncomprLen; 291275793eaSopenharmony_ci err = deflate(&c_stream, Z_NO_FLUSH); 292275793eaSopenharmony_ci CHECK_ERR(err, "deflate"); 293275793eaSopenharmony_ci 294275793eaSopenharmony_ci err = deflate(&c_stream, Z_FINISH); 295275793eaSopenharmony_ci if (err != Z_STREAM_END) { 296275793eaSopenharmony_ci fprintf(stderr, "deflate should report Z_STREAM_END\n"); 297275793eaSopenharmony_ci exit(1); 298275793eaSopenharmony_ci } 299275793eaSopenharmony_ci err = deflateEnd(&c_stream); 300275793eaSopenharmony_ci CHECK_ERR(err, "deflateEnd"); 301275793eaSopenharmony_ci} 302275793eaSopenharmony_ci 303275793eaSopenharmony_ci/* =========================================================================== 304275793eaSopenharmony_ci * Test inflate() with large buffers 305275793eaSopenharmony_ci */ 306275793eaSopenharmony_cistatic void test_large_inflate(Byte *compr, uLong comprLen, Byte *uncompr, 307275793eaSopenharmony_ci uLong uncomprLen) 308275793eaSopenharmony_ci{ 309275793eaSopenharmony_ci int err; 310275793eaSopenharmony_ci z_stream d_stream; /* decompression stream */ 311275793eaSopenharmony_ci 312275793eaSopenharmony_ci strcpy((char*)uncompr, "garbage"); 313275793eaSopenharmony_ci 314275793eaSopenharmony_ci d_stream.zalloc = zalloc; 315275793eaSopenharmony_ci d_stream.zfree = zfree; 316275793eaSopenharmony_ci d_stream.opaque = (voidpf)0; 317275793eaSopenharmony_ci 318275793eaSopenharmony_ci d_stream.next_in = compr; 319275793eaSopenharmony_ci d_stream.avail_in = (uInt)comprLen; 320275793eaSopenharmony_ci 321275793eaSopenharmony_ci err = inflateInit(&d_stream); 322275793eaSopenharmony_ci CHECK_ERR(err, "inflateInit"); 323275793eaSopenharmony_ci 324275793eaSopenharmony_ci for (;;) { 325275793eaSopenharmony_ci d_stream.next_out = uncompr; /* discard the output */ 326275793eaSopenharmony_ci d_stream.avail_out = (uInt)uncomprLen; 327275793eaSopenharmony_ci err = inflate(&d_stream, Z_NO_FLUSH); 328275793eaSopenharmony_ci if (err == Z_STREAM_END) 329275793eaSopenharmony_ci { 330275793eaSopenharmony_ci break; 331275793eaSopenharmony_ci } 332275793eaSopenharmony_ci CHECK_ERR(err, "large inflate"); 333275793eaSopenharmony_ci } 334275793eaSopenharmony_ci 335275793eaSopenharmony_ci err = inflateEnd(&d_stream); 336275793eaSopenharmony_ci CHECK_ERR(err, "inflateEnd"); 337275793eaSopenharmony_ci 338275793eaSopenharmony_ci if (d_stream.total_out != 2*uncomprLen + uncomprLen/2) { 339275793eaSopenharmony_ci fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); 340275793eaSopenharmony_ci exit(1); 341275793eaSopenharmony_ci } else { 342275793eaSopenharmony_ci printf("large_inflate(): OK\n"); 343275793eaSopenharmony_ci } 344275793eaSopenharmony_ci} 345275793eaSopenharmony_ci 346275793eaSopenharmony_ci/* =========================================================================== 347275793eaSopenharmony_ci * Test deflate() with full flush 348275793eaSopenharmony_ci */ 349275793eaSopenharmony_cistatic void test_flush(Byte *compr, uLong *comprLen) 350275793eaSopenharmony_ci{ 351275793eaSopenharmony_ci z_stream c_stream; /* compression stream */ 352275793eaSopenharmony_ci int err; 353275793eaSopenharmony_ci uInt len = (uInt)strlen(hello)+1; 354275793eaSopenharmony_ci 355275793eaSopenharmony_ci c_stream.zalloc = zalloc; 356275793eaSopenharmony_ci c_stream.zfree = zfree; 357275793eaSopenharmony_ci c_stream.opaque = (voidpf)0; 358275793eaSopenharmony_ci 359275793eaSopenharmony_ci err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); 360275793eaSopenharmony_ci CHECK_ERR(err, "deflateInit"); 361275793eaSopenharmony_ci 362275793eaSopenharmony_ci c_stream.next_in = (z_const unsigned char *)hello; 363275793eaSopenharmony_ci c_stream.next_out = compr; 364275793eaSopenharmony_ci c_stream.avail_in = 3; 365275793eaSopenharmony_ci c_stream.avail_out = (uInt)*comprLen; 366275793eaSopenharmony_ci err = deflate(&c_stream, Z_FULL_FLUSH); 367275793eaSopenharmony_ci CHECK_ERR(err, "deflate"); 368275793eaSopenharmony_ci 369275793eaSopenharmony_ci compr[3]++; /* force an error in first compressed block */ 370275793eaSopenharmony_ci c_stream.avail_in = len - 3; 371275793eaSopenharmony_ci 372275793eaSopenharmony_ci err = deflate(&c_stream, Z_FINISH); 373275793eaSopenharmony_ci if (err != Z_STREAM_END) { 374275793eaSopenharmony_ci CHECK_ERR(err, "deflate"); 375275793eaSopenharmony_ci } 376275793eaSopenharmony_ci err = deflateEnd(&c_stream); 377275793eaSopenharmony_ci CHECK_ERR(err, "deflateEnd"); 378275793eaSopenharmony_ci 379275793eaSopenharmony_ci *comprLen = c_stream.total_out; 380275793eaSopenharmony_ci} 381275793eaSopenharmony_ci 382275793eaSopenharmony_ci/* =========================================================================== 383275793eaSopenharmony_ci * Test inflateSync() 384275793eaSopenharmony_ci */ 385275793eaSopenharmony_cistatic void test_sync(Byte *compr, uLong comprLen, Byte *uncompr, 386275793eaSopenharmony_ci uLong uncomprLen) 387275793eaSopenharmony_ci{ 388275793eaSopenharmony_ci int err; 389275793eaSopenharmony_ci z_stream d_stream; /* decompression stream */ 390275793eaSopenharmony_ci 391275793eaSopenharmony_ci strcpy((char*)uncompr, "garbage"); 392275793eaSopenharmony_ci 393275793eaSopenharmony_ci d_stream.zalloc = zalloc; 394275793eaSopenharmony_ci d_stream.zfree = zfree; 395275793eaSopenharmony_ci d_stream.opaque = (voidpf)0; 396275793eaSopenharmony_ci 397275793eaSopenharmony_ci d_stream.next_in = compr; 398275793eaSopenharmony_ci d_stream.avail_in = 2; /* just read the zlib header */ 399275793eaSopenharmony_ci 400275793eaSopenharmony_ci err = inflateInit(&d_stream); 401275793eaSopenharmony_ci CHECK_ERR(err, "inflateInit"); 402275793eaSopenharmony_ci 403275793eaSopenharmony_ci d_stream.next_out = uncompr; 404275793eaSopenharmony_ci d_stream.avail_out = (uInt)uncomprLen; 405275793eaSopenharmony_ci 406275793eaSopenharmony_ci err = inflate(&d_stream, Z_NO_FLUSH); 407275793eaSopenharmony_ci CHECK_ERR(err, "inflate"); 408275793eaSopenharmony_ci 409275793eaSopenharmony_ci d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */ 410275793eaSopenharmony_ci err = inflateSync(&d_stream); /* but skip the damaged part */ 411275793eaSopenharmony_ci CHECK_ERR(err, "inflateSync"); 412275793eaSopenharmony_ci 413275793eaSopenharmony_ci err = inflate(&d_stream, Z_FINISH); 414275793eaSopenharmony_ci if (err != Z_STREAM_END) { 415275793eaSopenharmony_ci fprintf(stderr, "inflate should report Z_STREAM_END\n"); 416275793eaSopenharmony_ci exit(1); 417275793eaSopenharmony_ci } 418275793eaSopenharmony_ci err = inflateEnd(&d_stream); 419275793eaSopenharmony_ci CHECK_ERR(err, "inflateEnd"); 420275793eaSopenharmony_ci 421275793eaSopenharmony_ci printf("after inflateSync(): hel%s\n", (char *)uncompr); 422275793eaSopenharmony_ci} 423275793eaSopenharmony_ci 424275793eaSopenharmony_ci/* =========================================================================== 425275793eaSopenharmony_ci * Test deflate() with preset dictionary 426275793eaSopenharmony_ci */ 427275793eaSopenharmony_cistatic void test_dict_deflate(Byte *compr, uLong comprLen) 428275793eaSopenharmony_ci{ 429275793eaSopenharmony_ci z_stream c_stream; /* compression stream */ 430275793eaSopenharmony_ci int err; 431275793eaSopenharmony_ci 432275793eaSopenharmony_ci c_stream.zalloc = zalloc; 433275793eaSopenharmony_ci c_stream.zfree = zfree; 434275793eaSopenharmony_ci c_stream.opaque = (voidpf)0; 435275793eaSopenharmony_ci 436275793eaSopenharmony_ci err = deflateInit(&c_stream, Z_BEST_COMPRESSION); 437275793eaSopenharmony_ci CHECK_ERR(err, "deflateInit"); 438275793eaSopenharmony_ci 439275793eaSopenharmony_ci err = deflateSetDictionary(&c_stream, 440275793eaSopenharmony_ci (const Bytef*)dictionary, (int)sizeof(dictionary)); 441275793eaSopenharmony_ci CHECK_ERR(err, "deflateSetDictionary"); 442275793eaSopenharmony_ci 443275793eaSopenharmony_ci dictId = c_stream.adler; 444275793eaSopenharmony_ci c_stream.next_out = compr; 445275793eaSopenharmony_ci c_stream.avail_out = (uInt)comprLen; 446275793eaSopenharmony_ci 447275793eaSopenharmony_ci c_stream.next_in = (z_const unsigned char *)hello; 448275793eaSopenharmony_ci c_stream.avail_in = (uInt)strlen(hello)+1; 449275793eaSopenharmony_ci 450275793eaSopenharmony_ci err = deflate(&c_stream, Z_FINISH); 451275793eaSopenharmony_ci if (err != Z_STREAM_END) { 452275793eaSopenharmony_ci fprintf(stderr, "deflate should report Z_STREAM_END\n"); 453275793eaSopenharmony_ci exit(1); 454275793eaSopenharmony_ci } 455275793eaSopenharmony_ci err = deflateEnd(&c_stream); 456275793eaSopenharmony_ci CHECK_ERR(err, "deflateEnd"); 457275793eaSopenharmony_ci} 458275793eaSopenharmony_ci 459275793eaSopenharmony_ci/* =========================================================================== 460275793eaSopenharmony_ci * Test inflate() with a preset dictionary 461275793eaSopenharmony_ci */ 462275793eaSopenharmony_cistatic void test_dict_inflate(Byte *compr, uLong comprLen, Byte *uncompr, 463275793eaSopenharmony_ci uLong uncomprLen) 464275793eaSopenharmony_ci{ 465275793eaSopenharmony_ci int err; 466275793eaSopenharmony_ci z_stream d_stream; /* decompression stream */ 467275793eaSopenharmony_ci 468275793eaSopenharmony_ci strcpy((char*)uncompr, "garbage"); 469275793eaSopenharmony_ci 470275793eaSopenharmony_ci d_stream.zalloc = zalloc; 471275793eaSopenharmony_ci d_stream.zfree = zfree; 472275793eaSopenharmony_ci d_stream.opaque = (voidpf)0; 473275793eaSopenharmony_ci 474275793eaSopenharmony_ci d_stream.next_in = compr; 475275793eaSopenharmony_ci d_stream.avail_in = (uInt)comprLen; 476275793eaSopenharmony_ci 477275793eaSopenharmony_ci err = inflateInit(&d_stream); 478275793eaSopenharmony_ci CHECK_ERR(err, "inflateInit"); 479275793eaSopenharmony_ci 480275793eaSopenharmony_ci d_stream.next_out = uncompr; 481275793eaSopenharmony_ci d_stream.avail_out = (uInt)uncomprLen; 482275793eaSopenharmony_ci 483275793eaSopenharmony_ci for (;;) { 484275793eaSopenharmony_ci err = inflate(&d_stream, Z_NO_FLUSH); 485275793eaSopenharmony_ci if (err == Z_STREAM_END) 486275793eaSopenharmony_ci { 487275793eaSopenharmony_ci break; 488275793eaSopenharmony_ci } 489275793eaSopenharmony_ci if (err == Z_NEED_DICT) { 490275793eaSopenharmony_ci if (d_stream.adler != dictId) { 491275793eaSopenharmony_ci fprintf(stderr, "unexpected dictionary"); 492275793eaSopenharmony_ci exit(1); 493275793eaSopenharmony_ci } 494275793eaSopenharmony_ci err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, 495275793eaSopenharmony_ci (int)sizeof(dictionary)); 496275793eaSopenharmony_ci } 497275793eaSopenharmony_ci CHECK_ERR(err, "inflate with dict"); 498275793eaSopenharmony_ci } 499275793eaSopenharmony_ci 500275793eaSopenharmony_ci err = inflateEnd(&d_stream); 501275793eaSopenharmony_ci CHECK_ERR(err, "inflateEnd"); 502275793eaSopenharmony_ci 503275793eaSopenharmony_ci if (strcmp((char*)uncompr, hello)) { 504275793eaSopenharmony_ci fprintf(stderr, "bad inflate with dict\n"); 505275793eaSopenharmony_ci exit(1); 506275793eaSopenharmony_ci } else { 507275793eaSopenharmony_ci printf("inflate with dictionary: %s\n", (char *)uncompr); 508275793eaSopenharmony_ci } 509275793eaSopenharmony_ci} 510275793eaSopenharmony_ci 511275793eaSopenharmony_ci/* =========================================================================== 512275793eaSopenharmony_ci * Usage: example [output.gz [input.gz]] 513275793eaSopenharmony_ci */ 514275793eaSopenharmony_ci#define THREE 3 515275793eaSopenharmony_ciint main(int argc, char *argv[]) 516275793eaSopenharmony_ci{ 517275793eaSopenharmony_ci Byte *compr, *uncompr; 518275793eaSopenharmony_ci uLong uncomprLen = 20000; 519275793eaSopenharmony_ci uLong comprLen = 3 * uncomprLen; 520275793eaSopenharmony_ci static const char* myVersion = ZLIB_VERSION; 521275793eaSopenharmony_ci 522275793eaSopenharmony_ci if (zlibVersion()[0] != myVersion[0]) { 523275793eaSopenharmony_ci fprintf(stderr, "incompatible zlib version\n"); 524275793eaSopenharmony_ci exit(1); 525275793eaSopenharmony_ci 526275793eaSopenharmony_ci } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { 527275793eaSopenharmony_ci fprintf(stderr, "warning: different zlib version linked: %s\n", 528275793eaSopenharmony_ci zlibVersion()); 529275793eaSopenharmony_ci } 530275793eaSopenharmony_ci 531275793eaSopenharmony_ci printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n", 532275793eaSopenharmony_ci ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags()); 533275793eaSopenharmony_ci 534275793eaSopenharmony_ci compr = (Byte*)calloc((uInt)comprLen, 1); 535275793eaSopenharmony_ci uncompr = (Byte*)calloc((uInt)uncomprLen, 1); 536275793eaSopenharmony_ci /* compr and uncompr are cleared to avoid reading uninitialized 537275793eaSopenharmony_ci * data and to ensure that uncompr compresses well. 538275793eaSopenharmony_ci */ 539275793eaSopenharmony_ci if (compr == Z_NULL || uncompr == Z_NULL) { 540275793eaSopenharmony_ci printf("out of memory\n"); 541275793eaSopenharmony_ci exit(1); 542275793eaSopenharmony_ci } 543275793eaSopenharmony_ci 544275793eaSopenharmony_ci#ifdef Z_SOLO 545275793eaSopenharmony_ci (void)argc; 546275793eaSopenharmony_ci (void)argv; 547275793eaSopenharmony_ci#else 548275793eaSopenharmony_ci test_compress(compr, comprLen, uncompr, uncomprLen); 549275793eaSopenharmony_ci 550275793eaSopenharmony_ci test_gzio((argc > 1 ? argv[1] : TESTFILE), 551275793eaSopenharmony_ci uncompr, uncomprLen); 552275793eaSopenharmony_ci#endif 553275793eaSopenharmony_ci 554275793eaSopenharmony_ci test_deflate(compr, comprLen); 555275793eaSopenharmony_ci test_inflate(compr, comprLen, uncompr, uncomprLen); 556275793eaSopenharmony_ci 557275793eaSopenharmony_ci test_large_deflate(compr, comprLen, uncompr, uncomprLen); 558275793eaSopenharmony_ci test_large_inflate(compr, comprLen, uncompr, uncomprLen); 559275793eaSopenharmony_ci 560275793eaSopenharmony_ci test_flush(compr, &comprLen); 561275793eaSopenharmony_ci test_sync(compr, comprLen, uncompr, uncomprLen); 562275793eaSopenharmony_ci comprLen = THREE * uncomprLen; 563275793eaSopenharmony_ci 564275793eaSopenharmony_ci test_dict_deflate(compr, comprLen); 565275793eaSopenharmony_ci test_dict_inflate(compr, comprLen, uncompr, uncomprLen); 566275793eaSopenharmony_ci 567275793eaSopenharmony_ci free(compr); 568275793eaSopenharmony_ci free(uncompr); 569275793eaSopenharmony_ci 570275793eaSopenharmony_ci return 0; 571275793eaSopenharmony_ci} 572