cd74d1af33
git-svn-id: svn://kolibrios.org@5098 a494cfbc-eb01-0410-851d-a64ba20cac60 |
||
---|---|---|
.. | ||
lzmatest | ||
common.h | ||
lzma.h | ||
LZMAEncoder.c | ||
LZMAEncoder.h | ||
lzmapack.dsp | ||
lzmapack.dsw | ||
MatchFinder.c | ||
MatchFinder.h | ||
RangeCoder.c | ||
RangeCoder.h | ||
RangeCoderBit.h | ||
RangeCoderBitTree.h | ||
readme.txt |
В этом каталоге находится упрощенная переписанная на C мною, diamond'ом, версия LZMA-упаковщика. Оригинальный LZMA SDK 4.32 является copyright (c) 1999-2005 Igor Pavlov, может быть получен на странице http://www.7-zip.org/sdk.html, содержит, в частности, версии исходного кода на C++,C# и Java для упаковки и распаковки, код LZMA-распаковки на ANSI-C, описание формата 7z. Эта версия не является безопасной в многопоточной среде, поддерживает только bt4 match-finder, некоторые параметры упаковки зафиксированы (впрочем, это при необходимости легко модифицировать), поддерживается только сжатие данных в оперативной памяти. (Этих ограничений нет в оригинальном LZMA SDK.) Эта версия не обязана компилироваться любым компилятором, ибо я использую только VC++, хотя единственное известное мне отклонение от ANSI C состоит в использовании VC-специфичной директивы #pragma intrinsic(memcpy), необходимой, чтобы memcpy была встроена прямо в код - в результате библиотека не ссылается ни на одну из функций C run-time library. (Мне это необходимо, поскольку библиотека используется в ассемблерной программе MtApPack, не использующей RTL и к тому же существующей и для Windows, и для Kolibri.) Эта библиотека, как и оригинальный LZMA SDK, может быть использована в других программах в соответствии с одной из лицензий (на ваш выбор) GNU LGPL или GNU CPL. (Оригинальный SDK также допускает использование оригинальной библиотеки без ограничений при условии использования объектных файлов без модификации кода, на данную версию это не распространяется.) Экспортируются две функции: в C++-стиле объявление выглядит так: extern "C" __stdcall void lzma_set_dict_size(unsigned logdictsize); extern "C" __stdcall unsigned lzma_compress( const void* source, void* destination, unsigned length, void* workmem); Перед упаковкой требуется установить размер словаря первой из этих функций, принимающей логарифм по основанию 2 этого значения (т.е. dictsize == (1<<logdictsize)). Максимальный размер буфера равен 256Mb, так что параметр logdictsize не должен превосходить 28. Если размер буфера больше размера входных данных, то результат не зависит от размера буфера, т.е. для данных размером 12345 байт результаты сжатия с буфером на 16384 байт и на 1 мегабайт одинаковы. Упаковка производится вызовом второй из этих функций. source - указатель на входные данные, destination - указатель на буфер для упакованных данных, length - длина входных данных, workmem - указатель на временную память, используемую упаковщиком; должно быть выделено не менее 0x509000+dictsize*19/2 байт. Для упакованных данных в худшем случае достаточно 0x10 + length*9/8 байт.