| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 | 
							- ----------------------------------------------------------------
 
- --  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;
 
 
  |