[1050] | 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;
|
---|