annotate src/zlib-1.2.8/contrib/ada/test.adb @ 83:ae30d91d2ffe

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