| ---------------------------------------------------------------- | 
 | --  ZLib for Ada thick binding.                               -- | 
 | --                                                            -- | 
 | --  Copyright (C) 2002-2003 Dmitriy Anisimkov                 -- | 
 | --                                                            -- | 
 | --  Open source license information is in the zlib.ads file.  -- | 
 | ---------------------------------------------------------------- | 
 | --  Continuous test for ZLib multithreading. If the test would fail | 
 | --  we should provide thread safe allocation routines for the Z_Stream. | 
 | -- | 
 | --  $Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp $ | 
 |  | 
 | with ZLib; | 
 | with Ada.Streams; | 
 | with Ada.Numerics.Discrete_Random; | 
 | with Ada.Text_IO; | 
 | with Ada.Exceptions; | 
 | with Ada.Task_Identification; | 
 |  | 
 | procedure MTest is | 
 |    use Ada.Streams; | 
 |    use ZLib; | 
 |  | 
 |    Stop : Boolean := False; | 
 |  | 
 |    pragma Atomic (Stop); | 
 |  | 
 |    subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; | 
 |  | 
 |    package Random_Elements is | 
 |       new Ada.Numerics.Discrete_Random (Visible_Symbols); | 
 |  | 
 |    task type Test_Task; | 
 |  | 
 |    task body Test_Task is | 
 |       Buffer : Stream_Element_Array (1 .. 100_000); | 
 |       Gen : Random_Elements.Generator; | 
 |  | 
 |       Buffer_First  : Stream_Element_Offset; | 
 |       Compare_First : Stream_Element_Offset; | 
 |  | 
 |       Deflate : Filter_Type; | 
 |       Inflate : Filter_Type; | 
 |  | 
 |       procedure Further (Item : in Stream_Element_Array); | 
 |  | 
 |       procedure Read_Buffer | 
 |         (Item : out Ada.Streams.Stream_Element_Array; | 
 |          Last : out Ada.Streams.Stream_Element_Offset); | 
 |  | 
 |       ------------- | 
 |       -- Further -- | 
 |       ------------- | 
 |  | 
 |       procedure Further (Item : in Stream_Element_Array) is | 
 |  | 
 |          procedure Compare (Item : in Stream_Element_Array); | 
 |  | 
 |          ------------- | 
 |          -- Compare -- | 
 |          ------------- | 
 |  | 
 |          procedure Compare (Item : in Stream_Element_Array) is | 
 |             Next_First : Stream_Element_Offset := Compare_First + Item'Length; | 
 |          begin | 
 |             if Buffer (Compare_First .. Next_First - 1) /= Item then | 
 |                raise Program_Error; | 
 |             end if; | 
 |  | 
 |             Compare_First := Next_First; | 
 |          end Compare; | 
 |  | 
 |          procedure Compare_Write is new ZLib.Write (Write => Compare); | 
 |       begin | 
 |          Compare_Write (Inflate, Item, No_Flush); | 
 |       end Further; | 
 |  | 
 |       ----------------- | 
 |       -- Read_Buffer -- | 
 |       ----------------- | 
 |  | 
 |       procedure Read_Buffer | 
 |         (Item : out Ada.Streams.Stream_Element_Array; | 
 |          Last : out Ada.Streams.Stream_Element_Offset) | 
 |       is | 
 |          Buff_Diff   : Stream_Element_Offset := Buffer'Last - Buffer_First; | 
 |          Next_First : Stream_Element_Offset; | 
 |       begin | 
 |          if Item'Length <= Buff_Diff then | 
 |             Last := Item'Last; | 
 |  | 
 |             Next_First := Buffer_First + Item'Length; | 
 |  | 
 |             Item := Buffer (Buffer_First .. Next_First - 1); | 
 |  | 
 |             Buffer_First := Next_First; | 
 |          else | 
 |             Last := Item'First + Buff_Diff; | 
 |             Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last); | 
 |             Buffer_First := Buffer'Last + 1; | 
 |          end if; | 
 |       end Read_Buffer; | 
 |  | 
 |       procedure Translate is new Generic_Translate | 
 |                                    (Data_In  => Read_Buffer, | 
 |                                     Data_Out => Further); | 
 |  | 
 |    begin | 
 |       Random_Elements.Reset (Gen); | 
 |  | 
 |       Buffer := (others => 20); | 
 |  | 
 |       Main : loop | 
 |          for J in Buffer'Range loop | 
 |             Buffer (J) := Random_Elements.Random (Gen); | 
 |  | 
 |             Deflate_Init (Deflate); | 
 |             Inflate_Init (Inflate); | 
 |  | 
 |             Buffer_First  := Buffer'First; | 
 |             Compare_First := Buffer'First; | 
 |  | 
 |             Translate (Deflate); | 
 |  | 
 |             if Compare_First /= Buffer'Last + 1 then | 
 |                raise Program_Error; | 
 |             end if; | 
 |  | 
 |             Ada.Text_IO.Put_Line | 
 |               (Ada.Task_Identification.Image | 
 |                  (Ada.Task_Identification.Current_Task) | 
 |                & Stream_Element_Offset'Image (J) | 
 |                & ZLib.Count'Image (Total_Out (Deflate))); | 
 |  | 
 |             Close (Deflate); | 
 |             Close (Inflate); | 
 |  | 
 |             exit Main when Stop; | 
 |          end loop; | 
 |       end loop Main; | 
 |    exception | 
 |       when E : others => | 
 |          Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E)); | 
 |          Stop := True; | 
 |    end Test_Task; | 
 |  | 
 |    Test : array (1 .. 4) of Test_Task; | 
 |  | 
 |    pragma Unreferenced (Test); | 
 |  | 
 |    Dummy : Character; | 
 |  | 
 | begin | 
 |    Ada.Text_IO.Get_Immediate (Dummy); | 
 |    Stop := True; | 
 | end MTest; |