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