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