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