Home | History | Annotate | Line # | Download | only in ada
      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.3  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