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; |