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,v 1.17 2003/08/12 12:13:30 vagul Exp
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;