157 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Ada
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Ada
		
	
	
	
	
	
| ----------------------------------------------------------------
 | |
| --  ZLib for Ada thick binding.                               --
 | |
| --                                                            --
 | |
| --  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
 | |
| --                                                            --
 | |
| --  Open source license information is in the zlib.ads file.  --
 | |
| ----------------------------------------------------------------
 | |
| 
 | |
| --  $Id: read.adb,v 1.8 2004/05/31 10:53:40 vagul Exp $
 | |
| 
 | |
| --  Test/demo program for the generic read interface.
 | |
| 
 | |
| with Ada.Numerics.Discrete_Random;
 | |
| with Ada.Streams;
 | |
| with Ada.Text_IO;
 | |
| 
 | |
| with ZLib;
 | |
| 
 | |
| procedure Read is
 | |
| 
 | |
|    use Ada.Streams;
 | |
| 
 | |
|    ------------------------------------
 | |
|    --  Test configuration parameters --
 | |
|    ------------------------------------
 | |
| 
 | |
|    File_Size   : Stream_Element_Offset := 100_000;
 | |
| 
 | |
|    Continuous  : constant Boolean          := False;
 | |
|    --  If this constant is True, the test would be repeated again and again,
 | |
|    --  with increment File_Size for every iteration.
 | |
| 
 | |
|    Header      : constant ZLib.Header_Type := ZLib.Default;
 | |
|    --  Do not use Header other than Default in ZLib versions 1.1.4 and older.
 | |
| 
 | |
|    Init_Random : constant := 8;
 | |
|    --  We are using the same random sequence, in case of we catch bug,
 | |
|    --  so we would be able to reproduce it.
 | |
| 
 | |
|    -- End --
 | |
| 
 | |
|    Pack_Size : Stream_Element_Offset;
 | |
|    Offset    : Stream_Element_Offset;
 | |
| 
 | |
|    Filter     : ZLib.Filter_Type;
 | |
| 
 | |
|    subtype Visible_Symbols
 | |
|       is Stream_Element range 16#20# .. 16#7E#;
 | |
| 
 | |
|    package Random_Elements is new
 | |
|       Ada.Numerics.Discrete_Random (Visible_Symbols);
 | |
| 
 | |
|    Gen : Random_Elements.Generator;
 | |
|    Period  : constant Stream_Element_Offset := 200;
 | |
|    --  Period constant variable for random generator not to be very random.
 | |
|    --  Bigger period, harder random.
 | |
| 
 | |
|    Read_Buffer : Stream_Element_Array (1 .. 2048);
 | |
|    Read_First  : Stream_Element_Offset;
 | |
|    Read_Last   : Stream_Element_Offset;
 | |
| 
 | |
|    procedure Reset;
 | |
| 
 | |
|    procedure Read
 | |
|      (Item : out Stream_Element_Array;
 | |
|       Last : out Stream_Element_Offset);
 | |
|    --  this procedure is for generic instantiation of
 | |
|    --  ZLib.Read
 | |
|    --  reading data from the File_In.
 | |
| 
 | |
|    procedure Read is new ZLib.Read
 | |
|                            (Read,
 | |
|                             Read_Buffer,
 | |
|                             Rest_First => Read_First,
 | |
|                             Rest_Last  => Read_Last);
 | |
| 
 | |
|    ----------
 | |
|    -- Read --
 | |
|    ----------
 | |
| 
 | |
|    procedure Read
 | |
|      (Item : out Stream_Element_Array;
 | |
|       Last : out Stream_Element_Offset) is
 | |
|    begin
 | |
|       Last := Stream_Element_Offset'Min
 | |
|                (Item'Last,
 | |
|                 Item'First + File_Size - Offset);
 | |
| 
 | |
|       for J in Item'First .. Last loop
 | |
|          if J < Item'First + Period then
 | |
|             Item (J) := Random_Elements.Random (Gen);
 | |
|          else
 | |
|             Item (J) := Item (J - Period);
 | |
|          end if;
 | |
| 
 | |
|          Offset   := Offset + 1;
 | |
|       end loop;
 | |
|    end Read;
 | |
| 
 | |
|    -----------
 | |
|    -- Reset --
 | |
|    -----------
 | |
| 
 | |
|    procedure Reset is
 | |
|    begin
 | |
|       Random_Elements.Reset (Gen, Init_Random);
 | |
|       Pack_Size := 0;
 | |
|       Offset := 1;
 | |
|       Read_First := Read_Buffer'Last + 1;
 | |
|       Read_Last  := Read_Buffer'Last;
 | |
|    end Reset;
 | |
| 
 | |
| begin
 | |
|    Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
 | |
| 
 | |
|    loop
 | |
|       for Level in ZLib.Compression_Level'Range loop
 | |
| 
 | |
|          Ada.Text_IO.Put ("Level ="
 | |
|             & ZLib.Compression_Level'Image (Level));
 | |
| 
 | |
|          --  Deflate using generic instantiation.
 | |
| 
 | |
|          ZLib.Deflate_Init
 | |
|                (Filter,
 | |
|                 Level,
 | |
|                 Header => Header);
 | |
| 
 | |
|          Reset;
 | |
| 
 | |
|          Ada.Text_IO.Put
 | |
|            (Stream_Element_Offset'Image (File_Size) & " ->");
 | |
| 
 | |
|          loop
 | |
|             declare
 | |
|                Buffer : Stream_Element_Array (1 .. 1024);
 | |
|                Last   : Stream_Element_Offset;
 | |
|             begin
 | |
|                Read (Filter, Buffer, Last);
 | |
| 
 | |
|                Pack_Size := Pack_Size + Last - Buffer'First + 1;
 | |
| 
 | |
|                exit when Last < Buffer'Last;
 | |
|             end;
 | |
|          end loop;
 | |
| 
 | |
|          Ada.Text_IO.Put_Line (Stream_Element_Offset'Image (Pack_Size));
 | |
| 
 | |
|          ZLib.Close (Filter);
 | |
|       end loop;
 | |
| 
 | |
|       exit when not Continuous;
 | |
| 
 | |
|       File_Size := File_Size + 1;
 | |
|    end loop;
 | |
| end Read;
 | 
