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