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