xref: /minix3/common/dist/zlib/contrib/ada/zlib-streams.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
9*44bedb31SLionel Sambuc--  Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp
10*44bedb31SLionel Sambuc
11*44bedb31SLionel Sambucwith Ada.Unchecked_Deallocation;
12*44bedb31SLionel Sambuc
13*44bedb31SLionel Sambucpackage body ZLib.Streams is
14*44bedb31SLionel Sambuc
15*44bedb31SLionel Sambuc   -----------
16*44bedb31SLionel Sambuc   -- Close --
17*44bedb31SLionel Sambuc   -----------
18*44bedb31SLionel Sambuc
19*44bedb31SLionel Sambuc   procedure Close (Stream : in out Stream_Type) is
20*44bedb31SLionel Sambuc      procedure Free is new Ada.Unchecked_Deallocation
21*44bedb31SLionel Sambuc         (Stream_Element_Array, Buffer_Access);
22*44bedb31SLionel Sambuc   begin
23*44bedb31SLionel Sambuc      if Stream.Mode = Out_Stream or Stream.Mode = Duplex then
24*44bedb31SLionel Sambuc         --  We should flush the data written by the writer.
25*44bedb31SLionel Sambuc
26*44bedb31SLionel Sambuc         Flush (Stream, Finish);
27*44bedb31SLionel Sambuc
28*44bedb31SLionel Sambuc         Close (Stream.Writer);
29*44bedb31SLionel Sambuc      end if;
30*44bedb31SLionel Sambuc
31*44bedb31SLionel Sambuc      if Stream.Mode = In_Stream or Stream.Mode = Duplex then
32*44bedb31SLionel Sambuc         Close (Stream.Reader);
33*44bedb31SLionel Sambuc         Free (Stream.Buffer);
34*44bedb31SLionel Sambuc      end if;
35*44bedb31SLionel Sambuc   end Close;
36*44bedb31SLionel Sambuc
37*44bedb31SLionel Sambuc   ------------
38*44bedb31SLionel Sambuc   -- Create --
39*44bedb31SLionel Sambuc   ------------
40*44bedb31SLionel Sambuc
41*44bedb31SLionel Sambuc   procedure Create
42*44bedb31SLionel Sambuc     (Stream            :    out Stream_Type;
43*44bedb31SLionel Sambuc      Mode              : in     Stream_Mode;
44*44bedb31SLionel Sambuc      Back              : in     Stream_Access;
45*44bedb31SLionel Sambuc      Back_Compressed   : in     Boolean;
46*44bedb31SLionel Sambuc      Level             : in     Compression_Level := Default_Compression;
47*44bedb31SLionel Sambuc      Strategy          : in     Strategy_Type     := Default_Strategy;
48*44bedb31SLionel Sambuc      Header            : in     Header_Type       := Default;
49*44bedb31SLionel Sambuc      Read_Buffer_Size  : in     Ada.Streams.Stream_Element_Offset
50*44bedb31SLionel Sambuc                                    := Default_Buffer_Size;
51*44bedb31SLionel Sambuc      Write_Buffer_Size : in     Ada.Streams.Stream_Element_Offset
52*44bedb31SLionel Sambuc                                    := Default_Buffer_Size)
53*44bedb31SLionel Sambuc   is
54*44bedb31SLionel Sambuc
55*44bedb31SLionel Sambuc      subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size);
56*44bedb31SLionel Sambuc
57*44bedb31SLionel Sambuc      procedure Init_Filter
58*44bedb31SLionel Sambuc         (Filter   : in out Filter_Type;
59*44bedb31SLionel Sambuc          Compress : in     Boolean);
60*44bedb31SLionel Sambuc
61*44bedb31SLionel Sambuc      -----------------
62*44bedb31SLionel Sambuc      -- Init_Filter --
63*44bedb31SLionel Sambuc      -----------------
64*44bedb31SLionel Sambuc
65*44bedb31SLionel Sambuc      procedure Init_Filter
66*44bedb31SLionel Sambuc         (Filter   : in out Filter_Type;
67*44bedb31SLionel Sambuc          Compress : in     Boolean) is
68*44bedb31SLionel Sambuc      begin
69*44bedb31SLionel Sambuc         if Compress then
70*44bedb31SLionel Sambuc            Deflate_Init
71*44bedb31SLionel Sambuc              (Filter, Level, Strategy, Header => Header);
72*44bedb31SLionel Sambuc         else
73*44bedb31SLionel Sambuc            Inflate_Init (Filter, Header => Header);
74*44bedb31SLionel Sambuc         end if;
75*44bedb31SLionel Sambuc      end Init_Filter;
76*44bedb31SLionel Sambuc
77*44bedb31SLionel Sambuc   begin
78*44bedb31SLionel Sambuc      Stream.Back := Back;
79*44bedb31SLionel Sambuc      Stream.Mode := Mode;
80*44bedb31SLionel Sambuc
81*44bedb31SLionel Sambuc      if Mode = Out_Stream or Mode = Duplex then
82*44bedb31SLionel Sambuc         Init_Filter (Stream.Writer, Back_Compressed);
83*44bedb31SLionel Sambuc         Stream.Buffer_Size := Write_Buffer_Size;
84*44bedb31SLionel Sambuc      else
85*44bedb31SLionel Sambuc         Stream.Buffer_Size := 0;
86*44bedb31SLionel Sambuc      end if;
87*44bedb31SLionel Sambuc
88*44bedb31SLionel Sambuc      if Mode = In_Stream or Mode = Duplex then
89*44bedb31SLionel Sambuc         Init_Filter (Stream.Reader, not Back_Compressed);
90*44bedb31SLionel Sambuc
91*44bedb31SLionel Sambuc         Stream.Buffer     := new Buffer_Subtype;
92*44bedb31SLionel Sambuc         Stream.Rest_First := Stream.Buffer'Last + 1;
93*44bedb31SLionel Sambuc         Stream.Rest_Last  := Stream.Buffer'Last;
94*44bedb31SLionel Sambuc      end if;
95*44bedb31SLionel Sambuc   end Create;
96*44bedb31SLionel Sambuc
97*44bedb31SLionel Sambuc   -----------
98*44bedb31SLionel Sambuc   -- Flush --
99*44bedb31SLionel Sambuc   -----------
100*44bedb31SLionel Sambuc
101*44bedb31SLionel Sambuc   procedure Flush
102*44bedb31SLionel Sambuc     (Stream : in out Stream_Type;
103*44bedb31SLionel Sambuc      Mode   : in     Flush_Mode := Sync_Flush)
104*44bedb31SLionel Sambuc   is
105*44bedb31SLionel Sambuc      Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size);
106*44bedb31SLionel Sambuc      Last   : Stream_Element_Offset;
107*44bedb31SLionel Sambuc   begin
108*44bedb31SLionel Sambuc      loop
109*44bedb31SLionel Sambuc         Flush (Stream.Writer, Buffer, Last, Mode);
110*44bedb31SLionel Sambuc
111*44bedb31SLionel Sambuc         Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last));
112*44bedb31SLionel Sambuc
113*44bedb31SLionel Sambuc         exit when Last < Buffer'Last;
114*44bedb31SLionel Sambuc      end loop;
115*44bedb31SLionel Sambuc   end Flush;
116*44bedb31SLionel Sambuc
117*44bedb31SLionel Sambuc   -------------
118*44bedb31SLionel Sambuc   -- Is_Open --
119*44bedb31SLionel Sambuc   -------------
120*44bedb31SLionel Sambuc
121*44bedb31SLionel Sambuc   function Is_Open (Stream : Stream_Type) return Boolean is
122*44bedb31SLionel Sambuc   begin
123*44bedb31SLionel Sambuc      return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer);
124*44bedb31SLionel Sambuc   end Is_Open;
125*44bedb31SLionel Sambuc
126*44bedb31SLionel Sambuc   ----------
127*44bedb31SLionel Sambuc   -- Read --
128*44bedb31SLionel Sambuc   ----------
129*44bedb31SLionel Sambuc
130*44bedb31SLionel Sambuc   procedure Read
131*44bedb31SLionel Sambuc     (Stream : in out Stream_Type;
132*44bedb31SLionel Sambuc      Item   :    out Stream_Element_Array;
133*44bedb31SLionel Sambuc      Last   :    out Stream_Element_Offset)
134*44bedb31SLionel Sambuc   is
135*44bedb31SLionel Sambuc
136*44bedb31SLionel Sambuc      procedure Read
137*44bedb31SLionel Sambuc        (Item : out Stream_Element_Array;
138*44bedb31SLionel Sambuc         Last : out Stream_Element_Offset);
139*44bedb31SLionel Sambuc
140*44bedb31SLionel Sambuc      ----------
141*44bedb31SLionel Sambuc      -- Read --
142*44bedb31SLionel Sambuc      ----------
143*44bedb31SLionel Sambuc
144*44bedb31SLionel Sambuc      procedure Read
145*44bedb31SLionel Sambuc        (Item : out Stream_Element_Array;
146*44bedb31SLionel Sambuc         Last : out Stream_Element_Offset) is
147*44bedb31SLionel Sambuc      begin
148*44bedb31SLionel Sambuc         Ada.Streams.Read (Stream.Back.all, Item, Last);
149*44bedb31SLionel Sambuc      end Read;
150*44bedb31SLionel Sambuc
151*44bedb31SLionel Sambuc      procedure Read is new ZLib.Read
152*44bedb31SLionel Sambuc         (Read       => Read,
153*44bedb31SLionel Sambuc          Buffer     => Stream.Buffer.all,
154*44bedb31SLionel Sambuc          Rest_First => Stream.Rest_First,
155*44bedb31SLionel Sambuc          Rest_Last  => Stream.Rest_Last);
156*44bedb31SLionel Sambuc
157*44bedb31SLionel Sambuc   begin
158*44bedb31SLionel Sambuc      Read (Stream.Reader, Item, Last);
159*44bedb31SLionel Sambuc   end Read;
160*44bedb31SLionel Sambuc
161*44bedb31SLionel Sambuc   -------------------
162*44bedb31SLionel Sambuc   -- Read_Total_In --
163*44bedb31SLionel Sambuc   -------------------
164*44bedb31SLionel Sambuc
165*44bedb31SLionel Sambuc   function Read_Total_In (Stream : in Stream_Type) return Count is
166*44bedb31SLionel Sambuc   begin
167*44bedb31SLionel Sambuc      return Total_In (Stream.Reader);
168*44bedb31SLionel Sambuc   end Read_Total_In;
169*44bedb31SLionel Sambuc
170*44bedb31SLionel Sambuc   --------------------
171*44bedb31SLionel Sambuc   -- Read_Total_Out --
172*44bedb31SLionel Sambuc   --------------------
173*44bedb31SLionel Sambuc
174*44bedb31SLionel Sambuc   function Read_Total_Out (Stream : in Stream_Type) return Count is
175*44bedb31SLionel Sambuc   begin
176*44bedb31SLionel Sambuc      return Total_Out (Stream.Reader);
177*44bedb31SLionel Sambuc   end Read_Total_Out;
178*44bedb31SLionel Sambuc
179*44bedb31SLionel Sambuc   -----------
180*44bedb31SLionel Sambuc   -- Write --
181*44bedb31SLionel Sambuc   -----------
182*44bedb31SLionel Sambuc
183*44bedb31SLionel Sambuc   procedure Write
184*44bedb31SLionel Sambuc     (Stream : in out Stream_Type;
185*44bedb31SLionel Sambuc      Item   : in     Stream_Element_Array)
186*44bedb31SLionel Sambuc   is
187*44bedb31SLionel Sambuc
188*44bedb31SLionel Sambuc      procedure Write (Item : in Stream_Element_Array);
189*44bedb31SLionel Sambuc
190*44bedb31SLionel Sambuc      -----------
191*44bedb31SLionel Sambuc      -- Write --
192*44bedb31SLionel Sambuc      -----------
193*44bedb31SLionel Sambuc
194*44bedb31SLionel Sambuc      procedure Write (Item : in Stream_Element_Array) is
195*44bedb31SLionel Sambuc      begin
196*44bedb31SLionel Sambuc         Ada.Streams.Write (Stream.Back.all, Item);
197*44bedb31SLionel Sambuc      end Write;
198*44bedb31SLionel Sambuc
199*44bedb31SLionel Sambuc      procedure Write is new ZLib.Write
200*44bedb31SLionel Sambuc         (Write       => Write,
201*44bedb31SLionel Sambuc          Buffer_Size => Stream.Buffer_Size);
202*44bedb31SLionel Sambuc
203*44bedb31SLionel Sambuc   begin
204*44bedb31SLionel Sambuc      Write (Stream.Writer, Item, No_Flush);
205*44bedb31SLionel Sambuc   end Write;
206*44bedb31SLionel Sambuc
207*44bedb31SLionel Sambuc   --------------------
208*44bedb31SLionel Sambuc   -- Write_Total_In --
209*44bedb31SLionel Sambuc   --------------------
210*44bedb31SLionel Sambuc
211*44bedb31SLionel Sambuc   function Write_Total_In (Stream : in Stream_Type) return Count is
212*44bedb31SLionel Sambuc   begin
213*44bedb31SLionel Sambuc      return Total_In (Stream.Writer);
214*44bedb31SLionel Sambuc   end Write_Total_In;
215*44bedb31SLionel Sambuc
216*44bedb31SLionel Sambuc   ---------------------
217*44bedb31SLionel Sambuc   -- Write_Total_Out --
218*44bedb31SLionel Sambuc   ---------------------
219*44bedb31SLionel Sambuc
220*44bedb31SLionel Sambuc   function Write_Total_Out (Stream : in Stream_Type) return Count is
221*44bedb31SLionel Sambuc   begin
222*44bedb31SLionel Sambuc      return Total_Out (Stream.Writer);
223*44bedb31SLionel Sambuc   end Write_Total_Out;
224*44bedb31SLionel Sambuc
225*44bedb31SLionel Sambucend ZLib.Streams;
226