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;
 | 
