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