Home | History | Annotate | Line # | Download | only in ada
zlib-streams.adb revision 1.1.1.1.76.1
      1           1.1  christos ----------------------------------------------------------------
      2           1.1  christos --  ZLib for Ada thick binding.                               --
      3           1.1  christos --                                                            --
      4           1.1  christos --  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
      5           1.1  christos --                                                            --
      6           1.1  christos --  Open source license information is in the zlib.ads file.  --
      7           1.1  christos ----------------------------------------------------------------
      8           1.1  christos 
      9  1.1.1.1.76.1  pgoyette --  $Id: zlib-streams.adb,v 1.1.1.1.76.1 2017/03/20 06:51:33 pgoyette Exp $
     10           1.1  christos 
     11           1.1  christos with Ada.Unchecked_Deallocation;
     12           1.1  christos 
     13           1.1  christos package body ZLib.Streams is
     14           1.1  christos 
     15           1.1  christos    -----------
     16           1.1  christos    -- Close --
     17           1.1  christos    -----------
     18           1.1  christos 
     19           1.1  christos    procedure Close (Stream : in out Stream_Type) is
     20           1.1  christos       procedure Free is new Ada.Unchecked_Deallocation
     21           1.1  christos          (Stream_Element_Array, Buffer_Access);
     22           1.1  christos    begin
     23           1.1  christos       if Stream.Mode = Out_Stream or Stream.Mode = Duplex then
     24           1.1  christos          --  We should flush the data written by the writer.
     25           1.1  christos 
     26           1.1  christos          Flush (Stream, Finish);
     27           1.1  christos 
     28           1.1  christos          Close (Stream.Writer);
     29           1.1  christos       end if;
     30           1.1  christos 
     31           1.1  christos       if Stream.Mode = In_Stream or Stream.Mode = Duplex then
     32           1.1  christos          Close (Stream.Reader);
     33           1.1  christos          Free (Stream.Buffer);
     34           1.1  christos       end if;
     35           1.1  christos    end Close;
     36           1.1  christos 
     37           1.1  christos    ------------
     38           1.1  christos    -- Create --
     39           1.1  christos    ------------
     40           1.1  christos 
     41           1.1  christos    procedure Create
     42           1.1  christos      (Stream            :    out Stream_Type;
     43           1.1  christos       Mode              : in     Stream_Mode;
     44           1.1  christos       Back              : in     Stream_Access;
     45           1.1  christos       Back_Compressed   : in     Boolean;
     46           1.1  christos       Level             : in     Compression_Level := Default_Compression;
     47           1.1  christos       Strategy          : in     Strategy_Type     := Default_Strategy;
     48           1.1  christos       Header            : in     Header_Type       := Default;
     49           1.1  christos       Read_Buffer_Size  : in     Ada.Streams.Stream_Element_Offset
     50           1.1  christos                                     := Default_Buffer_Size;
     51           1.1  christos       Write_Buffer_Size : in     Ada.Streams.Stream_Element_Offset
     52           1.1  christos                                     := Default_Buffer_Size)
     53           1.1  christos    is
     54           1.1  christos 
     55           1.1  christos       subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size);
     56           1.1  christos 
     57           1.1  christos       procedure Init_Filter
     58           1.1  christos          (Filter   : in out Filter_Type;
     59           1.1  christos           Compress : in     Boolean);
     60           1.1  christos 
     61           1.1  christos       -----------------
     62           1.1  christos       -- Init_Filter --
     63           1.1  christos       -----------------
     64           1.1  christos 
     65           1.1  christos       procedure Init_Filter
     66           1.1  christos          (Filter   : in out Filter_Type;
     67           1.1  christos           Compress : in     Boolean) is
     68           1.1  christos       begin
     69           1.1  christos          if Compress then
     70           1.1  christos             Deflate_Init
     71           1.1  christos               (Filter, Level, Strategy, Header => Header);
     72           1.1  christos          else
     73           1.1  christos             Inflate_Init (Filter, Header => Header);
     74           1.1  christos          end if;
     75           1.1  christos       end Init_Filter;
     76           1.1  christos 
     77           1.1  christos    begin
     78           1.1  christos       Stream.Back := Back;
     79           1.1  christos       Stream.Mode := Mode;
     80           1.1  christos 
     81           1.1  christos       if Mode = Out_Stream or Mode = Duplex then
     82           1.1  christos          Init_Filter (Stream.Writer, Back_Compressed);
     83           1.1  christos          Stream.Buffer_Size := Write_Buffer_Size;
     84           1.1  christos       else
     85           1.1  christos          Stream.Buffer_Size := 0;
     86           1.1  christos       end if;
     87           1.1  christos 
     88           1.1  christos       if Mode = In_Stream or Mode = Duplex then
     89           1.1  christos          Init_Filter (Stream.Reader, not Back_Compressed);
     90           1.1  christos 
     91           1.1  christos          Stream.Buffer     := new Buffer_Subtype;
     92           1.1  christos          Stream.Rest_First := Stream.Buffer'Last + 1;
     93           1.1  christos          Stream.Rest_Last  := Stream.Buffer'Last;
     94           1.1  christos       end if;
     95           1.1  christos    end Create;
     96           1.1  christos 
     97           1.1  christos    -----------
     98           1.1  christos    -- Flush --
     99           1.1  christos    -----------
    100           1.1  christos 
    101           1.1  christos    procedure Flush
    102           1.1  christos      (Stream : in out Stream_Type;
    103           1.1  christos       Mode   : in     Flush_Mode := Sync_Flush)
    104           1.1  christos    is
    105           1.1  christos       Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size);
    106           1.1  christos       Last   : Stream_Element_Offset;
    107           1.1  christos    begin
    108           1.1  christos       loop
    109           1.1  christos          Flush (Stream.Writer, Buffer, Last, Mode);
    110           1.1  christos 
    111           1.1  christos          Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last));
    112           1.1  christos 
    113           1.1  christos          exit when Last < Buffer'Last;
    114           1.1  christos       end loop;
    115           1.1  christos    end Flush;
    116           1.1  christos 
    117           1.1  christos    -------------
    118           1.1  christos    -- Is_Open --
    119           1.1  christos    -------------
    120           1.1  christos 
    121           1.1  christos    function Is_Open (Stream : Stream_Type) return Boolean is
    122           1.1  christos    begin
    123           1.1  christos       return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer);
    124           1.1  christos    end Is_Open;
    125           1.1  christos 
    126           1.1  christos    ----------
    127           1.1  christos    -- Read --
    128           1.1  christos    ----------
    129           1.1  christos 
    130           1.1  christos    procedure Read
    131           1.1  christos      (Stream : in out Stream_Type;
    132           1.1  christos       Item   :    out Stream_Element_Array;
    133           1.1  christos       Last   :    out Stream_Element_Offset)
    134           1.1  christos    is
    135           1.1  christos 
    136           1.1  christos       procedure Read
    137           1.1  christos         (Item : out Stream_Element_Array;
    138           1.1  christos          Last : out Stream_Element_Offset);
    139           1.1  christos 
    140           1.1  christos       ----------
    141           1.1  christos       -- Read --
    142           1.1  christos       ----------
    143           1.1  christos 
    144           1.1  christos       procedure Read
    145           1.1  christos         (Item : out Stream_Element_Array;
    146           1.1  christos          Last : out Stream_Element_Offset) is
    147           1.1  christos       begin
    148           1.1  christos          Ada.Streams.Read (Stream.Back.all, Item, Last);
    149           1.1  christos       end Read;
    150           1.1  christos 
    151           1.1  christos       procedure Read is new ZLib.Read
    152           1.1  christos          (Read       => Read,
    153           1.1  christos           Buffer     => Stream.Buffer.all,
    154           1.1  christos           Rest_First => Stream.Rest_First,
    155           1.1  christos           Rest_Last  => Stream.Rest_Last);
    156           1.1  christos 
    157           1.1  christos    begin
    158           1.1  christos       Read (Stream.Reader, Item, Last);
    159           1.1  christos    end Read;
    160           1.1  christos 
    161           1.1  christos    -------------------
    162           1.1  christos    -- Read_Total_In --
    163           1.1  christos    -------------------
    164           1.1  christos 
    165           1.1  christos    function Read_Total_In (Stream : in Stream_Type) return Count is
    166           1.1  christos    begin
    167           1.1  christos       return Total_In (Stream.Reader);
    168           1.1  christos    end Read_Total_In;
    169           1.1  christos 
    170           1.1  christos    --------------------
    171           1.1  christos    -- Read_Total_Out --
    172           1.1  christos    --------------------
    173           1.1  christos 
    174           1.1  christos    function Read_Total_Out (Stream : in Stream_Type) return Count is
    175           1.1  christos    begin
    176           1.1  christos       return Total_Out (Stream.Reader);
    177           1.1  christos    end Read_Total_Out;
    178           1.1  christos 
    179           1.1  christos    -----------
    180           1.1  christos    -- Write --
    181           1.1  christos    -----------
    182           1.1  christos 
    183           1.1  christos    procedure Write
    184           1.1  christos      (Stream : in out Stream_Type;
    185           1.1  christos       Item   : in     Stream_Element_Array)
    186           1.1  christos    is
    187           1.1  christos 
    188           1.1  christos       procedure Write (Item : in Stream_Element_Array);
    189           1.1  christos 
    190           1.1  christos       -----------
    191           1.1  christos       -- Write --
    192           1.1  christos       -----------
    193           1.1  christos 
    194           1.1  christos       procedure Write (Item : in Stream_Element_Array) is
    195           1.1  christos       begin
    196           1.1  christos          Ada.Streams.Write (Stream.Back.all, Item);
    197           1.1  christos       end Write;
    198           1.1  christos 
    199           1.1  christos       procedure Write is new ZLib.Write
    200           1.1  christos          (Write       => Write,
    201           1.1  christos           Buffer_Size => Stream.Buffer_Size);
    202           1.1  christos 
    203           1.1  christos    begin
    204           1.1  christos       Write (Stream.Writer, Item, No_Flush);
    205           1.1  christos    end Write;
    206           1.1  christos 
    207           1.1  christos    --------------------
    208           1.1  christos    -- Write_Total_In --
    209           1.1  christos    --------------------
    210           1.1  christos 
    211           1.1  christos    function Write_Total_In (Stream : in Stream_Type) return Count is
    212           1.1  christos    begin
    213           1.1  christos       return Total_In (Stream.Writer);
    214           1.1  christos    end Write_Total_In;
    215           1.1  christos 
    216           1.1  christos    ---------------------
    217           1.1  christos    -- Write_Total_Out --
    218           1.1  christos    ---------------------
    219           1.1  christos 
    220           1.1  christos    function Write_Total_Out (Stream : in Stream_Type) return Count is
    221           1.1  christos    begin
    222           1.1  christos       return Total_Out (Stream.Writer);
    223           1.1  christos    end Write_Total_Out;
    224           1.1  christos 
    225           1.1  christos end ZLib.Streams;
    226