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