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