| 1 | ----------------------------------------------------------------
 | 
|---|
| 2 | --  ZLib for Ada thick binding.                               --
 | 
|---|
| 3 | --                                                            --
 | 
|---|
| 4 | --  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
 | 
|---|
| 5 | --                                                            --
 | 
|---|
| 6 | --  Open source license information is in the zlib.ads file.  --
 | 
|---|
| 7 | ----------------------------------------------------------------
 | 
|---|
| 8 | --  Continuous test for ZLib multithreading. If the test would fail
 | 
|---|
| 9 | --  we should provide thread safe allocation routines for the Z_Stream.
 | 
|---|
| 10 | --
 | 
|---|
| 11 | --  $Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp $
 | 
|---|
| 12 | 
 | 
|---|
| 13 | with ZLib;
 | 
|---|
| 14 | with Ada.Streams;
 | 
|---|
| 15 | with Ada.Numerics.Discrete_Random;
 | 
|---|
| 16 | with Ada.Text_IO;
 | 
|---|
| 17 | with Ada.Exceptions;
 | 
|---|
| 18 | with Ada.Task_Identification;
 | 
|---|
| 19 | 
 | 
|---|
| 20 | procedure MTest is
 | 
|---|
| 21 |    use Ada.Streams;
 | 
|---|
| 22 |    use ZLib;
 | 
|---|
| 23 | 
 | 
|---|
| 24 |    Stop : Boolean := False;
 | 
|---|
| 25 | 
 | 
|---|
| 26 |    pragma Atomic (Stop);
 | 
|---|
| 27 | 
 | 
|---|
| 28 |    subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
 | 
|---|
| 29 | 
 | 
|---|
| 30 |    package Random_Elements is
 | 
|---|
| 31 |       new Ada.Numerics.Discrete_Random (Visible_Symbols);
 | 
|---|
| 32 | 
 | 
|---|
| 33 |    task type Test_Task;
 | 
|---|
| 34 | 
 | 
|---|
| 35 |    task body Test_Task is
 | 
|---|
| 36 |       Buffer : Stream_Element_Array (1 .. 100_000);
 | 
|---|
| 37 |       Gen : Random_Elements.Generator;
 | 
|---|
| 38 | 
 | 
|---|
| 39 |       Buffer_First  : Stream_Element_Offset;
 | 
|---|
| 40 |       Compare_First : Stream_Element_Offset;
 | 
|---|
| 41 | 
 | 
|---|
| 42 |       Deflate : Filter_Type;
 | 
|---|
| 43 |       Inflate : Filter_Type;
 | 
|---|
| 44 | 
 | 
|---|
| 45 |       procedure Further (Item : in Stream_Element_Array);
 | 
|---|
| 46 | 
 | 
|---|
| 47 |       procedure Read_Buffer
 | 
|---|
| 48 |         (Item : out Ada.Streams.Stream_Element_Array;
 | 
|---|
| 49 |          Last : out Ada.Streams.Stream_Element_Offset);
 | 
|---|
| 50 | 
 | 
|---|
| 51 |       -------------
 | 
|---|
| 52 |       -- Further --
 | 
|---|
| 53 |       -------------
 | 
|---|
| 54 | 
 | 
|---|
| 55 |       procedure Further (Item : in Stream_Element_Array) is
 | 
|---|
| 56 | 
 | 
|---|
| 57 |          procedure Compare (Item : in Stream_Element_Array);
 | 
|---|
| 58 | 
 | 
|---|
| 59 |          -------------
 | 
|---|
| 60 |          -- Compare --
 | 
|---|
| 61 |          -------------
 | 
|---|
| 62 | 
 | 
|---|
| 63 |          procedure Compare (Item : in Stream_Element_Array) is
 | 
|---|
| 64 |             Next_First : Stream_Element_Offset := Compare_First + Item'Length;
 | 
|---|
| 65 |          begin
 | 
|---|
| 66 |             if Buffer (Compare_First .. Next_First - 1) /= Item then
 | 
|---|
| 67 |                raise Program_Error;
 | 
|---|
| 68 |             end if;
 | 
|---|
| 69 | 
 | 
|---|
| 70 |             Compare_First := Next_First;
 | 
|---|
| 71 |          end Compare;
 | 
|---|
| 72 | 
 | 
|---|
| 73 |          procedure Compare_Write is new ZLib.Write (Write => Compare);
 | 
|---|
| 74 |       begin
 | 
|---|
| 75 |          Compare_Write (Inflate, Item, No_Flush);
 | 
|---|
| 76 |       end Further;
 | 
|---|
| 77 | 
 | 
|---|
| 78 |       -----------------
 | 
|---|
| 79 |       -- Read_Buffer --
 | 
|---|
| 80 |       -----------------
 | 
|---|
| 81 | 
 | 
|---|
| 82 |       procedure Read_Buffer
 | 
|---|
| 83 |         (Item : out Ada.Streams.Stream_Element_Array;
 | 
|---|
| 84 |          Last : out Ada.Streams.Stream_Element_Offset)
 | 
|---|
| 85 |       is
 | 
|---|
| 86 |          Buff_Diff   : Stream_Element_Offset := Buffer'Last - Buffer_First;
 | 
|---|
| 87 |          Next_First : Stream_Element_Offset;
 | 
|---|
| 88 |       begin
 | 
|---|
| 89 |          if Item'Length <= Buff_Diff then
 | 
|---|
| 90 |             Last := Item'Last;
 | 
|---|
| 91 | 
 | 
|---|
| 92 |             Next_First := Buffer_First + Item'Length;
 | 
|---|
| 93 | 
 | 
|---|
| 94 |             Item := Buffer (Buffer_First .. Next_First - 1);
 | 
|---|
| 95 | 
 | 
|---|
| 96 |             Buffer_First := Next_First;
 | 
|---|
| 97 |          else
 | 
|---|
| 98 |             Last := Item'First + Buff_Diff;
 | 
|---|
| 99 |             Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last);
 | 
|---|
| 100 |             Buffer_First := Buffer'Last + 1;
 | 
|---|
| 101 |          end if;
 | 
|---|
| 102 |       end Read_Buffer;
 | 
|---|
| 103 | 
 | 
|---|
| 104 |       procedure Translate is new Generic_Translate
 | 
|---|
| 105 |                                    (Data_In  => Read_Buffer,
 | 
|---|
| 106 |                                     Data_Out => Further);
 | 
|---|
| 107 | 
 | 
|---|
| 108 |    begin
 | 
|---|
| 109 |       Random_Elements.Reset (Gen);
 | 
|---|
| 110 | 
 | 
|---|
| 111 |       Buffer := (others => 20);
 | 
|---|
| 112 | 
 | 
|---|
| 113 |       Main : loop
 | 
|---|
| 114 |          for J in Buffer'Range loop
 | 
|---|
| 115 |             Buffer (J) := Random_Elements.Random (Gen);
 | 
|---|
| 116 | 
 | 
|---|
| 117 |             Deflate_Init (Deflate);
 | 
|---|
| 118 |             Inflate_Init (Inflate);
 | 
|---|
| 119 | 
 | 
|---|
| 120 |             Buffer_First  := Buffer'First;
 | 
|---|
| 121 |             Compare_First := Buffer'First;
 | 
|---|
| 122 | 
 | 
|---|
| 123 |             Translate (Deflate);
 | 
|---|
| 124 | 
 | 
|---|
| 125 |             if Compare_First /= Buffer'Last + 1 then
 | 
|---|
| 126 |                raise Program_Error;
 | 
|---|
| 127 |             end if;
 | 
|---|
| 128 | 
 | 
|---|
| 129 |             Ada.Text_IO.Put_Line
 | 
|---|
| 130 |               (Ada.Task_Identification.Image
 | 
|---|
| 131 |                  (Ada.Task_Identification.Current_Task)
 | 
|---|
| 132 |                & Stream_Element_Offset'Image (J)
 | 
|---|
| 133 |                & ZLib.Count'Image (Total_Out (Deflate)));
 | 
|---|
| 134 | 
 | 
|---|
| 135 |             Close (Deflate);
 | 
|---|
| 136 |             Close (Inflate);
 | 
|---|
| 137 | 
 | 
|---|
| 138 |             exit Main when Stop;
 | 
|---|
| 139 |          end loop;
 | 
|---|
| 140 |       end loop Main;
 | 
|---|
| 141 |    exception
 | 
|---|
| 142 |       when E : others =>
 | 
|---|
| 143 |          Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E));
 | 
|---|
| 144 |          Stop := True;
 | 
|---|
| 145 |    end Test_Task;
 | 
|---|
| 146 | 
 | 
|---|
| 147 |    Test : array (1 .. 4) of Test_Task;
 | 
|---|
| 148 | 
 | 
|---|
| 149 |    pragma Unreferenced (Test);
 | 
|---|
| 150 | 
 | 
|---|
| 151 |    Dummy : Character;
 | 
|---|
| 152 | 
 | 
|---|
| 153 | begin
 | 
|---|
| 154 |    Ada.Text_IO.Get_Immediate (Dummy);
 | 
|---|
| 155 |    Stop := True;
 | 
|---|
| 156 | end MTest;
 | 
|---|