Using Ada LZMA to compress and decompress LZMA files
Setup of Ada LZMA binding
First download the Ada LZMA binding at http://download.vacs.fr/ada-lzma/ada-lzma-1.0.0.tar.gz or at [email protected]:stcarrez/ada-lzma.git, configure, build and install the library with the next commands:
./configure make make install
After these steps, you are ready to use the binding and you can add the next line at begining of your GNAT project file:
with "lzma";
Import Declaration
To use the Ada LZMA packages, you will first import the following packages in your Ada source code:
with Lzma.Base;
with Lzma.Container;
with Lzma.Check;
LZMA Stream Declaration and Initialization
The liblzma library uses the lzma_stream type to hold and control the data for the lzma operations. The lzma_stream must be initialized at begining of the compression or decompression and must be kept until the compression or decompression is finished. To use it, you must declare the LZMA stream as follows:
Stream : aliased Lzma.Base.lzma_stream := Lzma.Base.LZMA_STREAM_INIT;
Most of the liblzma function return a status value of by lzma_ret, you may declare a result variable like this:
Result : Lzma.Base.lzma_ret;
Initialization of the lzma_stream
After the lzma_stream is declared, you must configure it either for compression or for decompression.
Initialize for compression
To configure the lzma_stream for compression, you will use the lzma_easy_encode function. The Preset parameter controls the compression level. Higher values provide better compression but are slower and require more memory for the program.
Result := Lzma.Container.lzma_easy_encoder (Stream'Unchecked_Access, Lzam.Container.LZMA_PRESET_DEFAULT,
Lzma.Check.LZMA_CHECK_CRC64);
if Result /= Lzma.Base.LZMA_OK then
Ada.Text_IO.Put_Line ("Error initializing the encoder");
end if;
Initialize for decompression
For the decompression, you will use the lzma_stream_decoder:
Result := Lzma.Container.lzma_stream_decoder (Stream'Unchecked_Access,
Long_Long_Integer'Last,
Lzma.Container.LZMA_CONCATENATED);
Compress or decompress the data
The compression and decompression is done by the lzma_code function which is called several times until it returns LZMA_STREAM_END code. Setup the stream 'next_out', 'avail_out', 'next_in' and 'avail_in' and call the lzma_code operation with the action (Lzma.Base.LZMA_RUN or Lzma.Base.LZMA_FINISH):
Result := Lzma.Base.lzma_code (Stream'Unchecked_Access, Action);
Release the LZMA stream
Close the LZMA stream:
Lzma.Base.lzma_end (Stream'Unchecked_Access);
Sources
To better understand and use the library, use the source Luke