- Visual C++源码
- Visual Basic源码
- C++ Builder源码
- Java源码
- Delphi源码
- C/C++源码
- PHP源码
- Perl源码
- Python源码
- Asm源码
- Pascal源码
- Borland C++源码
- Others源码
- SQL源码
- VBScript源码
- JavaScript源码
- ASP/ASPX源码
- C#源码
- Flash/ActionScript源码
- matlab源码
- PowerBuilder源码
- LabView源码
- Flex源码
- MathCAD源码
- VBA源码
- IDL源码
- Lisp/Scheme源码
- VHDL源码
- Objective-C源码
- Fortran源码
- tcl/tk源码
- QT源码
buffer_demo.adb
资源名称:zlib124.zip [点击查看]
上传用户:shengde
上传日期:2021-02-21
资源大小:638k
文件大小:4k
源码类别:
压缩解压
开发平台:
Visual C++
- ----------------------------------------------------------------
- -- ZLib for Ada thick binding. --
- -- --
- -- Copyright (C) 2002-2004 Dmitriy Anisimkov --
- -- --
- -- Open source license information is in the zlib.ads file. --
- ----------------------------------------------------------------
- --
- -- $Id: buffer_demo.adb,v 1.3 2004/09/06 06:55:35 vagul Exp $
- -- This demo program provided by Dr Steve Sangwine <sjs@essex.ac.uk>
- --
- -- Demonstration of a problem with Zlib-Ada (already fixed) when a buffer
- -- of exactly the correct size is used for decompressed data, and the last
- -- few bytes passed in to Zlib are checksum bytes.
- -- This program compresses a string of text, and then decompresses the
- -- compressed text into a buffer of the same size as the original text.
- with Ada.Streams; use Ada.Streams;
- with Ada.Text_IO;
- with ZLib; use ZLib;
- procedure Buffer_Demo is
- EOL : Character renames ASCII.LF;
- Text : constant String
- := "Four score and seven years ago our fathers brought forth," & EOL &
- "upon this continent, a new nation, conceived in liberty," & EOL &
- "and dedicated to the proposition that `all men are created equal'.";
- Source : Stream_Element_Array (1 .. Text'Length);
- for Source'Address use Text'Address;
- begin
- Ada.Text_IO.Put (Text);
- Ada.Text_IO.New_Line;
- Ada.Text_IO.Put_Line
- ("Uncompressed size : " & Positive'Image (Text'Length) & " bytes");
- declare
- Compressed_Data : Stream_Element_Array (1 .. Text'Length);
- L : Stream_Element_Offset;
- begin
- Compress : declare
- Compressor : Filter_Type;
- I : Stream_Element_Offset;
- begin
- Deflate_Init (Compressor);
- -- Compress the whole of T at once.
- Translate (Compressor, Source, I, Compressed_Data, L, Finish);
- pragma Assert (I = Source'Last);
- Close (Compressor);
- Ada.Text_IO.Put_Line
- ("Compressed size : "
- & Stream_Element_Offset'Image (L) & " bytes");
- end Compress;
- -- Now we decompress the data, passing short blocks of data to Zlib
- -- (because this demonstrates the problem - the last block passed will
- -- contain checksum information and there will be no output, only a
- -- check inside Zlib that the checksum is correct).
- Decompress : declare
- Decompressor : Filter_Type;
- Uncompressed_Data : Stream_Element_Array (1 .. Text'Length);
- Block_Size : constant := 4;
- -- This makes sure that the last block contains
- -- only Adler checksum data.
- P : Stream_Element_Offset := Compressed_Data'First - 1;
- O : Stream_Element_Offset;
- begin
- Inflate_Init (Decompressor);
- loop
- Translate
- (Decompressor,
- Compressed_Data
- (P + 1 .. Stream_Element_Offset'Min (P + Block_Size, L)),
- P,
- Uncompressed_Data
- (Total_Out (Decompressor) + 1 .. Uncompressed_Data'Last),
- O,
- No_Flush);
- Ada.Text_IO.Put_Line
- ("Total in : " & Count'Image (Total_In (Decompressor)) &
- ", out : " & Count'Image (Total_Out (Decompressor)));
- exit when P = L;
- end loop;
- Ada.Text_IO.New_Line;
- Ada.Text_IO.Put_Line
- ("Decompressed text matches original text : "
- & Boolean'Image (Uncompressed_Data = Source));
- end Decompress;
- end;
- end Buffer_Demo;