annotate src/zlib-1.2.7/contrib/ada/test.adb @ 127:7867fa7e1b6b

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