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