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