1
----------------------------------------------------------------
2
-- ZLib for Ada thick binding. --
4
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
6
-- Open source license information is in the zlib.ads file. --
7
----------------------------------------------------------------
9
-- $Id: test.adb 66 2005-08-17 18:20:58Z andreas_kupries $
11
-- The program has a few aims.
12
-- 1. Test ZLib.Ada95 thick binding functionality.
13
-- 2. Show the example of use main functionality of the ZLib.Ada95 binding.
14
-- 3. Build this program automatically compile all ZLib.Ada95 packages under
15
-- GNAT Ada95 compiler.
18
with Ada.Streams.Stream_IO;
19
with Ada.Numerics.Discrete_Random;
30
------------------------------------
31
-- Test configuration parameters --
32
------------------------------------
34
File_Size : Count := 100_000;
35
Continuous : constant Boolean := False;
37
Header : constant ZLib.Header_Type := ZLib.Default;
41
-- Do not use Header other then Default in ZLib versions 1.1.4
44
Strategy : constant ZLib.Strategy_Type := ZLib.Default_Strategy;
45
Init_Random : constant := 10;
49
In_File_Name : constant String := "testzlib.in";
50
-- Name of the input file
52
Z_File_Name : constant String := "testzlib.zlb";
53
-- Name of the compressed file.
55
Out_File_Name : constant String := "testzlib.out";
56
-- Name of the decompressed file.
60
File_Back : File_Type;
61
File_Z : ZLib.Streams.Stream_Type;
63
Filter : ZLib.Filter_Type;
65
Time_Stamp : Ada.Calendar.Time;
67
procedure Generate_File;
68
-- Generate file of spetsified size with some random data.
69
-- The random data is repeatable, for the good compression.
71
procedure Compare_Streams
72
(Left, Right : in out Root_Stream_Type'Class);
73
-- The procedure compearing data in 2 streams.
74
-- It is for compare data before and after compression/decompression.
76
procedure Compare_Files (Left, Right : String);
77
-- Compare files. Based on the Compare_Streams.
79
procedure Copy_Streams
80
(Source, Target : in out Root_Stream_Type'Class;
81
Buffer_Size : in Stream_Element_Offset := 1024);
82
-- Copying data from one stream to another. It is for test stream
83
-- interface of the library.
86
(Item : out Stream_Element_Array;
87
Last : out Stream_Element_Offset);
88
-- this procedure is for generic instantiation of
89
-- ZLib.Generic_Translate.
90
-- reading data from the File_In.
92
procedure Data_Out (Item : in Stream_Element_Array);
93
-- this procedure is for generic instantiation of
94
-- ZLib.Generic_Translate.
95
-- writing data to the File_Out.
98
-- Store the timestamp to the local variable.
100
procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count);
101
-- Print the time statistic with the message.
103
procedure Translate is new ZLib.Generic_Translate
105
Data_Out => Data_Out);
106
-- This procedure is moving data from File_In to File_Out
107
-- with compression or decompression, depend on initialization of
114
procedure Compare_Files (Left, Right : String) is
115
Left_File, Right_File : File_Type;
117
Open (Left_File, In_File, Left);
118
Open (Right_File, In_File, Right);
119
Compare_Streams (Stream (Left_File).all, Stream (Right_File).all);
124
---------------------
125
-- Compare_Streams --
126
---------------------
128
procedure Compare_Streams
129
(Left, Right : in out Ada.Streams.Root_Stream_Type'Class)
131
Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#);
132
Left_Last, Right_Last : Stream_Element_Offset;
135
Read (Left, Left_Buffer, Left_Last);
136
Read (Right, Right_Buffer, Right_Last);
138
if Left_Last /= Right_Last then
139
Ada.Text_IO.Put_Line ("Compare error :"
140
& Stream_Element_Offset'Image (Left_Last)
142
& Stream_Element_Offset'Image (Right_Last));
144
raise Constraint_Error;
146
elsif Left_Buffer (0 .. Left_Last)
147
/= Right_Buffer (0 .. Right_Last)
149
Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal.");
150
raise Constraint_Error;
154
exit when Left_Last < Left_Buffer'Last;
162
procedure Copy_Streams
163
(Source, Target : in out Ada.Streams.Root_Stream_Type'Class;
164
Buffer_Size : in Stream_Element_Offset := 1024)
166
Buffer : Stream_Element_Array (1 .. Buffer_Size);
167
Last : Stream_Element_Offset;
170
Read (Source, Buffer, Last);
171
Write (Target, Buffer (1 .. Last));
173
exit when Last < Buffer'Last;
182
(Item : out Stream_Element_Array;
183
Last : out Stream_Element_Offset) is
185
Read (File_In, Item, Last);
192
procedure Data_Out (Item : in Stream_Element_Array) is
194
Write (File_Out, Item);
201
procedure Generate_File is
202
subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
204
package Random_Elements is
205
new Ada.Numerics.Discrete_Random (Visible_Symbols);
207
Gen : Random_Elements.Generator;
208
Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10;
210
Buffer_Count : constant Count := File_Size / Buffer'Length;
211
-- Number of same buffers in the packet.
213
Density : constant Count := 30; -- from 0 to Buffer'Length - 2;
215
procedure Fill_Buffer (J, D : in Count);
216
-- Change the part of the buffer.
222
procedure Fill_Buffer (J, D : in Count) is
226
(Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1))
227
:= Random_Elements.Random (Gen);
233
Random_Elements.Reset (Gen, Init_Random);
235
Create (File_In, Out_File, In_File_Name);
237
Fill_Buffer (1, Buffer'Length - 2);
239
for J in 1 .. Buffer_Count loop
240
Write (File_In, Buffer);
242
Fill_Buffer (J, Density);
250
(1 .. Stream_Element_Offset
251
(File_Size - Buffer'Length * Buffer_Count)));
257
---------------------
258
-- Print_Statistic --
259
---------------------
261
procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is
265
package Count_IO is new Integer_IO (ZLib.Count);
267
Curr_Dur : Duration := Clock - Time_Stamp;
272
Ada.Text_IO.Put ("size =");
276
Width => Stream_IO.Count'Image (File_Size)'Length);
278
Put_Line (" duration =" & Duration'Image (Curr_Dur));
287
Time_Stamp := Ada.Calendar.Clock;
291
Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
296
for Level in ZLib.Compression_Level'Range loop
298
Ada.Text_IO.Put_Line ("Level ="
299
& ZLib.Compression_Level'Image (Level));
301
-- Test generic interface.
302
Open (File_In, In_File, In_File_Name);
303
Create (File_Out, Out_File, Z_File_Name);
307
-- Deflate using generic instantiation.
312
Strategy => Strategy,
316
Print_Statistic ("Generic compress", ZLib.Total_Out (Filter));
322
Open (File_In, In_File, Z_File_Name);
323
Create (File_Out, Out_File, Out_File_Name);
327
-- Inflate using generic instantiation.
329
ZLib.Inflate_Init (Filter, Header => Header);
332
Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter));
339
Compare_Files (In_File_Name, Out_File_Name);
341
-- Test stream interface.
343
-- Compress to the back stream.
345
Open (File_In, In_File, In_File_Name);
346
Create (File_Back, Out_File, Z_File_Name);
352
Mode => ZLib.Streams.Out_Stream,
353
Back => ZLib.Streams.Stream_Access
354
(Stream (File_Back)),
355
Back_Compressed => True,
357
Strategy => Strategy,
361
(Source => Stream (File_In).all,
364
-- Flushing internal buffers to the back stream.
366
ZLib.Streams.Flush (File_Z, ZLib.Finish);
368
Print_Statistic ("Write compress",
369
ZLib.Streams.Write_Total_Out (File_Z));
371
ZLib.Streams.Close (File_Z);
376
-- Compare reading from original file and from
377
-- decompression stream.
379
Open (File_In, In_File, In_File_Name);
380
Open (File_Back, In_File, Z_File_Name);
384
Mode => ZLib.Streams.In_Stream,
385
Back => ZLib.Streams.Stream_Access
386
(Stream (File_Back)),
387
Back_Compressed => True,
391
Compare_Streams (Stream (File_In).all, File_Z);
393
Print_Statistic ("Read decompress",
394
ZLib.Streams.Read_Total_Out (File_Z));
396
ZLib.Streams.Close (File_Z);
400
-- Compress by reading from compression stream.
402
Open (File_Back, In_File, In_File_Name);
403
Create (File_Out, Out_File, Z_File_Name);
407
Mode => ZLib.Streams.In_Stream,
408
Back => ZLib.Streams.Stream_Access
409
(Stream (File_Back)),
410
Back_Compressed => False,
412
Strategy => Strategy,
418
Target => Stream (File_Out).all);
420
Print_Statistic ("Read compress",
421
ZLib.Streams.Read_Total_Out (File_Z));
423
ZLib.Streams.Close (File_Z);
428
-- Decompress to decompression stream.
430
Open (File_In, In_File, Z_File_Name);
431
Create (File_Back, Out_File, Out_File_Name);
435
Mode => ZLib.Streams.Out_Stream,
436
Back => ZLib.Streams.Stream_Access
437
(Stream (File_Back)),
438
Back_Compressed => False,
444
(Source => Stream (File_In).all,
447
Print_Statistic ("Write decompress",
448
ZLib.Streams.Write_Total_Out (File_Z));
450
ZLib.Streams.Close (File_Z);
454
Compare_Files (In_File_Name, Out_File_Name);
457
Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok.");
459
exit when not Continuous;
461
File_Size := File_Size + 1;