⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zlib.adb

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 ADB
📖 第 1 页 / 共 2 页
字号:
------------------------------------------------------------------  ZLib for Ada thick binding.                               ----                                                            ----  Copyright (C) 2002-2004 Dmitriy Anisimkov                 ----                                                            ----  Open source license information is in the zlib.ads file.  --------------------------------------------------------------------  $Id: zlib.adb,v 1.1 2006/01/03 15:27:08 robilad Exp $with Ada.Exceptions;with Ada.Unchecked_Conversion;with Ada.Unchecked_Deallocation;with Interfaces.C.Strings;with ZLib.Thin;package body ZLib is   use type Thin.Int;   type Z_Stream is new Thin.Z_Stream;   type Return_Code_Enum is      (OK,       STREAM_END,       NEED_DICT,       ERRNO,       STREAM_ERROR,       DATA_ERROR,       MEM_ERROR,       BUF_ERROR,       VERSION_ERROR);   type Flate_Step_Function is access     function (Strm : in Thin.Z_Streamp; Flush : in Thin.Int) return Thin.Int;   pragma Convention (C, Flate_Step_Function);   type Flate_End_Function is access      function (Ctrm : in Thin.Z_Streamp) return Thin.Int;   pragma Convention (C, Flate_End_Function);   type Flate_Type is record      Step : Flate_Step_Function;      Done : Flate_End_Function;   end record;   subtype Footer_Array is Stream_Element_Array (1 .. 8);   Simple_GZip_Header : constant Stream_Element_Array (1 .. 10)     := (16#1f#, 16#8b#,                 --  Magic header         16#08#,                         --  Z_DEFLATED         16#00#,                         --  Flags         16#00#, 16#00#, 16#00#, 16#00#, --  Time         16#00#,                         --  XFlags         16#03#                          --  OS code        );   --  The simplest gzip header is not for informational, but just for   --  gzip format compatibility.   --  Note that some code below is using assumption   --  Simple_GZip_Header'Last > Footer_Array'Last, so do not make   --  Simple_GZip_Header'Last <= Footer_Array'Last.   Return_Code : constant array (Thin.Int range <>) of Return_Code_Enum     := (0 => OK,         1 => STREAM_END,         2 => NEED_DICT,        -1 => ERRNO,        -2 => STREAM_ERROR,        -3 => DATA_ERROR,        -4 => MEM_ERROR,        -5 => BUF_ERROR,        -6 => VERSION_ERROR);   Flate : constant array (Boolean) of Flate_Type     := (True  => (Step => Thin.Deflate'Access,                   Done => Thin.DeflateEnd'Access),         False => (Step => Thin.Inflate'Access,                   Done => Thin.InflateEnd'Access));   Flush_Finish : constant array (Boolean) of Flush_Mode     := (True => Finish, False => No_Flush);   procedure Raise_Error (Stream : in Z_Stream);   pragma Inline (Raise_Error);   procedure Raise_Error (Message : in String);   pragma Inline (Raise_Error);   procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int);   procedure Free is new Ada.Unchecked_Deallocation      (Z_Stream, Z_Stream_Access);   function To_Thin_Access is new Ada.Unchecked_Conversion     (Z_Stream_Access, Thin.Z_Streamp);   procedure Translate_GZip     (Filter    : in out Filter_Type;      In_Data   : in     Ada.Streams.Stream_Element_Array;      In_Last   :    out Ada.Streams.Stream_Element_Offset;      Out_Data  :    out Ada.Streams.Stream_Element_Array;      Out_Last  :    out Ada.Streams.Stream_Element_Offset;      Flush     : in     Flush_Mode);   --  Separate translate routine for make gzip header.   procedure Translate_Auto     (Filter    : in out Filter_Type;      In_Data   : in     Ada.Streams.Stream_Element_Array;      In_Last   :    out Ada.Streams.Stream_Element_Offset;      Out_Data  :    out Ada.Streams.Stream_Element_Array;      Out_Last  :    out Ada.Streams.Stream_Element_Offset;      Flush     : in     Flush_Mode);   --  translate routine without additional headers.   -----------------   -- Check_Error --   -----------------   procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int) is      use type Thin.Int;   begin      if Code /= Thin.Z_OK then         Raise_Error            (Return_Code_Enum'Image (Return_Code (Code))              & ": " & Last_Error_Message (Stream));      end if;   end Check_Error;   -----------   -- Close --   -----------   procedure Close     (Filter       : in out Filter_Type;      Ignore_Error : in     Boolean := False)   is      Code : Thin.Int;   begin      if not Ignore_Error and then not Is_Open (Filter) then         raise Status_Error;      end if;      Code := Flate (Filter.Compression).Done (To_Thin_Access (Filter.Strm));      if Ignore_Error or else Code = Thin.Z_OK then         Free (Filter.Strm);      else         declare            Error_Message : constant String              := Last_Error_Message (Filter.Strm.all);         begin            Free (Filter.Strm);            Ada.Exceptions.Raise_Exception               (ZLib_Error'Identity,                Return_Code_Enum'Image (Return_Code (Code))                  & ": " & Error_Message);         end;      end if;   end Close;   -----------   -- CRC32 --   -----------   function CRC32     (CRC  : in Unsigned_32;      Data : in Ada.Streams.Stream_Element_Array)      return Unsigned_32   is      use Thin;   begin      return Unsigned_32 (crc32 (ULong (CRC),                                 Data'Address,                                 Data'Length));   end CRC32;   procedure CRC32     (CRC  : in out Unsigned_32;      Data : in     Ada.Streams.Stream_Element_Array) is   begin      CRC := CRC32 (CRC, Data);   end CRC32;   ------------------   -- Deflate_Init --   ------------------   procedure Deflate_Init     (Filter       : in out Filter_Type;      Level        : in     Compression_Level  := Default_Compression;      Strategy     : in     Strategy_Type      := Default_Strategy;      Method       : in     Compression_Method := Deflated;      Window_Bits  : in     Window_Bits_Type   := Default_Window_Bits;      Memory_Level : in     Memory_Level_Type  := Default_Memory_Level;      Header       : in     Header_Type        := Default)   is      use type Thin.Int;      Win_Bits : Thin.Int := Thin.Int (Window_Bits);   begin      if Is_Open (Filter) then         raise Status_Error;      end if;      --  We allow ZLib to make header only in case of default header type.      --  Otherwise we would either do header by ourselfs, or do not do      --  header at all.      if Header = None or else Header = GZip then         Win_Bits := -Win_Bits;      end if;      --  For the GZip CRC calculation and make headers.      if Header = GZip then         Filter.CRC    := 0;         Filter.Offset := Simple_GZip_Header'First;      else         Filter.Offset := Simple_GZip_Header'Last + 1;      end if;      Filter.Strm        := new Z_Stream;      Filter.Compression := True;      Filter.Stream_End  := False;      Filter.Header      := Header;      if Thin.Deflate_Init           (To_Thin_Access (Filter.Strm),            Level      => Thin.Int (Level),            method     => Thin.Int (Method),            windowBits => Win_Bits,            memLevel   => Thin.Int (Memory_Level),            strategy   => Thin.Int (Strategy)) /= Thin.Z_OK      then         Raise_Error (Filter.Strm.all);      end if;   end Deflate_Init;   -----------   -- Flush --   -----------   procedure Flush     (Filter    : in out Filter_Type;      Out_Data  :    out Ada.Streams.Stream_Element_Array;      Out_Last  :    out Ada.Streams.Stream_Element_Offset;      Flush     : in     Flush_Mode)   is      No_Data : Stream_Element_Array := (1 .. 0 => 0);      Last    : Stream_Element_Offset;   begin      Translate (Filter, No_Data, Last, Out_Data, Out_Last, Flush);   end Flush;   -----------------------   -- Generic_Translate --   -----------------------   procedure Generic_Translate     (Filter          : in out ZLib.Filter_Type;      In_Buffer_Size  : in     Integer := Default_Buffer_Size;      Out_Buffer_Size : in     Integer := Default_Buffer_Size)   is      In_Buffer  : Stream_Element_Array                     (1 .. Stream_Element_Offset (In_Buffer_Size));      Out_Buffer : Stream_Element_Array                     (1 .. Stream_Element_Offset (Out_Buffer_Size));      Last       : Stream_Element_Offset;      In_Last    : Stream_Element_Offset;      In_First   : Stream_Element_Offset;      Out_Last   : Stream_Element_Offset;   begin      Main : loop         Data_In (In_Buffer, Last);         In_First := In_Buffer'First;         loop            Translate              (Filter   => Filter,               In_Data  => In_Buffer (In_First .. Last),               In_Last  => In_Last,               Out_Data => Out_Buffer,               Out_Last => Out_Last,               Flush    => Flush_Finish (Last < In_Buffer'First));            if Out_Buffer'First <= Out_Last then               Data_Out (Out_Buffer (Out_Buffer'First .. Out_Last));            end if;            exit Main when Stream_End (Filter);            --  The end of in buffer.            exit when In_Last = Last;            In_First := In_Last + 1;         end loop;      end loop Main;   end Generic_Translate;   ------------------   -- Inflate_Init --   ------------------   procedure Inflate_Init     (Filter      : in out Filter_Type;      Window_Bits : in     Window_Bits_Type := Default_Window_Bits;      Header      : in     Header_Type      := Default)   is      use type Thin.Int;      Win_Bits : Thin.Int := Thin.Int (Window_Bits);      procedure Check_Version;      --  Check the latest header types compatibility.      procedure Check_Version is      begin         if Version <= "1.1.4" then            Raise_Error              ("Inflate header type " & Header_Type'Image (Header)               & " incompatible with ZLib version " & Version);         end if;      end Check_Version;   begin      if Is_Open (Filter) then         raise Status_Error;      end if;      case Header is         when None =>            Check_Version;            --  Inflate data without headers determined            --  by negative Win_Bits.            Win_Bits := -Win_Bits;         when GZip =>            Check_Version;            --  Inflate gzip data defined by flag 16.            Win_Bits := Win_Bits + 16;         when Auto =>            Check_Version;            --  Inflate with automatic detection            --  of gzip or native header defined by flag 32.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -