cd74d1af33
git-svn-id: svn://kolibrios.org@5098 a494cfbc-eb01-0410-851d-a64ba20cac60
45 lines
2.6 KiB
Plaintext
45 lines
2.6 KiB
Plaintext
В этом каталоге находится упрощенная переписанная на 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 байт.
|