107 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Ada
		
	
	
	
	
	
		
		
			
		
	
	
			107 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Ada
		
	
	
	
	
	
|   | ----------------------------------------------------------------
 | ||
|  | --  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; |