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;
							 |