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