kolibrios/programs/other/kpack/kerpack_linux/lzma_c
CleverMouse cd74d1af33 switch build system to Tup
git-svn-id: svn://kolibrios.org@5098 a494cfbc-eb01-0410-851d-a64ba20cac60
2014-09-12 15:15:23 +00:00
..
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

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

В этом каталоге находится упрощенная переписанная на 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 байт.