package Compress::unLZMA;

use strict;
use warnings;

require Exporter;

our @ISA = qw(Exporter);

our %EXPORT_TAGS = ( 'all' => [ qw(
	uncompress uncompressfile
) ] );

our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );

our $VERSION = '0.05';

require XSLoader;
XSLoader::load('Compress::unLZMA', $VERSION);

sub compress {
	die "not implemented!\n";

sub compressfile {
	die "not implemented!\n";

sub uncompress {
	my ($data) = @_;

	return undef if (length($data) < 14);

	my $properties = substr($data, 0, 5);

	my $size = 0;
	for (my $ii = 0; $ii < 4; $ii++) {
		my $b = ord(substr($data, $ii + 5, 1));
		$size += $b << ($ii * 8);

	for (my $ii = 0; $ii < 4; $ii++) {
		my $b = ord(substr($data, $ii + 9, 1));
		if ($b != 0) {
			return undef;

	if (ord(substr($properties, 0, 1)) >= (9 * 5 * 5)) {
		return undef;

	if ( $size == 0 ) { # empty file: no data to uncompress
		return '';

	$data = substr($data, 13);

	my $result = uncompressdata($data, length($data), $size, $properties);

	return $result;



=head1 NAME

Compress::unLZMA - Interface to LZMA decompression library


  use Compress::unLZMA qw(uncompress uncompressfile);
  my $data = uncompressfile('foo.lzma');
  my $data = uncompress($content);


LZMA is default and general compression method of 7z format
in 7-Zip program. LZMA provides high compression ratio and very 
fast decompression.

This module is based on the LZMA SDK which provides a cross-platform 
implementation of the LZMA decompression algorithm in ANSI C.

From SDK lzma.txt file:

  LZMA decompression code was ported from original C++ sources to C.
  Also it was simplified and optimized for code size.
  But it is fully compatible with LZMA from 7-Zip.

=head1 METHODS

=over 4

=item $data = uncompress($content)

Uncompress $data. if successful, it returns the uncompressed data.
Otherwise it returns undef and $@ contains the error message.

The source buffer can be either be a scalar or a scalar reference.

=item $data = uncompressfile($file)

Uncompress the file $file. if successful, it returns the uncompressed data.
Otherwise it returns undef and $@ contains the error message.


=head1 CAVEATS

This version only implements in-memory decompression (patches are welcomed).

There is no way to recognize a valid LZMA encoded file with the SDK.
So, in some cases, you can crash your script if you try to uncompress
a non valid LZMA encoded file.


Please report any requests, suggestions or bugs via the RT bug-tracking system 
at or email to bug-Compress-unLZMA\ is the RT queue for Compress::unLZMA.
Please check to see if your bug has already been reported. 


Adriano Ferreira,


Copyright 2004

Fabien Potencier,

This software may be freely copied and distributed under the same
terms and conditions as Perl.


LZMA SDK 4.01  Copyright (C) 1999-2004 Igor Pavlov  2004-02-15

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

LZMA SDK also can be available under a proprietary license for 
those who cannot use the GNU LGPL in their code. To request
such proprietary license or any additional consultations,
write to

=head1 SEE ALSO