226 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Ada
		
	
	
	
	
	
		
		
			
		
	
	
			226 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; |