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