157 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Ada
		
	
	
	
	
	
		
		
			
		
	
	
			157 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Ada
		
	
	
	
	
	
|   | ----------------------------------------------------------------
 | ||
|  | --  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; |