mirror of
https://github.com/tildearrow/furnace.git
synced 2024-12-04 18:27:25 +00:00
225 lines
5.9 KiB
Ada
225 lines
5.9 KiB
Ada
----------------------------------------------------------------
|
|
-- 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;
|