Mercurial > hg > sv-dependency-builds
comparison src/zlib-1.2.8/contrib/ada/test.adb @ 128:5b4145a0d408
Current zlib source
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Tue, 18 Oct 2016 14:33:52 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
127:7867fa7e1b6b | 128:5b4145a0d408 |
---|---|
1 ---------------------------------------------------------------- | |
2 -- ZLib for Ada thick binding. -- | |
3 -- -- | |
4 -- Copyright (C) 2002-2003 Dmitriy Anisimkov -- | |
5 -- -- | |
6 -- Open source license information is in the zlib.ads file. -- | |
7 ---------------------------------------------------------------- | |
8 | |
9 -- $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $ | |
10 | |
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. | |
16 | |
17 with ZLib.Streams; | |
18 with Ada.Streams.Stream_IO; | |
19 with Ada.Numerics.Discrete_Random; | |
20 | |
21 with Ada.Text_IO; | |
22 | |
23 with Ada.Calendar; | |
24 | |
25 procedure Test is | |
26 | |
27 use Ada.Streams; | |
28 use Stream_IO; | |
29 | |
30 ------------------------------------ | |
31 -- Test configuration parameters -- | |
32 ------------------------------------ | |
33 | |
34 File_Size : Count := 100_000; | |
35 Continuous : constant Boolean := False; | |
36 | |
37 Header : constant ZLib.Header_Type := ZLib.Default; | |
38 -- ZLib.None; | |
39 -- ZLib.Auto; | |
40 -- ZLib.GZip; | |
41 -- Do not use Header other then Default in ZLib versions 1.1.4 | |
42 -- and older. | |
43 | |
44 Strategy : constant ZLib.Strategy_Type := ZLib.Default_Strategy; | |
45 Init_Random : constant := 10; | |
46 | |
47 -- End -- | |
48 | |
49 In_File_Name : constant String := "testzlib.in"; | |
50 -- Name of the input file | |
51 | |
52 Z_File_Name : constant String := "testzlib.zlb"; | |
53 -- Name of the compressed file. | |
54 | |
55 Out_File_Name : constant String := "testzlib.out"; | |
56 -- Name of the decompressed file. | |
57 | |
58 File_In : File_Type; | |
59 File_Out : File_Type; | |
60 File_Back : File_Type; | |
61 File_Z : ZLib.Streams.Stream_Type; | |
62 | |
63 Filter : ZLib.Filter_Type; | |
64 | |
65 Time_Stamp : Ada.Calendar.Time; | |
66 | |
67 procedure Generate_File; | |
68 -- Generate file of spetsified size with some random data. | |
69 -- The random data is repeatable, for the good compression. | |
70 | |
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. | |
75 | |
76 procedure Compare_Files (Left, Right : String); | |
77 -- Compare files. Based on the Compare_Streams. | |
78 | |
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. | |
84 | |
85 procedure Data_In | |
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. | |
91 | |
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. | |
96 | |
97 procedure Stamp; | |
98 -- Store the timestamp to the local variable. | |
99 | |
100 procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count); | |
101 -- Print the time statistic with the message. | |
102 | |
103 procedure Translate is new ZLib.Generic_Translate | |
104 (Data_In => Data_In, | |
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 | |
108 -- Filter parameter. | |
109 | |
110 ------------------- | |
111 -- Compare_Files -- | |
112 ------------------- | |
113 | |
114 procedure Compare_Files (Left, Right : String) is | |
115 Left_File, Right_File : File_Type; | |
116 begin | |
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); | |
120 Close (Left_File); | |
121 Close (Right_File); | |
122 end Compare_Files; | |
123 | |
124 --------------------- | |
125 -- Compare_Streams -- | |
126 --------------------- | |
127 | |
128 procedure Compare_Streams | |
129 (Left, Right : in out Ada.Streams.Root_Stream_Type'Class) | |
130 is | |
131 Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#); | |
132 Left_Last, Right_Last : Stream_Element_Offset; | |
133 begin | |
134 loop | |
135 Read (Left, Left_Buffer, Left_Last); | |
136 Read (Right, Right_Buffer, Right_Last); | |
137 | |
138 if Left_Last /= Right_Last then | |
139 Ada.Text_IO.Put_Line ("Compare error :" | |
140 & Stream_Element_Offset'Image (Left_Last) | |
141 & " /= " | |
142 & Stream_Element_Offset'Image (Right_Last)); | |
143 | |
144 raise Constraint_Error; | |
145 | |
146 elsif Left_Buffer (0 .. Left_Last) | |
147 /= Right_Buffer (0 .. Right_Last) | |
148 then | |
149 Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal."); | |
150 raise Constraint_Error; | |
151 | |
152 end if; | |
153 | |
154 exit when Left_Last < Left_Buffer'Last; | |
155 end loop; | |
156 end Compare_Streams; | |
157 | |
158 ------------------ | |
159 -- Copy_Streams -- | |
160 ------------------ | |
161 | |
162 procedure Copy_Streams | |
163 (Source, Target : in out Ada.Streams.Root_Stream_Type'Class; | |
164 Buffer_Size : in Stream_Element_Offset := 1024) | |
165 is | |
166 Buffer : Stream_Element_Array (1 .. Buffer_Size); | |
167 Last : Stream_Element_Offset; | |
168 begin | |
169 loop | |
170 Read (Source, Buffer, Last); | |
171 Write (Target, Buffer (1 .. Last)); | |
172 | |
173 exit when Last < Buffer'Last; | |
174 end loop; | |
175 end Copy_Streams; | |
176 | |
177 ------------- | |
178 -- Data_In -- | |
179 ------------- | |
180 | |
181 procedure Data_In | |
182 (Item : out Stream_Element_Array; | |
183 Last : out Stream_Element_Offset) is | |
184 begin | |
185 Read (File_In, Item, Last); | |
186 end Data_In; | |
187 | |
188 -------------- | |
189 -- Data_Out -- | |
190 -------------- | |
191 | |
192 procedure Data_Out (Item : in Stream_Element_Array) is | |
193 begin | |
194 Write (File_Out, Item); | |
195 end Data_Out; | |
196 | |
197 ------------------- | |
198 -- Generate_File -- | |
199 ------------------- | |
200 | |
201 procedure Generate_File is | |
202 subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; | |
203 | |
204 package Random_Elements is | |
205 new Ada.Numerics.Discrete_Random (Visible_Symbols); | |
206 | |
207 Gen : Random_Elements.Generator; | |
208 Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10; | |
209 | |
210 Buffer_Count : constant Count := File_Size / Buffer'Length; | |
211 -- Number of same buffers in the packet. | |
212 | |
213 Density : constant Count := 30; -- from 0 to Buffer'Length - 2; | |
214 | |
215 procedure Fill_Buffer (J, D : in Count); | |
216 -- Change the part of the buffer. | |
217 | |
218 ----------------- | |
219 -- Fill_Buffer -- | |
220 ----------------- | |
221 | |
222 procedure Fill_Buffer (J, D : in Count) is | |
223 begin | |
224 for K in 0 .. D loop | |
225 Buffer | |
226 (Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1)) | |
227 := Random_Elements.Random (Gen); | |
228 | |
229 end loop; | |
230 end Fill_Buffer; | |
231 | |
232 begin | |
233 Random_Elements.Reset (Gen, Init_Random); | |
234 | |
235 Create (File_In, Out_File, In_File_Name); | |
236 | |
237 Fill_Buffer (1, Buffer'Length - 2); | |
238 | |
239 for J in 1 .. Buffer_Count loop | |
240 Write (File_In, Buffer); | |
241 | |
242 Fill_Buffer (J, Density); | |
243 end loop; | |
244 | |
245 -- fill remain size. | |
246 | |
247 Write | |
248 (File_In, | |
249 Buffer | |
250 (1 .. Stream_Element_Offset | |
251 (File_Size - Buffer'Length * Buffer_Count))); | |
252 | |
253 Flush (File_In); | |
254 Close (File_In); | |
255 end Generate_File; | |
256 | |
257 --------------------- | |
258 -- Print_Statistic -- | |
259 --------------------- | |
260 | |
261 procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is | |
262 use Ada.Calendar; | |
263 use Ada.Text_IO; | |
264 | |
265 package Count_IO is new Integer_IO (ZLib.Count); | |
266 | |
267 Curr_Dur : Duration := Clock - Time_Stamp; | |
268 begin | |
269 Put (Msg); | |
270 | |
271 Set_Col (20); | |
272 Ada.Text_IO.Put ("size ="); | |
273 | |
274 Count_IO.Put | |
275 (Data_Size, | |
276 Width => Stream_IO.Count'Image (File_Size)'Length); | |
277 | |
278 Put_Line (" duration =" & Duration'Image (Curr_Dur)); | |
279 end Print_Statistic; | |
280 | |
281 ----------- | |
282 -- Stamp -- | |
283 ----------- | |
284 | |
285 procedure Stamp is | |
286 begin | |
287 Time_Stamp := Ada.Calendar.Clock; | |
288 end Stamp; | |
289 | |
290 begin | |
291 Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version); | |
292 | |
293 loop | |
294 Generate_File; | |
295 | |
296 for Level in ZLib.Compression_Level'Range loop | |
297 | |
298 Ada.Text_IO.Put_Line ("Level =" | |
299 & ZLib.Compression_Level'Image (Level)); | |
300 | |
301 -- Test generic interface. | |
302 Open (File_In, In_File, In_File_Name); | |
303 Create (File_Out, Out_File, Z_File_Name); | |
304 | |
305 Stamp; | |
306 | |
307 -- Deflate using generic instantiation. | |
308 | |
309 ZLib.Deflate_Init | |
310 (Filter => Filter, | |
311 Level => Level, | |
312 Strategy => Strategy, | |
313 Header => Header); | |
314 | |
315 Translate (Filter); | |
316 Print_Statistic ("Generic compress", ZLib.Total_Out (Filter)); | |
317 ZLib.Close (Filter); | |
318 | |
319 Close (File_In); | |
320 Close (File_Out); | |
321 | |
322 Open (File_In, In_File, Z_File_Name); | |
323 Create (File_Out, Out_File, Out_File_Name); | |
324 | |
325 Stamp; | |
326 | |
327 -- Inflate using generic instantiation. | |
328 | |
329 ZLib.Inflate_Init (Filter, Header => Header); | |
330 | |
331 Translate (Filter); | |
332 Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter)); | |
333 | |
334 ZLib.Close (Filter); | |
335 | |
336 Close (File_In); | |
337 Close (File_Out); | |
338 | |
339 Compare_Files (In_File_Name, Out_File_Name); | |
340 | |
341 -- Test stream interface. | |
342 | |
343 -- Compress to the back stream. | |
344 | |
345 Open (File_In, In_File, In_File_Name); | |
346 Create (File_Back, Out_File, Z_File_Name); | |
347 | |
348 Stamp; | |
349 | |
350 ZLib.Streams.Create | |
351 (Stream => File_Z, | |
352 Mode => ZLib.Streams.Out_Stream, | |
353 Back => ZLib.Streams.Stream_Access | |
354 (Stream (File_Back)), | |
355 Back_Compressed => True, | |
356 Level => Level, | |
357 Strategy => Strategy, | |
358 Header => Header); | |
359 | |
360 Copy_Streams | |
361 (Source => Stream (File_In).all, | |
362 Target => File_Z); | |
363 | |
364 -- Flushing internal buffers to the back stream. | |
365 | |
366 ZLib.Streams.Flush (File_Z, ZLib.Finish); | |
367 | |
368 Print_Statistic ("Write compress", | |
369 ZLib.Streams.Write_Total_Out (File_Z)); | |
370 | |
371 ZLib.Streams.Close (File_Z); | |
372 | |
373 Close (File_In); | |
374 Close (File_Back); | |
375 | |
376 -- Compare reading from original file and from | |
377 -- decompression stream. | |
378 | |
379 Open (File_In, In_File, In_File_Name); | |
380 Open (File_Back, In_File, Z_File_Name); | |
381 | |
382 ZLib.Streams.Create | |
383 (Stream => File_Z, | |
384 Mode => ZLib.Streams.In_Stream, | |
385 Back => ZLib.Streams.Stream_Access | |
386 (Stream (File_Back)), | |
387 Back_Compressed => True, | |
388 Header => Header); | |
389 | |
390 Stamp; | |
391 Compare_Streams (Stream (File_In).all, File_Z); | |
392 | |
393 Print_Statistic ("Read decompress", | |
394 ZLib.Streams.Read_Total_Out (File_Z)); | |
395 | |
396 ZLib.Streams.Close (File_Z); | |
397 Close (File_In); | |
398 Close (File_Back); | |
399 | |
400 -- Compress by reading from compression stream. | |
401 | |
402 Open (File_Back, In_File, In_File_Name); | |
403 Create (File_Out, Out_File, Z_File_Name); | |
404 | |
405 ZLib.Streams.Create | |
406 (Stream => File_Z, | |
407 Mode => ZLib.Streams.In_Stream, | |
408 Back => ZLib.Streams.Stream_Access | |
409 (Stream (File_Back)), | |
410 Back_Compressed => False, | |
411 Level => Level, | |
412 Strategy => Strategy, | |
413 Header => Header); | |
414 | |
415 Stamp; | |
416 Copy_Streams | |
417 (Source => File_Z, | |
418 Target => Stream (File_Out).all); | |
419 | |
420 Print_Statistic ("Read compress", | |
421 ZLib.Streams.Read_Total_Out (File_Z)); | |
422 | |
423 ZLib.Streams.Close (File_Z); | |
424 | |
425 Close (File_Out); | |
426 Close (File_Back); | |
427 | |
428 -- Decompress to decompression stream. | |
429 | |
430 Open (File_In, In_File, Z_File_Name); | |
431 Create (File_Back, Out_File, Out_File_Name); | |
432 | |
433 ZLib.Streams.Create | |
434 (Stream => File_Z, | |
435 Mode => ZLib.Streams.Out_Stream, | |
436 Back => ZLib.Streams.Stream_Access | |
437 (Stream (File_Back)), | |
438 Back_Compressed => False, | |
439 Header => Header); | |
440 | |
441 Stamp; | |
442 | |
443 Copy_Streams | |
444 (Source => Stream (File_In).all, | |
445 Target => File_Z); | |
446 | |
447 Print_Statistic ("Write decompress", | |
448 ZLib.Streams.Write_Total_Out (File_Z)); | |
449 | |
450 ZLib.Streams.Close (File_Z); | |
451 Close (File_In); | |
452 Close (File_Back); | |
453 | |
454 Compare_Files (In_File_Name, Out_File_Name); | |
455 end loop; | |
456 | |
457 Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok."); | |
458 | |
459 exit when not Continuous; | |
460 | |
461 File_Size := File_Size + 1; | |
462 end loop; | |
463 end Test; |