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