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