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