all repos — mgba @ 3b353ac62190a00765812938e86e04b753196736

mGBA Game Boy Advance Emulator

src/third-party/zlib/contrib/ada/buffer_demo.adb (view raw)

  1----------------------------------------------------------------
  2--  ZLib for Ada thick binding.                               --
  3--                                                            --
  4--  Copyright (C) 2002-2004 Dmitriy Anisimkov                 --
  5--                                                            --
  6--  Open source license information is in the zlib.ads file.  --
  7----------------------------------------------------------------
  8--
  9--  $Id: buffer_demo.adb,v 1.3 2004/09/06 06:55:35 vagul Exp $
 10
 11--  This demo program provided by Dr Steve Sangwine <sjs@essex.ac.uk>
 12--
 13--  Demonstration of a problem with Zlib-Ada (already fixed) when a buffer
 14--  of exactly the correct size is used for decompressed data, and the last
 15--  few bytes passed in to Zlib are checksum bytes.
 16
 17--  This program compresses a string of text, and then decompresses the
 18--  compressed text into a buffer of the same size as the original text.
 19
 20with Ada.Streams; use Ada.Streams;
 21with Ada.Text_IO;
 22
 23with ZLib; use ZLib;
 24
 25procedure Buffer_Demo is
 26   EOL  : Character renames ASCII.LF;
 27   Text : constant String
 28     := "Four score and seven years ago our fathers brought forth," & EOL &
 29        "upon this continent, a new nation, conceived in liberty," & EOL &
 30        "and dedicated to the proposition that `all men are created equal'.";
 31
 32   Source : Stream_Element_Array (1 .. Text'Length);
 33   for Source'Address use Text'Address;
 34
 35begin
 36   Ada.Text_IO.Put (Text);
 37   Ada.Text_IO.New_Line;
 38   Ada.Text_IO.Put_Line
 39     ("Uncompressed size : " & Positive'Image (Text'Length) & " bytes");
 40
 41   declare
 42      Compressed_Data : Stream_Element_Array (1 .. Text'Length);
 43      L               : Stream_Element_Offset;
 44   begin
 45      Compress : declare
 46         Compressor : Filter_Type;
 47         I : Stream_Element_Offset;
 48      begin
 49         Deflate_Init (Compressor);
 50
 51         --  Compress the whole of T at once.
 52
 53         Translate (Compressor, Source, I, Compressed_Data, L, Finish);
 54         pragma Assert (I = Source'Last);
 55
 56         Close (Compressor);
 57
 58         Ada.Text_IO.Put_Line
 59           ("Compressed size :   "
 60            & Stream_Element_Offset'Image (L) & " bytes");
 61      end Compress;
 62
 63      --  Now we decompress the data, passing short blocks of data to Zlib
 64      --  (because this demonstrates the problem - the last block passed will
 65      --  contain checksum information and there will be no output, only a
 66      --  check inside Zlib that the checksum is correct).
 67
 68      Decompress : declare
 69         Decompressor : Filter_Type;
 70
 71         Uncompressed_Data : Stream_Element_Array (1 .. Text'Length);
 72
 73         Block_Size : constant := 4;
 74         --  This makes sure that the last block contains
 75         --  only Adler checksum data.
 76
 77         P : Stream_Element_Offset := Compressed_Data'First - 1;
 78         O : Stream_Element_Offset;
 79      begin
 80         Inflate_Init (Decompressor);
 81
 82         loop
 83            Translate
 84              (Decompressor,
 85               Compressed_Data
 86                 (P + 1 .. Stream_Element_Offset'Min (P + Block_Size, L)),
 87               P,
 88               Uncompressed_Data
 89                 (Total_Out (Decompressor) + 1 .. Uncompressed_Data'Last),
 90               O,
 91               No_Flush);
 92
 93               Ada.Text_IO.Put_Line
 94                 ("Total in : " & Count'Image (Total_In (Decompressor)) &
 95                  ", out : " & Count'Image (Total_Out (Decompressor)));
 96
 97               exit when P = L;
 98         end loop;
 99
100         Ada.Text_IO.New_Line;
101         Ada.Text_IO.Put_Line
102           ("Decompressed text matches original text : "
103             & Boolean'Image (Uncompressed_Data = Source));
104      end Decompress;
105   end;
106end Buffer_Demo;