Home | History | Annotate | Line # | Download | only in ada
zlib-streams.adb revision 1.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  christos --  Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul 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