Chris@4: ---------------------------------------------------------------- Chris@4: -- ZLib for Ada thick binding. -- Chris@4: -- -- Chris@4: -- Copyright (C) 2002-2003 Dmitriy Anisimkov -- Chris@4: -- -- Chris@4: -- Open source license information is in the zlib.ads file. -- Chris@4: ---------------------------------------------------------------- Chris@4: Chris@4: -- $Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp $ Chris@4: Chris@4: with Ada.Unchecked_Deallocation; Chris@4: Chris@4: package body ZLib.Streams is Chris@4: Chris@4: ----------- Chris@4: -- Close -- Chris@4: ----------- Chris@4: Chris@4: procedure Close (Stream : in out Stream_Type) is Chris@4: procedure Free is new Ada.Unchecked_Deallocation Chris@4: (Stream_Element_Array, Buffer_Access); Chris@4: begin Chris@4: if Stream.Mode = Out_Stream or Stream.Mode = Duplex then Chris@4: -- We should flush the data written by the writer. Chris@4: Chris@4: Flush (Stream, Finish); Chris@4: Chris@4: Close (Stream.Writer); Chris@4: end if; Chris@4: Chris@4: if Stream.Mode = In_Stream or Stream.Mode = Duplex then Chris@4: Close (Stream.Reader); Chris@4: Free (Stream.Buffer); Chris@4: end if; Chris@4: end Close; Chris@4: Chris@4: ------------ Chris@4: -- Create -- Chris@4: ------------ Chris@4: Chris@4: procedure Create Chris@4: (Stream : out Stream_Type; Chris@4: Mode : in Stream_Mode; Chris@4: Back : in Stream_Access; Chris@4: Back_Compressed : in Boolean; Chris@4: Level : in Compression_Level := Default_Compression; Chris@4: Strategy : in Strategy_Type := Default_Strategy; Chris@4: Header : in Header_Type := Default; Chris@4: Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset Chris@4: := Default_Buffer_Size; Chris@4: Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset Chris@4: := Default_Buffer_Size) Chris@4: is Chris@4: Chris@4: subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size); Chris@4: Chris@4: procedure Init_Filter Chris@4: (Filter : in out Filter_Type; Chris@4: Compress : in Boolean); Chris@4: Chris@4: ----------------- Chris@4: -- Init_Filter -- Chris@4: ----------------- Chris@4: Chris@4: procedure Init_Filter Chris@4: (Filter : in out Filter_Type; Chris@4: Compress : in Boolean) is Chris@4: begin Chris@4: if Compress then Chris@4: Deflate_Init Chris@4: (Filter, Level, Strategy, Header => Header); Chris@4: else Chris@4: Inflate_Init (Filter, Header => Header); Chris@4: end if; Chris@4: end Init_Filter; Chris@4: Chris@4: begin Chris@4: Stream.Back := Back; Chris@4: Stream.Mode := Mode; Chris@4: Chris@4: if Mode = Out_Stream or Mode = Duplex then Chris@4: Init_Filter (Stream.Writer, Back_Compressed); Chris@4: Stream.Buffer_Size := Write_Buffer_Size; Chris@4: else Chris@4: Stream.Buffer_Size := 0; Chris@4: end if; Chris@4: Chris@4: if Mode = In_Stream or Mode = Duplex then Chris@4: Init_Filter (Stream.Reader, not Back_Compressed); Chris@4: Chris@4: Stream.Buffer := new Buffer_Subtype; Chris@4: Stream.Rest_First := Stream.Buffer'Last + 1; Chris@4: Stream.Rest_Last := Stream.Buffer'Last; Chris@4: end if; Chris@4: end Create; Chris@4: Chris@4: ----------- Chris@4: -- Flush -- Chris@4: ----------- Chris@4: Chris@4: procedure Flush Chris@4: (Stream : in out Stream_Type; Chris@4: Mode : in Flush_Mode := Sync_Flush) Chris@4: is Chris@4: Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size); Chris@4: Last : Stream_Element_Offset; Chris@4: begin Chris@4: loop Chris@4: Flush (Stream.Writer, Buffer, Last, Mode); Chris@4: Chris@4: Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last)); Chris@4: Chris@4: exit when Last < Buffer'Last; Chris@4: end loop; Chris@4: end Flush; Chris@4: Chris@4: ------------- Chris@4: -- Is_Open -- Chris@4: ------------- Chris@4: Chris@4: function Is_Open (Stream : Stream_Type) return Boolean is Chris@4: begin Chris@4: return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer); Chris@4: end Is_Open; Chris@4: Chris@4: ---------- Chris@4: -- Read -- Chris@4: ---------- Chris@4: Chris@4: procedure Read Chris@4: (Stream : in out Stream_Type; Chris@4: Item : out Stream_Element_Array; Chris@4: Last : out Stream_Element_Offset) Chris@4: is Chris@4: Chris@4: procedure Read Chris@4: (Item : out Stream_Element_Array; Chris@4: Last : out Stream_Element_Offset); Chris@4: Chris@4: ---------- Chris@4: -- Read -- Chris@4: ---------- Chris@4: Chris@4: procedure Read Chris@4: (Item : out Stream_Element_Array; Chris@4: Last : out Stream_Element_Offset) is Chris@4: begin Chris@4: Ada.Streams.Read (Stream.Back.all, Item, Last); Chris@4: end Read; Chris@4: Chris@4: procedure Read is new ZLib.Read Chris@4: (Read => Read, Chris@4: Buffer => Stream.Buffer.all, Chris@4: Rest_First => Stream.Rest_First, Chris@4: Rest_Last => Stream.Rest_Last); Chris@4: Chris@4: begin Chris@4: Read (Stream.Reader, Item, Last); Chris@4: end Read; Chris@4: Chris@4: ------------------- Chris@4: -- Read_Total_In -- Chris@4: ------------------- Chris@4: Chris@4: function Read_Total_In (Stream : in Stream_Type) return Count is Chris@4: begin Chris@4: return Total_In (Stream.Reader); Chris@4: end Read_Total_In; Chris@4: Chris@4: -------------------- Chris@4: -- Read_Total_Out -- Chris@4: -------------------- Chris@4: Chris@4: function Read_Total_Out (Stream : in Stream_Type) return Count is Chris@4: begin Chris@4: return Total_Out (Stream.Reader); Chris@4: end Read_Total_Out; Chris@4: Chris@4: ----------- Chris@4: -- Write -- Chris@4: ----------- Chris@4: Chris@4: procedure Write Chris@4: (Stream : in out Stream_Type; Chris@4: Item : in Stream_Element_Array) Chris@4: is Chris@4: Chris@4: procedure Write (Item : in Stream_Element_Array); Chris@4: Chris@4: ----------- Chris@4: -- Write -- Chris@4: ----------- Chris@4: Chris@4: procedure Write (Item : in Stream_Element_Array) is Chris@4: begin Chris@4: Ada.Streams.Write (Stream.Back.all, Item); Chris@4: end Write; Chris@4: Chris@4: procedure Write is new ZLib.Write Chris@4: (Write => Write, Chris@4: Buffer_Size => Stream.Buffer_Size); Chris@4: Chris@4: begin Chris@4: Write (Stream.Writer, Item, No_Flush); Chris@4: end Write; Chris@4: Chris@4: -------------------- Chris@4: -- Write_Total_In -- Chris@4: -------------------- Chris@4: Chris@4: function Write_Total_In (Stream : in Stream_Type) return Count is Chris@4: begin Chris@4: return Total_In (Stream.Writer); Chris@4: end Write_Total_In; Chris@4: Chris@4: --------------------- Chris@4: -- Write_Total_Out -- Chris@4: --------------------- Chris@4: Chris@4: function Write_Total_Out (Stream : in Stream_Type) return Count is Chris@4: begin Chris@4: return Total_Out (Stream.Writer); Chris@4: end Write_Total_Out; Chris@4: Chris@4: end ZLib.Streams;