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