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

📄 zlib.adb

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 ADB
📖 第 1 页 / 共 2 页
字号:
            Win_Bits := Win_Bits + 32;         when Default => null;      end case;      Filter.Strm        := new Z_Stream;      Filter.Compression := False;      Filter.Stream_End  := False;      Filter.Header      := Header;      if Thin.Inflate_Init         (To_Thin_Access (Filter.Strm), Win_Bits) /= Thin.Z_OK      then         Raise_Error (Filter.Strm.all);      end if;   end Inflate_Init;   -------------   -- Is_Open --   -------------   function Is_Open (Filter : in Filter_Type) return Boolean is   begin      return Filter.Strm /= null;   end Is_Open;   -----------------   -- Raise_Error --   -----------------   procedure Raise_Error (Message : in String) is   begin      Ada.Exceptions.Raise_Exception (ZLib_Error'Identity, Message);   end Raise_Error;   procedure Raise_Error (Stream : in Z_Stream) is   begin      Raise_Error (Last_Error_Message (Stream));   end Raise_Error;   ----------   -- Read --   ----------   procedure Read     (Filter : in out Filter_Type;      Item   :    out Ada.Streams.Stream_Element_Array;      Last   :    out Ada.Streams.Stream_Element_Offset;      Flush  : in     Flush_Mode := No_Flush)   is      In_Last    : Stream_Element_Offset;      Item_First : Ada.Streams.Stream_Element_Offset := Item'First;      V_Flush    : Flush_Mode := Flush;   begin      pragma Assert (Rest_First in Buffer'First .. Buffer'Last + 1);      pragma Assert (Rest_Last in Buffer'First - 1 .. Buffer'Last);      loop         if Rest_Last = Buffer'First - 1 then            V_Flush := Finish;         elsif Rest_First > Rest_Last then            Read (Buffer, Rest_Last);            Rest_First := Buffer'First;            if Rest_Last < Buffer'First then               V_Flush := Finish;            end if;         end if;         Translate           (Filter   => Filter,            In_Data  => Buffer (Rest_First .. Rest_Last),            In_Last  => In_Last,            Out_Data => Item (Item_First .. Item'Last),            Out_Last => Last,            Flush    => V_Flush);         Rest_First := In_Last + 1;         exit when Stream_End (Filter)           or else Last = Item'Last           or else (Last >= Item'First and then Allow_Read_Some);         Item_First := Last + 1;      end loop;   end Read;   ----------------   -- Stream_End --   ----------------   function Stream_End (Filter : in Filter_Type) return Boolean is   begin      if Filter.Header = GZip and Filter.Compression then         return Filter.Stream_End            and then Filter.Offset = Footer_Array'Last + 1;      else         return Filter.Stream_End;      end if;   end Stream_End;   --------------   -- Total_In --   --------------   function Total_In (Filter : in Filter_Type) return Count is   begin      return Count (Thin.Total_In (To_Thin_Access (Filter.Strm).all));   end Total_In;   ---------------   -- Total_Out --   ---------------   function Total_Out (Filter : in Filter_Type) return Count is   begin      return Count (Thin.Total_Out (To_Thin_Access (Filter.Strm).all));   end Total_Out;   ---------------   -- Translate --   ---------------   procedure Translate     (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) is   begin      if Filter.Header = GZip and then Filter.Compression then         Translate_GZip           (Filter   => Filter,            In_Data  => In_Data,            In_Last  => In_Last,            Out_Data => Out_Data,            Out_Last => Out_Last,            Flush    => Flush);      else         Translate_Auto           (Filter   => Filter,            In_Data  => In_Data,            In_Last  => In_Last,            Out_Data => Out_Data,            Out_Last => Out_Last,            Flush    => Flush);      end if;   end Translate;   --------------------   -- Translate_Auto --   --------------------   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)   is      use type Thin.Int;      Code : Thin.Int;   begin      if not Is_Open (Filter) then         raise Status_Error;      end if;      if Out_Data'Length = 0 and then In_Data'Length = 0 then         raise Constraint_Error;      end if;      Set_Out (Filter.Strm.all, Out_Data'Address, Out_Data'Length);      Set_In  (Filter.Strm.all, In_Data'Address, In_Data'Length);      Code := Flate (Filter.Compression).Step        (To_Thin_Access (Filter.Strm),         Thin.Int (Flush));      if Code = Thin.Z_STREAM_END then         Filter.Stream_End := True;      else         Check_Error (Filter.Strm.all, Code);      end if;      In_Last  := In_Data'Last         - Stream_Element_Offset (Avail_In (Filter.Strm.all));      Out_Last := Out_Data'Last         - Stream_Element_Offset (Avail_Out (Filter.Strm.all));   end Translate_Auto;   --------------------   -- Translate_GZip --   --------------------   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)   is      Out_First : Stream_Element_Offset;      procedure Add_Data (Data : in Stream_Element_Array);      --  Add data to stream from the Filter.Offset till necessary,      --  used for add gzip headr/footer.      procedure Put_32        (Item : in out Stream_Element_Array;         Data : in     Unsigned_32);      pragma Inline (Put_32);      --------------      -- Add_Data --      --------------      procedure Add_Data (Data : in Stream_Element_Array) is         Data_First : Stream_Element_Offset renames Filter.Offset;         Data_Last  : Stream_Element_Offset;         Data_Len   : Stream_Element_Offset; --  -1         Out_Len    : Stream_Element_Offset; --  -1      begin         Out_First := Out_Last + 1;         if Data_First > Data'Last then            return;         end if;         Data_Len  := Data'Last     - Data_First;         Out_Len   := Out_Data'Last - Out_First;         if Data_Len <= Out_Len then            Out_Last  := Out_First  + Data_Len;            Data_Last := Data'Last;         else            Out_Last  := Out_Data'Last;            Data_Last := Data_First + Out_Len;         end if;         Out_Data (Out_First .. Out_Last) := Data (Data_First .. Data_Last);         Data_First := Data_Last + 1;         Out_First  := Out_Last + 1;      end Add_Data;      ------------      -- Put_32 --      ------------      procedure Put_32        (Item : in out Stream_Element_Array;         Data : in     Unsigned_32)      is         D : Unsigned_32 := Data;      begin         for J in Item'First .. Item'First + 3 loop            Item (J) := Stream_Element (D and 16#FF#);            D := Shift_Right (D, 8);         end loop;      end Put_32;   begin      Out_Last := Out_Data'First - 1;      if not Filter.Stream_End then         Add_Data (Simple_GZip_Header);         Translate_Auto           (Filter   => Filter,            In_Data  => In_Data,            In_Last  => In_Last,            Out_Data => Out_Data (Out_First .. Out_Data'Last),            Out_Last => Out_Last,            Flush    => Flush);         CRC32 (Filter.CRC, In_Data (In_Data'First .. In_Last));      end if;      if Filter.Stream_End and then Out_Last <= Out_Data'Last then         --  This detection method would work only when         --  Simple_GZip_Header'Last > Footer_Array'Last         if Filter.Offset = Simple_GZip_Header'Last + 1 then            Filter.Offset := Footer_Array'First;         end if;         declare            Footer : Footer_Array;         begin            Put_32 (Footer, Filter.CRC);            Put_32 (Footer (Footer'First + 4 .. Footer'Last),                    Unsigned_32 (Total_In (Filter)));            Add_Data (Footer);         end;      end if;   end Translate_GZip;   -------------   -- Version --   -------------   function Version return String is   begin      return Interfaces.C.Strings.Value (Thin.zlibVersion);   end Version;   -----------   -- Write --   -----------   procedure Write     (Filter : in out Filter_Type;      Item   : in     Ada.Streams.Stream_Element_Array;      Flush  : in     Flush_Mode := No_Flush)   is      Buffer   : Stream_Element_Array (1 .. Buffer_Size);      In_Last  : Stream_Element_Offset;      Out_Last : Stream_Element_Offset;      In_First : Stream_Element_Offset := Item'First;   begin      if Item'Length = 0 and Flush = No_Flush then         return;      end if;      loop         Translate           (Filter   => Filter,            In_Data  => Item (In_First .. Item'Last),            In_Last  => In_Last,            Out_Data => Buffer,            Out_Last => Out_Last,            Flush    => Flush);         if Out_Last >= Buffer'First then            Write (Buffer (1 .. Out_Last));         end if;         exit when In_Last = Item'Last or Stream_End (Filter);         In_First := In_Last + 1;      end loop;   end Write;end ZLib;

⌨️ 快捷键说明

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