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