1 ----------------------------------------------------------------
2 -- ZLib for Ada thick binding. --
4 -- Copyright (C) 2002-2003 Dmitriy Anisimkov --
6 -- Open source license information is in the zlib.ads file. --
7 ----------------------------------------------------------------
9 -- $Id: zlib-streams.adb,v 1.9 2003/08/12 13:15:31 vagul Exp $
11 with Ada.Unchecked_Deallocation;
13 package body ZLib.Streams is
19 procedure Close (Stream : in out Stream_Type) is
20 procedure Free is new Ada.Unchecked_Deallocation
21 (Stream_Element_Array, Buffer_Access);
23 if Stream.Mode = Out_Stream or Stream.Mode = Duplex then
24 -- We should flush the data written by the writer.
26 Flush (Stream, Finish);
28 Close (Stream.Writer);
31 if Stream.Mode = In_Stream or Stream.Mode = Duplex then
32 Close (Stream.Reader);
42 (Stream : out Stream_Type;
43 Mode : in Stream_Mode;
44 Back : in Stream_Access;
45 Back_Compressed : in Boolean;
46 Level : in Compression_Level := Default_Compression;
47 Strategy : in Strategy_Type := Default_Strategy;
48 Header : in Header_Type := Default;
49 Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset
50 := Default_Buffer_Size;
51 Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset
52 := Default_Buffer_Size)
55 subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size);
58 (Filter : in out Filter_Type;
59 Compress : in Boolean);
66 (Filter : in out Filter_Type;
67 Compress : in Boolean) is
71 (Filter, Level, Strategy, Header => Header);
73 Inflate_Init (Filter, Header => Header);
81 if Mode = Out_Stream or Mode = Duplex then
82 Init_Filter (Stream.Writer, Back_Compressed);
83 Stream.Buffer_Size := Write_Buffer_Size;
85 Stream.Buffer_Size := 0;
88 if Mode = In_Stream or Mode = Duplex then
89 Init_Filter (Stream.Reader, not Back_Compressed);
91 Stream.Buffer := new Buffer_Subtype;
92 Stream.Rest_First := Stream.Buffer'Last + 1;
101 (Stream : in out Stream_Type;
102 Mode : in Flush_Mode := Sync_Flush)
104 Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size);
105 Last : Stream_Element_Offset;
108 Flush (Stream.Writer, Buffer, Last, Mode);
110 Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last));
112 exit when Last < Buffer'Last;
121 (Stream : in out Stream_Type;
122 Item : out Stream_Element_Array;
123 Last : out Stream_Element_Offset)
127 (Item : out Stream_Element_Array;
128 Last : out Stream_Element_Offset);
135 (Item : out Stream_Element_Array;
136 Last : out Stream_Element_Offset) is
138 Ada.Streams.Read (Stream.Back.all, Item, Last);
141 procedure Read is new ZLib.Read
143 Buffer => Stream.Buffer.all,
144 Rest_First => Stream.Rest_First,
145 Rest_Last => Stream.Rest_Last);
148 Read (Stream.Reader, Item, Last);
155 function Read_Total_In (Stream : in Stream_Type) return Count is
157 return Total_In (Stream.Reader);
164 function Read_Total_Out (Stream : in Stream_Type) return Count is
166 return Total_Out (Stream.Reader);
174 (Stream : in out Stream_Type;
175 Item : in Stream_Element_Array)
178 procedure Write (Item : in Stream_Element_Array);
184 procedure Write (Item : in Stream_Element_Array) is
186 Ada.Streams.Write (Stream.Back.all, Item);
189 procedure Write is new ZLib.Write
191 Buffer_Size => Stream.Buffer_Size);
194 Write (Stream.Writer, Item, No_Flush);
201 function Write_Total_In (Stream : in Stream_Type) return Count is
203 return Total_In (Stream.Writer);
206 ---------------------
207 -- Write_Total_Out --
208 ---------------------
210 function Write_Total_Out (Stream : in Stream_Type) return Count is
212 return Total_Out (Stream.Writer);