You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
5.9 KiB
225 lines
5.9 KiB
---------------------------------------------------------------- |
|
-- ZLib for Ada thick binding. -- |
|
-- -- |
|
-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- |
|
-- -- |
|
-- Open source license information is in the zlib.ads file. -- |
|
---------------------------------------------------------------- |
|
|
|
-- $Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp $ |
|
|
|
with Ada.Unchecked_Deallocation; |
|
|
|
package body ZLib.Streams is |
|
|
|
----------- |
|
-- Close -- |
|
----------- |
|
|
|
procedure Close (Stream : in out Stream_Type) is |
|
procedure Free is new Ada.Unchecked_Deallocation |
|
(Stream_Element_Array, Buffer_Access); |
|
begin |
|
if Stream.Mode = Out_Stream or Stream.Mode = Duplex then |
|
-- We should flush the data written by the writer. |
|
|
|
Flush (Stream, Finish); |
|
|
|
Close (Stream.Writer); |
|
end if; |
|
|
|
if Stream.Mode = In_Stream or Stream.Mode = Duplex then |
|
Close (Stream.Reader); |
|
Free (Stream.Buffer); |
|
end if; |
|
end Close; |
|
|
|
------------ |
|
-- Create -- |
|
------------ |
|
|
|
procedure Create |
|
(Stream : out Stream_Type; |
|
Mode : in Stream_Mode; |
|
Back : in Stream_Access; |
|
Back_Compressed : in Boolean; |
|
Level : in Compression_Level := Default_Compression; |
|
Strategy : in Strategy_Type := Default_Strategy; |
|
Header : in Header_Type := Default; |
|
Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset |
|
:= Default_Buffer_Size; |
|
Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset |
|
:= Default_Buffer_Size) |
|
is |
|
|
|
subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size); |
|
|
|
procedure Init_Filter |
|
(Filter : in out Filter_Type; |
|
Compress : in Boolean); |
|
|
|
----------------- |
|
-- Init_Filter -- |
|
----------------- |
|
|
|
procedure Init_Filter |
|
(Filter : in out Filter_Type; |
|
Compress : in Boolean) is |
|
begin |
|
if Compress then |
|
Deflate_Init |
|
(Filter, Level, Strategy, Header => Header); |
|
else |
|
Inflate_Init (Filter, Header => Header); |
|
end if; |
|
end Init_Filter; |
|
|
|
begin |
|
Stream.Back := Back; |
|
Stream.Mode := Mode; |
|
|
|
if Mode = Out_Stream or Mode = Duplex then |
|
Init_Filter (Stream.Writer, Back_Compressed); |
|
Stream.Buffer_Size := Write_Buffer_Size; |
|
else |
|
Stream.Buffer_Size := 0; |
|
end if; |
|
|
|
if Mode = In_Stream or Mode = Duplex then |
|
Init_Filter (Stream.Reader, not Back_Compressed); |
|
|
|
Stream.Buffer := new Buffer_Subtype; |
|
Stream.Rest_First := Stream.Buffer'Last + 1; |
|
Stream.Rest_Last := Stream.Buffer'Last; |
|
end if; |
|
end Create; |
|
|
|
----------- |
|
-- Flush -- |
|
----------- |
|
|
|
procedure Flush |
|
(Stream : in out Stream_Type; |
|
Mode : in Flush_Mode := Sync_Flush) |
|
is |
|
Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size); |
|
Last : Stream_Element_Offset; |
|
begin |
|
loop |
|
Flush (Stream.Writer, Buffer, Last, Mode); |
|
|
|
Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last)); |
|
|
|
exit when Last < Buffer'Last; |
|
end loop; |
|
end Flush; |
|
|
|
------------- |
|
-- Is_Open -- |
|
------------- |
|
|
|
function Is_Open (Stream : Stream_Type) return Boolean is |
|
begin |
|
return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer); |
|
end Is_Open; |
|
|
|
---------- |
|
-- Read -- |
|
---------- |
|
|
|
procedure Read |
|
(Stream : in out Stream_Type; |
|
Item : out Stream_Element_Array; |
|
Last : out Stream_Element_Offset) |
|
is |
|
|
|
procedure Read |
|
(Item : out Stream_Element_Array; |
|
Last : out Stream_Element_Offset); |
|
|
|
---------- |
|
-- Read -- |
|
---------- |
|
|
|
procedure Read |
|
(Item : out Stream_Element_Array; |
|
Last : out Stream_Element_Offset) is |
|
begin |
|
Ada.Streams.Read (Stream.Back.all, Item, Last); |
|
end Read; |
|
|
|
procedure Read is new ZLib.Read |
|
(Read => Read, |
|
Buffer => Stream.Buffer.all, |
|
Rest_First => Stream.Rest_First, |
|
Rest_Last => Stream.Rest_Last); |
|
|
|
begin |
|
Read (Stream.Reader, Item, Last); |
|
end Read; |
|
|
|
------------------- |
|
-- Read_Total_In -- |
|
------------------- |
|
|
|
function Read_Total_In (Stream : in Stream_Type) return Count is |
|
begin |
|
return Total_In (Stream.Reader); |
|
end Read_Total_In; |
|
|
|
-------------------- |
|
-- Read_Total_Out -- |
|
-------------------- |
|
|
|
function Read_Total_Out (Stream : in Stream_Type) return Count is |
|
begin |
|
return Total_Out (Stream.Reader); |
|
end Read_Total_Out; |
|
|
|
----------- |
|
-- Write -- |
|
----------- |
|
|
|
procedure Write |
|
(Stream : in out Stream_Type; |
|
Item : in Stream_Element_Array) |
|
is |
|
|
|
procedure Write (Item : in Stream_Element_Array); |
|
|
|
----------- |
|
-- Write -- |
|
----------- |
|
|
|
procedure Write (Item : in Stream_Element_Array) is |
|
begin |
|
Ada.Streams.Write (Stream.Back.all, Item); |
|
end Write; |
|
|
|
procedure Write is new ZLib.Write |
|
(Write => Write, |
|
Buffer_Size => Stream.Buffer_Size); |
|
|
|
begin |
|
Write (Stream.Writer, Item, No_Flush); |
|
end Write; |
|
|
|
-------------------- |
|
-- Write_Total_In -- |
|
-------------------- |
|
|
|
function Write_Total_In (Stream : in Stream_Type) return Count is |
|
begin |
|
return Total_In (Stream.Writer); |
|
end Write_Total_In; |
|
|
|
--------------------- |
|
-- Write_Total_Out -- |
|
--------------------- |
|
|
|
function Write_Total_Out (Stream : in Stream_Type) return Count is |
|
begin |
|
return Total_Out (Stream.Writer); |
|
end Write_Total_Out; |
|
|
|
end ZLib.Streams;
|
|
|