liblzma is a public domain general-purpose data compression library with a zlib-like API. liblzma is part of XZ Utils which includes a gzip-like command line tool named xz and some other tools. XZ Utils is developed and maintained by Lasse Collin. Major parts of liblzma are based on Igor Pavlov's public domain LZMA SDK. The Ada LZMA library provides an Ada05 thin binding for the liblzma library and it allows to use all the operations provided by the compression and decompression library.
Using Ada LZMA to compress and decompress LZMA files
By Stephane Carrez2015-12-16 10:25:00
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 git@github.com: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
Download
Tags
- Facelet
- NetBSD
- framework
- Mysql
- generator
- files
- application
- gcc
- ReadyNAS
- Security
- binutils
- ELF
- JSF
- Java
- bacula
- Tutorial
- Apache
- COFF
- collaboration
- planning
- project
- upgrade
- AWA
- C
- EL
- J2EE
- UML
- php
- symfony
- Ethernet
- Ada
- FreeBSD
- Go
- KVM
- MDE
- Proxy
- STM32
- Servlet
- backup
- lvm
- multiprocessing
- web
- Bean
- Jenkins
- release
- OAuth
- ProjectBar
- REST
- Rewrite
- Sqlite
- Storage
- USB
- Ubuntu
- bison
- cache
- crash
- Linux
- firefox
- performance
- interview
Add a comment
To add a comment, you must be connected. Login