19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project(* example.c -- usage example of the zlib compression library
29e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Copyright (C) 1995-2003 Jean-loup Gailly.
39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * For conditions of distribution and use, see copyright notice in zlib.h
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Pascal translation
69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Copyright (C) 1998 by Jacques Nomssi Nzali.
79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * For conditions of distribution and use, see copyright notice in readme.txt
89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Adaptation to the zlibpas interface
109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Copyright (C) 2003 by Cosmin Truta.
119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * For conditions of distribution and use, see copyright notice in readme.txt
129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *)
139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprogram example;
159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$DEFINE TEST_COMPRESS}
179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{DO NOT $DEFINE TEST_GZIO}
189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$DEFINE TEST_DEFLATE}
199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$DEFINE TEST_INFLATE}
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$DEFINE TEST_FLUSH}
219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$DEFINE TEST_SYNC}
229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$DEFINE TEST_DICT}
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectuses SysUtils, zlibpas;
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconst TESTFILE = 'foo.gz';
279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project(* "hello world" would be more standard, but the repeated "hello"
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * stresses the compression code better, sorry...
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *)
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconst hello: PChar = 'hello, hello!';
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconst dictionary: PChar = 'hello';
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar dictId: LongInt; (* Adler32 value of the dictionary *)
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure CHECK_ERR(err: Integer; msg: String);
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if err <> Z_OK then
409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn(msg, ' error: ', err);
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure EXIT_ERR(const msg: String);
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('Error: ', msg);
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Halt(1);
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project(* ===========================================================================
539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test compress and uncompress
549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *)
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$IFDEF TEST_COMPRESS}
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure test_compress(compr: Pointer; comprLen: LongInt;
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                        uncompr: Pointer; uncomprLen: LongInt);
589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar err: Integer;
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    len: LongInt;
609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  len := StrLen(hello)+1;
629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := compress(compr, comprLen, hello, len);
649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'compress');
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  StrCopy(PChar(uncompr), 'garbage');
679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := uncompress(uncompr, uncomprLen, compr, comprLen);
699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'uncompress');
709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if StrComp(PChar(uncompr), hello) <> 0 then
729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    EXIT_ERR('bad uncompress')
739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('uncompress(): ', PChar(uncompr));
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$ENDIF}
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project(* ===========================================================================
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test read/write of .gz files
809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *)
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$IFDEF TEST_GZIO}
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure test_gzio(const fname: PChar; (* compressed file name *)
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                    uncompr: Pointer;
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                    uncomprLen: LongInt);
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar err: Integer;
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    len: Integer;
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    zfile: gzFile;
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    pos: LongInt;
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  len := StrLen(hello)+1;
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  zfile := gzopen(fname, 'wb');
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if zfile = NIL then
949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('gzopen error');
969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  gzputc(zfile, 'h');
999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if gzputs(zfile, 'ello') <> 4 then
1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('gzputs err: ', gzerror(zfile, err));
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$IFDEF GZ_FORMAT_STRING}
1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if gzprintf(zfile, ', %s!', 'hello') <> 8 then
1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('gzprintf err: ', gzerror(zfile, err));
1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$ELSE}
1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if gzputs(zfile, ', hello!') <> 8 then
1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('gzputs err: ', gzerror(zfile, err));
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$ENDIF}
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  gzseek(zfile, 1, SEEK_CUR); (* add one zero byte *)
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  gzclose(zfile);
1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  zfile := gzopen(fname, 'rb');
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if zfile = NIL then
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('gzopen error');
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  StrCopy(PChar(uncompr), 'garbage');
1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if gzread(zfile, uncompr, uncomprLen) <> len then
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('gzread err: ', gzerror(zfile, err));
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if StrComp(PChar(uncompr), hello) <> 0 then
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('bad gzread: ', PChar(uncompr));
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end
1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('gzread(): ', PChar(uncompr));
1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  pos := gzseek(zfile, -8, SEEK_CUR);
1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if (pos <> 6) or (gztell(zfile) <> pos) then
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('gzseek error, pos=', pos, ', gztell=', gztell(zfile));
1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if gzgetc(zfile) <> ' ' then
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('gzgetc error');
1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if gzungetc(' ', zfile) <> ' ' then
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('gzungetc error');
1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  gzgets(zfile, PChar(uncompr), uncomprLen);
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  uncomprLen := StrLen(PChar(uncompr));
1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if uncomprLen <> 7 then (* " hello!" *)
1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('gzgets err after gzseek: ', gzerror(zfile, err));
1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if StrComp(PChar(uncompr), hello + 6) <> 0 then
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('bad gzgets after gzseek');
1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end
1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('gzgets() after gzseek: ', PChar(uncompr));
1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  gzclose(zfile);
1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$ENDIF}
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project(* ===========================================================================
1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test deflate with small buffers
1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *)
1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$IFDEF TEST_DEFLATE}
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure test_deflate(compr: Pointer; comprLen: LongInt);
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar c_stream: z_stream; (* compression stream *)
1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err: Integer;
1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    len: LongInt;
1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  len := StrLen(hello)+1;
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.zalloc := NIL;
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.zfree := NIL;
1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.opaque := NIL;
1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION);
1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflateInit');
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.next_in := hello;
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.next_out := compr;
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  while (c_stream.total_in <> len) and
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        (c_stream.total_out < comprLen) do
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.avail_out := 1; { force small buffers }
2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.avail_in := 1;
2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err := deflate(c_stream, Z_NO_FLUSH);
2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, 'deflate');
2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  (* Finish the stream, still forcing small buffers: *)
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  while TRUE do
2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    c_stream.avail_out := 1;
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err := deflate(c_stream, Z_FINISH);
2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if err = Z_STREAM_END then
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      break;
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, 'deflate');
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflateEnd(c_stream);
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflateEnd');
2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$ENDIF}
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project(* ===========================================================================
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test inflate with small buffers
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *)
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$IFDEF TEST_INFLATE}
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure test_inflate(compr: Pointer; comprLen : LongInt;
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                       uncompr: Pointer; uncomprLen : LongInt);
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar err: Integer;
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream: z_stream; (* decompression stream *)
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  StrCopy(PChar(uncompr), 'garbage');
2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.zalloc := NIL;
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.zfree := NIL;
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.opaque := NIL;
2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.next_in := compr;
2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.avail_in := 0;
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.next_out := uncompr;
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := inflateInit(d_stream);
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'inflateInit');
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  while (d_stream.total_out < uncomprLen) and
2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        (d_stream.total_in < comprLen) do
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.avail_out := 1; (* force small buffers *)
2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.avail_in := 1;
2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err := inflate(d_stream, Z_NO_FLUSH);
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if err = Z_STREAM_END then
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      break;
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, 'inflate');
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := inflateEnd(d_stream);
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'inflateEnd');
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if StrComp(PChar(uncompr), hello) <> 0 then
2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    EXIT_ERR('bad inflate')
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('inflate(): ', PChar(uncompr));
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$ENDIF}
2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project(* ===========================================================================
2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test deflate with large buffers and dynamic change of compression level
2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *)
2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$IFDEF TEST_DEFLATE}
2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure test_large_deflate(compr: Pointer; comprLen: LongInt;
2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                             uncompr: Pointer; uncomprLen: LongInt);
2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar c_stream: z_stream; (* compression stream *)
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err: Integer;
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.zalloc := NIL;
2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.zfree := NIL;
2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.opaque := NIL;
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflateInit(c_stream, Z_BEST_SPEED);
2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflateInit');
2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.next_out := compr;
2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.avail_out := Integer(comprLen);
2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  (* At this point, uncompr is still mostly zeroes, so it should compress
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   * very well:
2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   *)
2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.next_in := uncompr;
2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.avail_in := Integer(uncomprLen);
2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflate(c_stream, Z_NO_FLUSH);
2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflate');
2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if c_stream.avail_in <> 0 then
2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    EXIT_ERR('deflate not greedy');
2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  (* Feed in already compressed data and switch to no compression: *)
2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  deflateParams(c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.next_in := compr;
3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.avail_in := Integer(comprLen div 2);
3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflate(c_stream, Z_NO_FLUSH);
3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflate');
3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  (* Switch back to compressing mode: *)
3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  deflateParams(c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.next_in := uncompr;
3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.avail_in := Integer(uncomprLen);
3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflate(c_stream, Z_NO_FLUSH);
3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflate');
3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflate(c_stream, Z_FINISH);
3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if err <> Z_STREAM_END then
3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    EXIT_ERR('deflate should report Z_STREAM_END');
3149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflateEnd(c_stream);
3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflateEnd');
3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$ENDIF}
3199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project(* ===========================================================================
3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test inflate with large buffers
3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *)
3239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$IFDEF TEST_INFLATE}
3249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure test_large_inflate(compr: Pointer; comprLen: LongInt;
3259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                             uncompr: Pointer; uncomprLen: LongInt);
3269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar err: Integer;
3279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream: z_stream; (* decompression stream *)
3289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
3299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  StrCopy(PChar(uncompr), 'garbage');
3309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.zalloc := NIL;
3329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.zfree := NIL;
3339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.opaque := NIL;
3349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.next_in := compr;
3369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.avail_in := Integer(comprLen);
3379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := inflateInit(d_stream);
3399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'inflateInit');
3409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  while TRUE do
3429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
3439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.next_out := uncompr;            (* discard the output *)
3449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream.avail_out := Integer(uncomprLen);
3459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err := inflate(d_stream, Z_NO_FLUSH);
3469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if err = Z_STREAM_END then
3479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      break;
3489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, 'large inflate');
3499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
3509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := inflateEnd(d_stream);
3529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'inflateEnd');
3539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if d_stream.total_out <> 2 * uncomprLen + comprLen div 2 then
3559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
3569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('bad large inflate: ', d_stream.total_out);
3579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Halt(1);
3589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end
3599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
3609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('large_inflate(): OK');
3619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
3629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$ENDIF}
3639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project(* ===========================================================================
3659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test deflate with full flush
3669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *)
3679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$IFDEF TEST_FLUSH}
3689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure test_flush(compr: Pointer; var comprLen : LongInt);
3699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar c_stream: z_stream; (* compression stream *)
3709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err: Integer;
3719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    len: Integer;
3729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
3739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  len := StrLen(hello)+1;
3749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.zalloc := NIL;
3769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.zfree := NIL;
3779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.opaque := NIL;
3789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION);
3809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflateInit');
3819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.next_in := hello;
3839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.next_out := compr;
3849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.avail_in := 3;
3859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.avail_out := Integer(comprLen);
3869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflate(c_stream, Z_FULL_FLUSH);
3879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflate');
3889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Inc(PByteArray(compr)^[3]); (* force an error in first compressed block *)
3909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.avail_in := len - 3;
3919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflate(c_stream, Z_FINISH);
3939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if err <> Z_STREAM_END then
3949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, 'deflate');
3959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflateEnd(c_stream);
3979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflateEnd');
3989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  comprLen := c_stream.total_out;
4009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
4019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$ENDIF}
4029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project(* ===========================================================================
4049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test inflateSync()
4059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *)
4069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$IFDEF TEST_SYNC}
4079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure test_sync(compr: Pointer; comprLen: LongInt;
4089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                    uncompr: Pointer; uncomprLen : LongInt);
4099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar err: Integer;
4109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream: z_stream; (* decompression stream *)
4119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
4129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  StrCopy(PChar(uncompr), 'garbage');
4139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.zalloc := NIL;
4159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.zfree := NIL;
4169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.opaque := NIL;
4179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.next_in := compr;
4199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.avail_in := 2; (* just read the zlib header *)
4209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := inflateInit(d_stream);
4229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'inflateInit');
4239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.next_out := uncompr;
4259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.avail_out := Integer(uncomprLen);
4269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  inflate(d_stream, Z_NO_FLUSH);
4289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'inflate');
4299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.avail_in := Integer(comprLen-2);   (* read all compressed data *)
4319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := inflateSync(d_stream);               (* but skip the damaged part *)
4329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'inflateSync');
4339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := inflate(d_stream, Z_FINISH);
4359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if err <> Z_DATA_ERROR then
4369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    EXIT_ERR('inflate should report DATA_ERROR');
4379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    (* Because of incorrect adler32 *)
4389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := inflateEnd(d_stream);
4409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'inflateEnd');
4419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('after inflateSync(): hel', PChar(uncompr));
4439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
4449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$ENDIF}
4459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project(* ===========================================================================
4479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test deflate with preset dictionary
4489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *)
4499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$IFDEF TEST_DICT}
4509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure test_dict_deflate(compr: Pointer; comprLen: LongInt);
4519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar c_stream: z_stream; (* compression stream *)
4529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err: Integer;
4539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
4549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.zalloc := NIL;
4559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.zfree := NIL;
4569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.opaque := NIL;
4579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflateInit(c_stream, Z_BEST_COMPRESSION);
4599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflateInit');
4609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflateSetDictionary(c_stream, dictionary, StrLen(dictionary));
4629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflateSetDictionary');
4639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  dictId := c_stream.adler;
4659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.next_out := compr;
4669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.avail_out := Integer(comprLen);
4679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.next_in := hello;
4699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  c_stream.avail_in := StrLen(hello)+1;
4709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflate(c_stream, Z_FINISH);
4729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if err <> Z_STREAM_END then
4739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    EXIT_ERR('deflate should report Z_STREAM_END');
4749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := deflateEnd(c_stream);
4769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'deflateEnd');
4779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
4789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$ENDIF}
4799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project(* ===========================================================================
4819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Test inflate with a preset dictionary
4829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *)
4839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$IFDEF TEST_DICT}
4849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure test_dict_inflate(compr: Pointer; comprLen: LongInt;
4859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                            uncompr: Pointer; uncomprLen: LongInt);
4869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar err: Integer;
4879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    d_stream: z_stream; (* decompression stream *)
4889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
4899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  StrCopy(PChar(uncompr), 'garbage');
4909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.zalloc := NIL;
4929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.zfree := NIL;
4939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.opaque := NIL;
4949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.next_in := compr;
4969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.avail_in := Integer(comprLen);
4979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := inflateInit(d_stream);
4999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'inflateInit');
5009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.next_out := uncompr;
5029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  d_stream.avail_out := Integer(uncomprLen);
5039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  while TRUE do
5059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
5069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err := inflate(d_stream, Z_NO_FLUSH);
5079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if err = Z_STREAM_END then
5089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      break;
5099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if err = Z_NEED_DICT then
5109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    begin
5119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      if d_stream.adler <> dictId then
5129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        EXIT_ERR('unexpected dictionary');
5139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      err := inflateSetDictionary(d_stream, dictionary, StrLen(dictionary));
5149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    end;
5159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK_ERR(err, 'inflate with dict');
5169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
5179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  err := inflateEnd(d_stream);
5199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CHECK_ERR(err, 'inflateEnd');
5209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if StrComp(PChar(uncompr), hello) <> 0 then
5229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    EXIT_ERR('bad inflate with dict')
5239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
5249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    WriteLn('inflate with dictionary: ', PChar(uncompr));
5259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
5269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$ENDIF}
5279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar compr, uncompr: Pointer;
5299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    comprLen, uncomprLen: LongInt;
5309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
5329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if zlibVersion^ <> ZLIB_VERSION[1] then
5339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    EXIT_ERR('Incompatible zlib version');
5349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('zlib version: ', zlibVersion);
5369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('zlib compile flags: ', Format('0x%x', [zlibCompileFlags]));
5379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  comprLen := 10000 * SizeOf(Integer); (* don't overflow on MSDOS *)
5399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  uncomprLen := comprLen;
5409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  GetMem(compr, comprLen);
5419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  GetMem(uncompr, uncomprLen);
5429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if (compr = NIL) or (uncompr = NIL) then
5439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    EXIT_ERR('Out of memory');
5449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  (* compr and uncompr are cleared to avoid reading uninitialized
5459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   * data and to ensure that uncompr compresses well.
5469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   *)
5479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FillChar(compr^, comprLen, 0);
5489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FillChar(uncompr^, uncomprLen, 0);
5499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$IFDEF TEST_COMPRESS}
5519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('** Testing compress');
5529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  test_compress(compr, comprLen, uncompr, uncomprLen);
5539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$ENDIF}
5549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$IFDEF TEST_GZIO}
5569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('** Testing gzio');
5579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if ParamCount >= 1 then
5589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    test_gzio(ParamStr(1), uncompr, uncomprLen)
5599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
5609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    test_gzio(TESTFILE, uncompr, uncomprLen);
5619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$ENDIF}
5629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$IFDEF TEST_DEFLATE}
5649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('** Testing deflate with small buffers');
5659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  test_deflate(compr, comprLen);
5669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$ENDIF}
5679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$IFDEF TEST_INFLATE}
5689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('** Testing inflate with small buffers');
5699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  test_inflate(compr, comprLen, uncompr, uncomprLen);
5709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$ENDIF}
5719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$IFDEF TEST_DEFLATE}
5739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('** Testing deflate with large buffers');
5749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  test_large_deflate(compr, comprLen, uncompr, uncomprLen);
5759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$ENDIF}
5769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$IFDEF TEST_INFLATE}
5779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('** Testing inflate with large buffers');
5789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  test_large_inflate(compr, comprLen, uncompr, uncomprLen);
5799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$ENDIF}
5809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$IFDEF TEST_FLUSH}
5829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('** Testing deflate with full flush');
5839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  test_flush(compr, comprLen);
5849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$ENDIF}
5859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$IFDEF TEST_SYNC}
5869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('** Testing inflateSync');
5879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  test_sync(compr, comprLen, uncompr, uncomprLen);
5889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$ENDIF}
5899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  comprLen := uncomprLen;
5909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$IFDEF TEST_DICT}
5929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  WriteLn('** Testing deflate and inflate with preset dictionary');
5939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  test_dict_deflate(compr, comprLen);
5949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
5959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  {$ENDIF}
5969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FreeMem(compr, comprLen);
5989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FreeMem(uncompr, uncomprLen);
5999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend.
600