Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5098 clevermous 1
В этом каталоге находится упрощенная переписанная на C мною, diamond'ом, версия
2
LZMA-упаковщика. Оригинальный LZMA SDK 4.32 является copyright (c) 1999-2005
3
Igor Pavlov, может быть получен на странице http://www.7-zip.org/sdk.html,
4
содержит, в частности, версии исходного кода на C++,C# и Java для упаковки и
5
распаковки, код LZMA-распаковки на ANSI-C, описание формата 7z.
6
 
7
Эта версия не является безопасной в многопоточной среде, поддерживает только
8
bt4 match-finder, некоторые параметры упаковки зафиксированы (впрочем, это при
9
необходимости легко модифицировать), поддерживается только сжатие данных в
10
оперативной памяти. (Этих ограничений нет в оригинальном LZMA
11
SDK.) Эта версия не обязана компилироваться любым компилятором, ибо я использую
12
только VC++, хотя единственное известное мне отклонение от ANSI C состоит в
13
использовании VC-специфичной директивы #pragma intrinsic(memcpy), необходимой,
14
чтобы memcpy была встроена прямо в код - в результате библиотека не ссылается
15
ни на одну из функций C run-time library. (Мне это необходимо, поскольку
16
библиотека используется в ассемблерной программе MtApPack, не использующей
17
RTL и к тому же существующей и для Windows, и для Kolibri.)
18
 
19
Эта библиотека, как и оригинальный LZMA SDK, может быть использована в других
20
программах в соответствии с одной из лицензий (на ваш выбор) GNU LGPL или
21
GNU CPL. (Оригинальный SDK также допускает использование оригинальной
22
библиотеки без ограничений при условии использования объектных файлов без
23
модификации кода, на данную версию это не распространяется.)
24
 
25
Экспортируются две функции: в C++-стиле объявление выглядит так:
26
extern "C" __stdcall void lzma_set_dict_size(unsigned logdictsize);
27
extern "C" __stdcall unsigned lzma_compress(
28
	const void* source,
29
	void* destination,
30
	unsigned length,
31
	void* workmem);
32
 
33
Перед упаковкой требуется установить размер словаря первой из этих функций,
34
принимающей логарифм по основанию 2 этого значения
35
(т.е. dictsize == (1<
36
так что параметр logdictsize не должен превосходить 28. Если размер буфера
37
больше размера входных данных, то результат не зависит от размера буфера,
38
т.е. для данных размером 12345 байт результаты сжатия с буфером на 16384 байт и
39
на 1 мегабайт одинаковы.
40
Упаковка производится вызовом второй из этих функций. source - указатель на
41
входные данные, destination - указатель на буфер для упакованных данных,
42
length - длина входных данных, workmem - указатель на временную память,
43
используемую упаковщиком; должно быть выделено не менее 0x509000+dictsize*19/2
44
байт. Для упакованных данных в худшем случае достаточно 0x10 + length*9/8 байт.