1b33c96954667ba382fa595baf7b31290bfdd517vboxsync----------------------------------------------------------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync-- ZLib for Ada thick binding. --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync-- --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync-- Copyright (C) 2002-2004 Dmitriy Anisimkov --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync-- --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync-- Open source license information is in the zlib.ads file. --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync----------------------------------------------------------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync-- $Id$
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncwith Ada.Exceptions;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncwith Ada.Unchecked_Conversion;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncwith Ada.Unchecked_Deallocation;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncwith Interfaces.C.Strings;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncwith ZLib.Thin;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncpackage body ZLib is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync use type Thin.Int;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync type Z_Stream is new Thin.Z_Stream;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync type Return_Code_Enum is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (OK,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync STREAM_END,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync NEED_DICT,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ERRNO,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync STREAM_ERROR,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DATA_ERROR,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync MEM_ERROR,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync BUF_ERROR,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync VERSION_ERROR);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync type Flate_Step_Function is access
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function (Strm : in Thin.Z_Streamp; Flush : in Thin.Int) return Thin.Int;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync pragma Convention (C, Flate_Step_Function);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync type Flate_End_Function is access
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function (Ctrm : in Thin.Z_Streamp) return Thin.Int;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync pragma Convention (C, Flate_End_Function);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync type Flate_Type is record
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Step : Flate_Step_Function;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Done : Flate_End_Function;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end record;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync subtype Footer_Array is Stream_Element_Array (1 .. 8);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Simple_GZip_Header : constant Stream_Element_Array (1 .. 10)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync := (16#1f#, 16#8b#, -- Magic header
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 16#08#, -- Z_DEFLATED
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 16#00#, -- Flags
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 16#00#, 16#00#, 16#00#, 16#00#, -- Time
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 16#00#, -- XFlags
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 16#03# -- OS code
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync );
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- The simplest gzip header is not for informational, but just for
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- gzip format compatibility.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Note that some code below is using assumption
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Simple_GZip_Header'Last > Footer_Array'Last, so do not make
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Simple_GZip_Header'Last <= Footer_Array'Last.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Return_Code : constant array (Thin.Int range <>) of Return_Code_Enum
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync := (0 => OK,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 1 => STREAM_END,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 2 => NEED_DICT,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -1 => ERRNO,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -2 => STREAM_ERROR,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -3 => DATA_ERROR,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -4 => MEM_ERROR,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -5 => BUF_ERROR,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -6 => VERSION_ERROR);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flate : constant array (Boolean) of Flate_Type
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync := (True => (Step => Thin.Deflate'Access,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Done => Thin.DeflateEnd'Access),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync False => (Step => Thin.Inflate'Access,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Done => Thin.InflateEnd'Access));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush_Finish : constant array (Boolean) of Flush_Mode
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync := (True => Finish, False => No_Flush);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Raise_Error (Stream : in Z_Stream);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync pragma Inline (Raise_Error);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Raise_Error (Message : in String);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync pragma Inline (Raise_Error);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Free is new Ada.Unchecked_Deallocation
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Z_Stream, Z_Stream_Access);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function To_Thin_Access is new Ada.Unchecked_Conversion
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Z_Stream_Access, Thin.Z_Streamp);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Translate_GZip
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter : in out Filter_Type;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Data : in Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last : out Ada.Streams.Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data : out Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last : out Ada.Streams.Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush : in Flush_Mode);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Separate translate routine for make gzip header.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Translate_Auto
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter : in out Filter_Type;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Data : in Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last : out Ada.Streams.Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data : out Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last : out Ada.Streams.Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush : in Flush_Mode);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- translate routine without additional headers.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Check_Error --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int) is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync use type Thin.Int;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Code /= Thin.Z_OK then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Raise_Error
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Return_Code_Enum'Image (Return_Code (Code))
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync & ": " & Last_Error_Message (Stream));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Check_Error;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Close --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Close
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter : in out Filter_Type;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Ignore_Error : in Boolean := False)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Code : Thin.Int;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if not Ignore_Error and then not Is_Open (Filter) then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise Status_Error;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Code := Flate (Filter.Compression).Done (To_Thin_Access (Filter.Strm));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Ignore_Error or else Code = Thin.Z_OK then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Free (Filter.Strm);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync else
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync declare
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Error_Message : constant String
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync := Last_Error_Message (Filter.Strm.all);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Free (Filter.Strm);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Ada.Exceptions.Raise_Exception
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (ZLib_Error'Identity,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Return_Code_Enum'Image (Return_Code (Code))
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync & ": " & Error_Message);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Close;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- CRC32 --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function CRC32
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (CRC : in Unsigned_32;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data : in Ada.Streams.Stream_Element_Array)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync return Unsigned_32
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync use Thin;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync return Unsigned_32 (crc32 (ULong (CRC),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data'Address,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data'Length));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end CRC32;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure CRC32
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (CRC : in out Unsigned_32;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data : in Ada.Streams.Stream_Element_Array) is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync CRC := CRC32 (CRC, Data);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end CRC32;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ------------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Deflate_Init --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ------------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Deflate_Init
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter : in out Filter_Type;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Level : in Compression_Level := Default_Compression;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Strategy : in Strategy_Type := Default_Strategy;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Method : in Compression_Method := Deflated;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Window_Bits : in Window_Bits_Type := Default_Window_Bits;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Memory_Level : in Memory_Level_Type := Default_Memory_Level;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Header : in Header_Type := Default)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync use type Thin.Int;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Win_Bits : Thin.Int := Thin.Int (Window_Bits);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Is_Open (Filter) then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise Status_Error;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- We allow ZLib to make header only in case of default header type.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Otherwise we would either do header by ourselfs, or do not do
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- header at all.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Header = None or else Header = GZip then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Win_Bits := -Win_Bits;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- For the GZip CRC calculation and make headers.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Header = GZip then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.CRC := 0;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.Offset := Simple_GZip_Header'First;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync else
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.Offset := Simple_GZip_Header'Last + 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.Strm := new Z_Stream;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.Compression := True;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.Stream_End := False;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.Header := Header;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Thin.Deflate_Init
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (To_Thin_Access (Filter.Strm),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Level => Thin.Int (Level),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync method => Thin.Int (Method),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync windowBits => Win_Bits,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync memLevel => Thin.Int (Memory_Level),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strategy => Thin.Int (Strategy)) /= Thin.Z_OK
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Raise_Error (Filter.Strm.all);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Deflate_Init;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Flush --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Flush
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter : in out Filter_Type;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data : out Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last : out Ada.Streams.Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush : in Flush_Mode)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync No_Data : Stream_Element_Array := (1 .. 0 => 0);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Last : Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Translate (Filter, No_Data, Last, Out_Data, Out_Last, Flush);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Flush;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Generic_Translate --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Generic_Translate
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter : in out ZLib.Filter_Type;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Buffer_Size : in Integer := Default_Buffer_Size;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Buffer_Size : in Integer := Default_Buffer_Size)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Buffer : Stream_Element_Array
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (1 .. Stream_Element_Offset (In_Buffer_Size));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Buffer : Stream_Element_Array
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (1 .. Stream_Element_Offset (Out_Buffer_Size));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Last : Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last : Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_First : Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last : Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Main : loop
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data_In (In_Buffer, Last);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_First := In_Buffer'First;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync loop
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Translate
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter => Filter,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Data => In_Buffer (In_First .. Last),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last => In_Last,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data => Out_Buffer,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last => Out_Last,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush => Flush_Finish (Last < In_Buffer'First));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Out_Buffer'First <= Out_Last then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data_Out (Out_Buffer (Out_Buffer'First .. Out_Last));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync exit Main when Stream_End (Filter);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- The end of in buffer.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync exit when In_Last = Last;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_First := In_Last + 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end loop;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end loop Main;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Generic_Translate;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ------------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Inflate_Init --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ------------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Inflate_Init
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter : in out Filter_Type;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Window_Bits : in Window_Bits_Type := Default_Window_Bits;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Header : in Header_Type := Default)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync use type Thin.Int;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Win_Bits : Thin.Int := Thin.Int (Window_Bits);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Check_Version;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Check the latest header types compatibility.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Check_Version is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Version <= "1.1.4" then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Raise_Error
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ("Inflate header type " & Header_Type'Image (Header)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync & " incompatible with ZLib version " & Version);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Check_Version;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Is_Open (Filter) then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise Status_Error;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync case Header is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync when None =>
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Check_Version;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Inflate data without headers determined
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- by negative Win_Bits.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Win_Bits := -Win_Bits;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync when GZip =>
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Check_Version;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Inflate gzip data defined by flag 16.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Win_Bits := Win_Bits + 16;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync when Auto =>
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Check_Version;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Inflate with automatic detection
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- of gzip or native header defined by flag 32.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Win_Bits := Win_Bits + 32;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync when Default => null;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end case;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.Strm := new Z_Stream;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.Compression := False;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.Stream_End := False;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.Header := Header;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Thin.Inflate_Init
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (To_Thin_Access (Filter.Strm), Win_Bits) /= Thin.Z_OK
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Raise_Error (Filter.Strm.all);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Inflate_Init;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Is_Open --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function Is_Open (Filter : in Filter_Type) return Boolean is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync return Filter.Strm /= null;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Is_Open;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Raise_Error --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Raise_Error (Message : in String) is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Ada.Exceptions.Raise_Exception (ZLib_Error'Identity, Message);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Raise_Error;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Raise_Error (Stream : in Z_Stream) is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Raise_Error (Last_Error_Message (Stream));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Raise_Error;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ----------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Read --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ----------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Read
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter : in out Filter_Type;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Item : out Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Last : out Ada.Streams.Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush : in Flush_Mode := No_Flush)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last : Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Item_First : Ada.Streams.Stream_Element_Offset := Item'First;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync V_Flush : Flush_Mode := Flush;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync pragma Assert (Rest_First in Buffer'First .. Buffer'Last + 1);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync pragma Assert (Rest_Last in Buffer'First - 1 .. Buffer'Last);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync loop
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Rest_Last = Buffer'First - 1 then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync V_Flush := Finish;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync elsif Rest_First > Rest_Last then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Read (Buffer, Rest_Last);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Rest_First := Buffer'First;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Rest_Last < Buffer'First then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync V_Flush := Finish;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Translate
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter => Filter,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Data => Buffer (Rest_First .. Rest_Last),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last => In_Last,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data => Item (Item_First .. Item'Last),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last => Last,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush => V_Flush);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Rest_First := In_Last + 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync exit when Stream_End (Filter)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync or else Last = Item'Last
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync or else (Last >= Item'First and then Allow_Read_Some);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Item_First := Last + 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end loop;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Read;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ----------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Stream_End --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ----------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function Stream_End (Filter : in Filter_Type) return Boolean is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Filter.Header = GZip and Filter.Compression then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync return Filter.Stream_End
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync and then Filter.Offset = Footer_Array'Last + 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync else
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync return Filter.Stream_End;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Stream_End;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync --------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Total_In --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync --------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function Total_In (Filter : in Filter_Type) return Count is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync return Count (Thin.Total_In (To_Thin_Access (Filter.Strm).all));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Total_In;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ---------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Total_Out --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ---------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function Total_Out (Filter : in Filter_Type) return Count is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync return Count (Thin.Total_Out (To_Thin_Access (Filter.Strm).all));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Total_Out;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ---------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Translate --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ---------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Translate
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter : in out Filter_Type;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Data : in Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last : out Ada.Streams.Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data : out Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last : out Ada.Streams.Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush : in Flush_Mode) is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Filter.Header = GZip and then Filter.Compression then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Translate_GZip
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter => Filter,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Data => In_Data,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last => In_Last,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data => Out_Data,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last => Out_Last,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush => Flush);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync else
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Translate_Auto
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter => Filter,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Data => In_Data,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last => In_Last,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data => Out_Data,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last => Out_Last,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush => Flush);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Translate;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync --------------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Translate_Auto --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync --------------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Translate_Auto
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter : in out Filter_Type;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Data : in Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last : out Ada.Streams.Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data : out Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last : out Ada.Streams.Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush : in Flush_Mode)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync use type Thin.Int;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Code : Thin.Int;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if not Is_Open (Filter) then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise Status_Error;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Out_Data'Length = 0 and then In_Data'Length = 0 then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise Constraint_Error;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Set_Out (Filter.Strm.all, Out_Data'Address, Out_Data'Length);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Set_In (Filter.Strm.all, In_Data'Address, In_Data'Length);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Code := Flate (Filter.Compression).Step
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (To_Thin_Access (Filter.Strm),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Thin.Int (Flush));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Code = Thin.Z_STREAM_END then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.Stream_End := True;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync else
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Check_Error (Filter.Strm.all, Code);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last := In_Data'Last
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync - Stream_Element_Offset (Avail_In (Filter.Strm.all));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last := Out_Data'Last
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync - Stream_Element_Offset (Avail_Out (Filter.Strm.all));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Translate_Auto;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync --------------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Translate_GZip --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync --------------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Translate_GZip
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter : in out Filter_Type;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Data : in Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last : out Ada.Streams.Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data : out Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last : out Ada.Streams.Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush : in Flush_Mode)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_First : Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Add_Data (Data : in Stream_Element_Array);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Add data to stream from the Filter.Offset till necessary,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- used for add gzip headr/footer.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Put_32
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Item : in out Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data : in Unsigned_32);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync pragma Inline (Put_32);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync --------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Add_Data --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync --------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Add_Data (Data : in Stream_Element_Array) is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data_First : Stream_Element_Offset renames Filter.Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data_Last : Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data_Len : Stream_Element_Offset; -- -1
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Len : Stream_Element_Offset; -- -1
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_First := Out_Last + 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Data_First > Data'Last then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync return;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data_Len := Data'Last - Data_First;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Len := Out_Data'Last - Out_First;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Data_Len <= Out_Len then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last := Out_First + Data_Len;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data_Last := Data'Last;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync else
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last := Out_Data'Last;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data_Last := Data_First + Out_Len;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data (Out_First .. Out_Last) := Data (Data_First .. Data_Last);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data_First := Data_Last + 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_First := Out_Last + 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Add_Data;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Put_32 --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Put_32
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Item : in out Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data : in Unsigned_32)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync D : Unsigned_32 := Data;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync for J in Item'First .. Item'First + 3 loop
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Item (J) := Stream_Element (D and 16#FF#);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync D := Shift_Right (D, 8);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end loop;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Put_32;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last := Out_Data'First - 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if not Filter.Stream_End then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Add_Data (Simple_GZip_Header);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Translate_Auto
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter => Filter,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Data => In_Data,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last => In_Last,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data => Out_Data (Out_First .. Out_Data'Last),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last => Out_Last,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush => Flush);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync CRC32 (Filter.CRC, In_Data (In_Data'First .. In_Last));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Filter.Stream_End and then Out_Last <= Out_Data'Last then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- This detection method would work only when
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Simple_GZip_Header'Last > Footer_Array'Last
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Filter.Offset = Simple_GZip_Header'Last + 1 then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Filter.Offset := Footer_Array'First;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync declare
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Footer : Footer_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Put_32 (Footer, Filter.CRC);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Put_32 (Footer (Footer'First + 4 .. Footer'Last),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Unsigned_32 (Total_In (Filter)));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Add_Data (Footer);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Translate_GZip;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Version --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -------------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function Version return String is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync return Interfaces.C.Strings.Value (Thin.zlibVersion);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Version;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -- Write --
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync -----------
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Write
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter : in out Filter_Type;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Item : in Ada.Streams.Stream_Element_Array;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush : in Flush_Mode := No_Flush)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Buffer : Stream_Element_Array (1 .. Buffer_Size);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last : Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last : Stream_Element_Offset;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_First : Stream_Element_Offset := Item'First;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Item'Length = 0 and Flush = No_Flush then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync return;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync loop
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Translate
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Filter => Filter,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Data => Item (In_First .. Item'Last),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_Last => In_Last,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Data => Buffer,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out_Last => Out_Last,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Flush => Flush);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Out_Last >= Buffer'First then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Write (Buffer (1 .. Out_Last));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end if;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync exit when In_Last = Item'Last or Stream_End (Filter);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In_First := In_Last + 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end loop;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end Write;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend ZLib;