annotate src/zlib-1.2.7/contrib/ada/test.adb @ 4:e13257ea84a4

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