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