4.58 beta

This commit is contained in:
Igor Pavlov
2008-05-05 00:00:00 +00:00
committed by Kornel Lesiński
parent bd1fa36322
commit 3901bf0ab8
326 changed files with 10643 additions and 14913 deletions
+22 -64
View File
@@ -1,7 +1,7 @@
7z ANSI-C Decoder 4.48
7z ANSI-C Decoder 4.58
----------------------
7z ANSI-C Decoder 4.48 Copyright (C) 1999-2006 Igor Pavlov
7z ANSI-C Decoder 4.58 Copyright (C) 1999-2008 Igor Pavlov
7z ANSI-C provides 7z/LZMA decoding.
7z ANSI-C version is simplified version ported from C++ code.
@@ -20,17 +20,12 @@ Read lzma.txt for information about license.
Files
---------------------
7zAlloc.* - Allocate and Free
7zBuffer.* - Buffer structure
7zCrc.* - CRC32 code
7zDecode.* - Low level memory->memory decoding
7zExtract.* - High level stream->memory decoding
7zDecode.* - Low level 7z decoding
7zExtract.* - High level 7z decoding
7zHeader.* - .7z format constants
7zIn.* - .7z archive opening
7zItem.* - .7z structures
7zMain.c - Test application
7zMethodID.* - MethodID structure
7zTypes.h - Base types and constants
How To Use
@@ -85,17 +80,6 @@ extracts files from archive.7z to current folder.
How to use .7z Decoder
----------------------
.7z Decoder can be compiled in one of two modes:
1) Default mode. In that mode 7z Decoder will read full compressed
block to RAM before decompressing.
2) Mode with defined _LZMA_IN_CB. In that mode 7z Decoder can read
compressed block by parts. And you can specify desired buffer size.
So memory requirements can be reduced. But decompressing speed will
be 5-10% lower and code size is slightly larger.
Memory allocation
~~~~~~~~~~~~~~~~~
@@ -104,26 +88,27 @@ Memory allocation
2) Main pool
Such scheme can allow you to avoid fragmentation of allocated blocks.
Steps for using 7z decoder
--------------------------
Use code at 7zMain.c as example.
1) Declare variables:
inStream /* implements ISzInStream interface */
CArchiveDatabaseEx db; /* 7z archive database structure */
ISzAlloc allocImp; /* memory functions for main pool */
ISzAlloc allocTempImp; /* memory functions for temporary pool */
inStream /* implements ISzInStream interface */
CSzArEx db; /* 7z archive database structure */
ISzAlloc allocImp; /* memory functions for main pool */
ISzAlloc allocTempImp; /* memory functions for temporary pool */
2) call InitCrcTable(); function to initialize CRC structures.
2) call CrcGenerateTable(); function to initialize CRC structures.
3) call SzArDbExInit(&db); function to initialize db structures.
3) call SzArEx_Init(&db); function to initialize db structures.
4) call SzArchiveOpen(inStream, &db, &allocMain, &allocTemp) to open archive
4) call SzArEx_Open(&db, inStream, &allocMain, &allocTemp) to open archive
This function opens archive "inStream" and reads headers to "db".
All items in "db" will be allocated with "allocMain" functions.
SzArchiveOpen function allocates and frees temporary structures by "allocTemp" functions.
SzArEx_Open function allocates and frees temporary structures by "allocTemp" functions.
5) List items or Extract items
@@ -131,9 +116,9 @@ SzArchiveOpen function allocates and frees temporary structures by "allocTemp" f
~~~~~~~~~~~~~
{
UInt32 i;
for (i = 0; i < db.Database.NumFiles; i++)
for (i = 0; i < db.db.NumFiles; i++)
{
CFileItem *f = db.Database.Files + i;
CFileItem *f = db.db.Files + i;
printf("%10d %s\n", (int)f->Size, f->Name);
}
}
@@ -141,9 +126,9 @@ SzArchiveOpen function allocates and frees temporary structures by "allocTemp" f
Extracting code:
~~~~~~~~~~~~~~~~
SZ_RESULT SzExtract(
ISzInStream *inStream,
SZ_RESULT SzAr_Extract(
CArchiveDatabaseEx *db,
ISzInStream *inStream,
UInt32 fileIndex, /* index of file */
UInt32 *blockIndex, /* index of solid block */
Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */
@@ -163,7 +148,7 @@ SzArchiveOpen function allocates and frees temporary structures by "allocTemp" f
After decompressing you must free "outBuffer":
allocImp.Free(outBuffer);
6) call SzArDbExFree(&db, allocImp.Free) to free allocated items in "db".
6) call SzArEx_Free(&db, allocImp.Free) to free allocated items in "db".
@@ -173,7 +158,6 @@ Memory requirements for .7z decoding
Memory usage for Archive opening:
- Temporary pool:
- Memory for compressed .7z headers (if _LZMA_IN_CB is not defined)
- Memory for uncompressed .7z headers
- some other temporary blocks
- Main pool:
@@ -187,7 +171,6 @@ Memory usage for Archive opening:
Memory usage for archive Decompressing:
- Temporary pool:
- Memory for compressed solid block (if _LZMA_IN_CB is not defined)
- Memory for LZMA decompressing structures
- Main pool:
- Memory for decompressed solid block
@@ -195,38 +178,13 @@ Memory usage for archive Decompressing:
temprorary buffers can be about 15% of solid block size.
If _LZMA_IN_CB is defined, 7z Decoder will not allocate memory for
compressed blocks. Instead of this, you must allocate buffer with desired
7z Decoder doesn't allocate memory for compressed blocks.
Instead of this, you must allocate buffer with desired
size before calling 7z Decoder. Use 7zMain.c as example.
EXIT codes
-----------
7z Decoder functions can return one of the following codes:
#define SZ_OK (0)
#define SZE_DATA_ERROR (1)
#define SZE_OUTOFMEMORY (2)
#define SZE_CRC_ERROR (3)
#define SZE_NOTIMPL (4)
#define SZE_FAIL (5)
#define SZE_ARCHIVE_ERROR (6)
LZMA Defines
------------
_LZMA_IN_CB - Use special callback mode for input stream to reduce memory requirements
_SZ_FILE_SIZE_32 - define it if you need only support for files smaller than 4 GB
_SZ_NO_INT_64 - define it if your compiler doesn't support long long int or __int64.
_LZMA_PROB32 - it can increase LZMA decompressing speed on some 32-bit CPUs.
Defines
-------
_SZ_ALLOC_DEBUG - define it if you want to debug alloc/free operations to stderr.
+8 -13
View File
@@ -238,24 +238,19 @@ Folder
{
BYTE
{
0:3 DecompressionMethod.IDSize
4:
0 - IsSimple
1 - Is not simple
5:
0 - No Attributes
1 - There Are Attributes
7:
0 - Last Method in Alternative_Method_List
1 - There are more alternative methods
0:3 CodecIdSize
4: Is Complex Coder
5: There Are Attributes
6: Reserved
7: There are more alternative methods. (Not used anymore, must be 0).
}
BYTE DecompressionMethod.ID[DecompressionMethod.IDSize]
if (!IsSimple)
BYTE CodecId[CodecIdSize]
if (Is Complex Coder)
{
UINT64 NumInStreams;
UINT64 NumOutStreams;
}
if (DecompressionMethod[0] != 0)
if (There Are Attributes)
{
UINT64 PropertiesSize
BYTE Properties[PropertiesSize]
+6 -2
View File
@@ -2,8 +2,8 @@
;Defines
!define VERSION_MAJOR 4
!define VERSION_MINOR 57
!define VERSION_POSTFIX_FULL ""
!define VERSION_MINOR 58
!define VERSION_POSTFIX_FULL " beta"
!ifdef WIN64
!ifdef IA64
!define VERSION_SYS_POSTFIX_FULL " for Windows IA-64"
@@ -231,7 +231,9 @@ Section
File nl.txt
File nb.txt
File nn.txt
File pa-in.txt
File pl.txt
File ps.txt
File pt.txt
File pt-br.txt
File ro.txt
@@ -413,7 +415,9 @@ Section "Uninstall"
Delete $INSTDIR\Lang\nl.txt
Delete $INSTDIR\Lang\nb.txt
Delete $INSTDIR\Lang\nn.txt
Delete $INSTDIR\Lang\pa-in.txt
Delete $INSTDIR\Lang\pl.txt
Delete $INSTDIR\Lang\ps.txt
Delete $INSTDIR\Lang\pt.txt
Delete $INSTDIR\Lang\pt-br.txt
Delete $INSTDIR\Lang\ro.txt
+4 -2
View File
@@ -1,8 +1,8 @@
<?xml version="1.0"?>
<?define VerMajor = "4" ?>
<?define VerMinor = "57" ?>
<?define VerBuild = "00" ?>
<?define VerMinor = "58" ?>
<?define VerBuild = "10" ?>
<?define MmVer = "$(var.VerMajor).$(var.VerMinor)" ?>
<?define MmHex = "0$(var.VerMajor)$(var.VerMinor)" ?>
<?define MmmmVer = "$(var.MmVer).$(var.VerBuild).0" ?>
@@ -270,7 +270,9 @@
<File Id="nl.txt" Name="nl.txt" />
<File Id="nb.txt" Name="nb.txt" />
<File Id="nn.txt" Name="nn.txt" />
<File Id="pa_in.txt" Name="pa-in.txt" />
<File Id="pl.txt" Name="pl.txt" />
<File Id="ps.txt" Name="ps.txt" />
<File Id="pt.txt" Name="pt.txt" />
<File Id="pt_br.txt" Name="pt-br.txt" />
<File Id="ro.txt" Name="ro.txt" />
+8 -8
View File
@@ -1,4 +1,4 @@
7-Zip method IDs (4.56)
7-Zip method IDs (4.58)
-----------------------
Each compression or crypto method in 7z has unique binary value (ID).
@@ -40,19 +40,19 @@ List of defined IDs
03 - BCJ
1B - BCJ2
02 - PPC
05 - BC_PPC_B (Big Endian)
05 - PPC (Big Endian)
03 - Alpha
01 - BC_Alpha
01 - Alpha
04 - IA64
01 - BC_IA64
01 - IA64
05 - ARM
01 - BC_ARM
01 - ARM
06 - M68
05 - BC_M68_B (Big Endian)
05 - M68 (Big Endian)
07 - ARM Thumb
01 - BC_ARMThumb
01 - ARMT
08 - SPARC
05 - BC_SPARC
05 - SPARC
04 - PPMD
01 - Version
+368 -262
View File
@@ -1,294 +1,400 @@
Sources history of the 7-Zip
----------------------------
Version 4.56 beta 2007-09-13
--------------------------------------
- some fixes in LZ encoder (LZMA and Deflate) code.
size_t was replaces to ptrdiff_t.
size_t version worked incorrectly with some compilers.
Version 4.46 beta 2007-05-25
--------------------------------------
- CPP Synchronization objects now return HRes (error code) instead of bool.
Version 4.45 beta 2007-04-16
--------------------------------------
- 7-Zip now uses C version of CRC, so you must call CrcGenerateTable at
stratup code, or you must add CPP/Common/CRC.cpp to your project.
- Method ID in .7z now is 63-bit integer (UInt64).
Version 4.30 beta 2005-11-18
--------------------------------------
- Security.h::AddLockMemoryPrivilege - installs "Large pages" feature
- MemoryLock.h::EnableLockMemoryPrivilege - enables "Large pages" feature
- Alloc.h::SetLargePageSize - sets optimal LargePageSize size
4.58 alpha 9 2008-04-29
-------------------------
- BUG was fixed: 7-Zip showed incorrect timestamps in ISO files.
Version 4.27 2005-09-21
--------------------------------------
- Some GUIDs/interfaces were changed.
IStream.h:
ISequentialInStream::Read now works as old ReadPart
ISequentialOutStream::Write now works as old WritePart
4.58 alpha 8 2008-04-15
-------------------------
- BUG in 4.58 alpha 5/6/7 was fixed:
LZMA encoder worked incorrectly, if lp != 0.
- Unicode (UTF-8) support for filenames in .ZIP archives. Now there are 3 modes:
1) Default mode: 7-Zip uses UTF-8, if the local code page doesn't contain required symbols.
2) -mcu switch: 7-Zip uses UTF-8, if there are non-ASCII symbols.
3) -mcl switch: 7-Zip uses local code page.
- Now it's possible to use -mSW- and -mSW+ switches instead of -mSW=off and -mSW=on
Version 4.26 beta 2005-08-05
--------------------------------------
- MyAlloc(0)/BigAlloc(0) now return 0
4.58 alpha 7 2008-04-08
-------------------------
- BUG was fixed: BZip2Encoder and BZip2Decoder used CEvent objects without
creating, when BZip2 code was called with one thread (with -mmt1 switch or with
default switches on single thread CPU).
- .lzma support.
- RPM and NSIS support was improved.
- LZMA now stores only (2 << n) or (3 << n) dictionary size value to LZMA properties.
Version 4.25 beta 2005-07-31
--------------------------------------
- More 64-bit compatibilty
4.58 alpha 6 2008-03-27
-------------------------
- NTFS time extra in ZIP.
- New item property - kpidTimeType - VT_UI4 (0 - NTFS, 1 - Unix, 2 - DOS).
- Static CRC table is not required now for Lzma Encoder (in Lz MatchFinder).
Version 4.24 beta 2005-07-06
--------------------------------------
- Common\NewHandler.h: using throw() for code size optimization.
4.58 alpha 5 2008-03-19
-------------------------
- Creation time (-mtc switch) for .7z archives
- LZMA encoder was converted to ANSI-C
Version 4.23 2005-06-29
--------------------------------------
- Bug was fixed: memory leak in Cab decoder.
4.58 alpha 3 2008-02-25
-------------------------
- Speed optimizations for LZMA decoding. Now it uses C code instead of C++.
- 7-Zip now has 128 MB dictionary limit for 32-bit version:
It's for speed optimization: kNumLogBits = 9 + sizeof(size_t) / 2;
- TAR: 'D' link flag support.
- 7-Zip now can unpack multivolume RAR archives created with
"old style volume names" scheme (-vn switch) and names *.001, *.002, ...
- Fixed bugs:
- 7-Zip FM could not copy / move files to root network folders like \\COMPNAME\FOLDERNAME\
In case of move it removed original files.
- SFX-WIN: if there are errors, it still could return 0.
- ZIP (.XPS file) isZip64 && thisDiskNumber16 == 0xFFFF.
- ZIP name updating:
If zip file contains extra field and you try to change properties of files,
7-zip tries to delete all extra fileds (except for WzAES).
And that code could hang.
- 7-Zip GUI didn't suggest BZip2 dictionary size used in previous run.
- If creation time stamp was included in .RAR archive, 7-zip used creation time stamp
as modification time stamp.
4.58 alpha 2 2007-12-31
-------------------------
- Small changes in Deflate and LZMA compression.
- Some speed optimizations.
Version 4.19 beta 2005-05-21
--------------------------------------
- BZip2 code was rewritten. Now 7-Zip doesn't use original BZip2 code.
Old (original) version was moved to folder 7zip/Compress/BZip2Original/
Version 4.14 beta 2005-01-11
--------------------------------------
- STL using was reduced
- 7za now supports Split(001) archves
Version 4.10 beta 2004-10-21
--------------------------------------
- Codecs now use new interface: ICompressSetDecoderProperties2
Version 4.07 beta 2004-10-03
--------------------------------------
- some interfaces were changed slightly to support
-stdin -stdout mode.
- FilterCoder for simple filters
- Wildcard censor class was changed.
- Bug was fixed: when encrypted stream was multiple 16,
it used additional 16 empty bytes.
Version 3.11 2003-10-06
--------------------------------------
File functions support unicode strings even
on Windows 95/98/ME.
Version 3.08.02 2003-09-20
--------------------------------------
More compatible with GCC.
Version 3.08.02 beta 2003-08-20
--------------------------------------
Extracting bug in 7zExtract.cpp was fixed.
Version 3.08 beta 2003-08-19
--------------------------------------
Big source code reconstruction.
Version 2.30 Beta 32 2003-05-15
--------------------------------------
Small changes in Deflate decoder.
Version 2.30 Beta 31 2003-04-29
--------------------------------------
Common/NewHandler.cpp
HeapAlloc in (included to beta 30) was changed to malloc.
HeapAlloc worked slower in Win95/98/Me.
Version 2.30 Beta 30 2003-04-21
--------------------------------------
new file: Common/String.cpp
Common/NewHandler.* were changed
4.57
----
- Bug was fixed:
Anti item is created for wrong file:
http://sourceforge.net/forum/forum.php?thread_id=1880366&forum_id=45798
Version 2.30 Beta 29 2003-04-07
--------------------------------------
Small changes in LZMA code.
4.52 beta 2007-07-32
-------------------------
- 7-Zip could not decompress some cab files
- "." dir creating at FAT was fixed / long names
Version 2.30 Beta 28 2003-02-16
--------------------------------------
Processing anti-files was corrected.
Version 2.30 Beta 27 2003-01-24
--------------------------------------
Project/Archiver/Format/Common/ArchiveInterface.h:
new IArchiveOpenVolumeCallback interface.
Version 2.30 Beta 26 2003-01-12
--------------------------------------
SDK/Interface/PropID.h:
kpidComment now is kpidCommented
Version 2.30 Beta 25 2003-01-02
--------------------------------------
Main archive interfaces were changed.
Version 2.30 Beta 24 2002-11-01
--------------------------------------
SDK/Windows/Synchronization.h
SDK/Windows/Synchronization.cpp
- some changes.
Version 2.30 Beta 23 2002-09-07
--------------------------------------
Project/FileManager folder was added.
Notation of some source files was changed.
Version 2.30 Beta 22 2002-08-28
--------------------------------------
Project/FileManager folder was added.
Notation of some source files was changed.
4.50 beta 2007-07-24
-------------------------
- 7-Zip now replaces unsupported filenames (like "nul", "com1") during extracting.
- New switch for command line version:
-ssc[-] enables/disables case-sensitive mode.
- 7z.exe l shows archive comment for zip archives
- Some bugs were fixed: long paths names shorter than 4.
- Speed optimizations for AES encryption.
Version 2.30 Beta 21 2002-07-08
--------------------------------------
Project/Compress/LZ/MatchFinder/BinTree/BinTree.h
Project/Compress/LZ/MatchFinder/BinTree/BinTreeMain.h
Project/Compress/LZ/MatchFinder/BinTree/HC.h
Project/Compress/LZ/MatchFinder/BinTree/HCMain.h
- RAM requirements for LZMA (7z) compression were reduced.
4.56 beta 2007-09-13
-------------------------
- some fixes in LZ encoder (LZMA and Deflate) code.
size_t was replaces to ptrdiff_t.
size_t version worked incorrectly with some compilers.
Version 2.30 Beta 20 2002-07-01
--------------------------------------
- SDK/Stream/WindowOut.h
now it uses only required memory (dictionary size).
- Project/Archiver/Resource
contains common resurces
Version 2.30 Beta 19 2002-04-11
--------------------------------------
- SDK/Archive/Rar/Handler.cpp
supporting RAR29
Version 2.30 Beta 18 2002-03-25
--------------------------------------
- SDK/Archive/Cab/MSZipDecoder.cpp
SDK/Archive/Cab/LZXDecoder.cpp:
bug with corrupted archives was fixed
- Project/Compress/LZ/MatchFinder/BinTree/BinTree.h
- Project/Compress/LZ/MatchFinder/BinTree/BinTreeMain.h
some speed optimization (using prefetching)
Version 2.30 Beta 17 2002-03-03
--------------------------------------
- ARJ suppport.
Version 2.30 Beta 16 2002-02-24
--------------------------------------
- Project/Compress/LZ/LZMA/Decoder.cpp:
Bug was fixed: LZMA could not extract more than 4 GB.
- RPM and CPIO formats.
- Project/Compress/LZ/LZMA/Encoder.*
Project/Archiver/Format/7z/OutHandler.cpp
New fast compression mode for LZMA: -m0a=0.
- New match finders for LZMA: bt4b, hc3, hc4.
Version 2.30 Beta 15 2002-02-17
--------------------------------------
- Compression ratio in LZMA was slightly improved:
Project/Compress/LZ/LZMA/Encoder.*
Project/Archiver/Format/7z/OutHandler.cpp
Version 2.30 Beta 14 2002-02-10
--------------------------------------
- Supporting multithreading for LZMA:
Project/Compress/LZ/MatchFinder/MT
- Common/String.h:
CStringBase::Replace function was fixed.
Version 2.30 Beta 13 2002-01-27
--------------------------------------
- Compress/LZ/MatchFinder/BinTree3.h:
method
- Compress/LZ/MatchFinder/BinTreemain.h:
- one VirtualAlloc array was splitted to
the for 3 arrays.
- Hash-functions were changed.
4.46 beta 2007-05-25
-------------------------
- CPP Synchronization objects now return HRes (error code) instead of bool.
Version 2.30 Beta 12 2002-01-16
--------------------------------------
- Compress/LZ/MatchFinder/BinTreemain.h:
Compress/LZ/MatchFinder/Patricia.h:
Compress/PPM/PPMd/SubAlloc.h:
Beta 11 bugs were fixed:
- VirtualFree was used incorrectly
- checking WIN32 instead _WINDOWS.
Compress/LZ/MatchFinder/Patricia.h:
Beta 11 bug with deleting m_Hash2Descendants was fixed.
4.45 beta 2007-04-16
-------------------------
- 7-Zip now uses C version of CRC, so you must call CrcGenerateTable at
stratup code, or you must add CPP/Common/CRC.cpp to your project.
- Method ID in .7z now is 63-bit integer (UInt64).
- Open error messages
- unRar 1.5 fixed
- unShrink fixed
- BUG of 4.43 beta and 4.44 beta was fixed.
7-Zip compressing to .zip in multi-threading mode didn't work in some cases.
Version 2.30 Beta 11 2002-01-15
--------------------------------------
- Compress/LZ/MatchFinder/BinTreemain.h:
Compress/LZ/MatchFinder/Patricia.h:
Compress/PPM/PPMd/SubAlloc.h:
using VirtualAlloc for memory allocating
- Exlorer/ContextMenu.cpp:
Testing supporting.
CreateProcess instead WinExec
- Format/Common/IArchiveHandler.h:
Exlorer/ProxyHandler.cpp:
FAR/Plugin.cpp:
New properties names: Method, HostOS.
- Exlorer/OverwriteDialog.cpp:
FAR/OverwriteDialog.cpp:
Windows/PropVariantConversions.h
Using National time format was eliminated.
4.44 beta 2007-01-20
-------------------------
- Bug was fixed: LZMAEncoder.cpp::CEncoder::GetOptimumFast
it was:
data++
fixed version:
data = _matchFinder.GetPointerToCurrentPos(_matchFinderObj) - 1;
It could lead to very small cpmpression ratio decreasing when block needs move.
4.30 beta 2005-11-18
-------------------------
- Security.h::AddLockMemoryPrivilege - installs "Large pages" feature
- MemoryLock.h::EnableLockMemoryPrivilege - enables "Large pages" feature
- Alloc.h::SetLargePageSize - sets optimal LargePageSize size
4.27 2005-09-21
-------------------------
- Some GUIDs/interfaces were changed.
IStream.h:
ISequentialInStream::Read now works as old ReadPart
ISequentialOutStream::Write now works as old WritePart
4.26 beta 2005-08-05
-------------------------
- MyAlloc(0)/BigAlloc(0) now return 0
4.25 beta 2005-07-31
-------------------------
- More 64-bit compatibilty
4.24 beta 2005-07-06
-------------------------
- Common\NewHandler.h: using throw() for code size optimization.
4.23 2005-06-29
-------------------------
- Bug was fixed: memory leak in Cab decoder.
4.19 beta 2005-05-21
-------------------------
- BZip2 code was rewritten. Now 7-Zip doesn't use original BZip2 code.
Old (original) version was moved to folder 7zip/Compress/BZip2Original/
4.14 beta 2005-01-11
-------------------------
- STL using was reduced
- 7za now supports Split(001) archves
4.10 beta 2004-10-21
-------------------------
- Codecs now use new interface: ICompressSetDecoderProperties2
4.07 beta 2004-10-03
-------------------------
- some interfaces were changed slightly to support
-stdin -stdout mode.
- FilterCoder for simple filters
- Wildcard censor class was changed.
- Bug was fixed: when encrypted stream was multiple 16,
it used additional 16 empty bytes.
3.11 2003-10-06
-------------------------
File functions support unicode strings even
on Windows 95/98/ME.
3.08.02 2003-09-20
-------------------------
More compatible with GCC.
3.08.02 beta 2003-08-20
-------------------------
Extracting bug in 7zExtract.cpp was fixed.
3.08 beta 2003-08-19
-------------------------
Big source code reconstruction.
2.30 Beta 32 2003-05-15
-------------------------
Small changes in Deflate decoder.
2.30 Beta 31 2003-04-29
-------------------------
Common/NewHandler.cpp
HeapAlloc in (included to beta 30) was changed to malloc.
HeapAlloc worked slower in Win95/98/Me.
2.30 Beta 30 2003-04-21
-------------------------
new file: Common/String.cpp
Common/NewHandler.* were changed
2.30 Beta 29 2003-04-07
-------------------------
Small changes in LZMA code.
2.30 Beta 28 2003-02-16
-------------------------
Processing anti-files was corrected.
2.30 Beta 27 2003-01-24
-------------------------
Project/Archiver/Format/Common/ArchiveInterface.h:
new IArchiveOpenVolumeCallback interface.
2.30 Beta 26 2003-01-12
-------------------------
SDK/Interface/PropID.h:
kpidComment now is kpidCommented
2.30 Beta 25 2003-01-02
-------------------------
Main archive interfaces were changed.
2.30 Beta 24 2002-11-01
-------------------------
SDK/Windows/Synchronization.h
SDK/Windows/Synchronization.cpp
- some changes.
2.30 Beta 23 2002-09-07
-------------------------
Project/FileManager folder was added.
Notation of some source files was changed.
2.30 Beta 22 2002-08-28
-------------------------
Project/FileManager folder was added.
Notation of some source files was changed.
Version 2.30 Beta 10 2002-01-11
--------------------------------------
- Exlorer/ContextMenu.cpp: bug with context menu on
Windows NT4 in Unicode version was fixed.
- Format/7z/UpdateArchiveEngine.cpp: bug was fixed -
Updating in Beta 8 and 9 didn't work.
- Exlorer/CCompressDialog.cpp: history growing bug was fixed.
2.30 Beta 21 2002-07-08
-------------------------
Project/Compress/LZ/MatchFinder/BinTree/BinTree.h
Project/Compress/LZ/MatchFinder/BinTree/BinTreeMain.h
Project/Compress/LZ/MatchFinder/BinTree/HC.h
Project/Compress/LZ/MatchFinder/BinTree/HCMain.h
- RAM requirements for LZMA (7z) compression were reduced.
Version 2.30 Beta 9 2002-01-08
--------------------------------------
- SDK/Common/Vector.h: sopporting sorted object vectors .
- Lang features.
- Two new match finders: pat3h and pat4h.
- SDK/Archive/Zip/InEngine.cpp: bug was fixed.
- SDK/Windows/FileDir.cpp: function CreateComplexDirectory
was changed.
2.30 Beta 20 2002-07-01
-------------------------
- SDK/Stream/WindowOut.h
now it uses only required memory (dictionary size).
- Project/Archiver/Resource
contains common resurces
2.30 Beta 19 2002-04-11
-------------------------
- SDK/Archive/Rar/Handler.cpp
supporting RAR29
2.30 Beta 18 2002-03-25
-------------------------
- SDK/Archive/Cab/MSZipDecoder.cpp
SDK/Archive/Cab/LZXDecoder.cpp:
bug with corrupted archives was fixed
- Project/Compress/LZ/MatchFinder/BinTree/BinTree.h
- Project/Compress/LZ/MatchFinder/BinTree/BinTreeMain.h
some speed optimization (using prefetching)
2.30 Beta 17 2002-03-03
-------------------------
- ARJ suppport.
2.30 Beta 16 2002-02-24
-------------------------
- Project/Compress/LZ/LZMA/Decoder.cpp:
Bug was fixed: LZMA could not extract more than 4 GB.
- RPM and CPIO formats.
- Project/Compress/LZ/LZMA/Encoder.*
Project/Archiver/Format/7z/OutHandler.cpp
New fast compression mode for LZMA: -m0a=0.
- New match finders for LZMA: bt4b, hc3, hc4.
2.30 Beta 15 2002-02-17
-------------------------
- Compression ratio in LZMA was slightly improved:
Project/Compress/LZ/LZMA/Encoder.*
Project/Archiver/Format/7z/OutHandler.cpp
2.30 Beta 14 2002-02-10
-------------------------
- Supporting multithreading for LZMA:
Project/Compress/LZ/MatchFinder/MT
- Common/String.h:
CStringBase::Replace function was fixed.
2.30 Beta 13 2002-01-27
-------------------------
- Compress/LZ/MatchFinder/BinTree3.h:
method
- Compress/LZ/MatchFinder/BinTreemain.h:
- one VirtualAlloc array was splitted to
the for 3 arrays.
- Hash-functions were changed.
2.30 Beta 12 2002-01-16
-------------------------
- Compress/LZ/MatchFinder/BinTreemain.h:
Compress/LZ/MatchFinder/Patricia.h:
Compress/PPM/PPMd/SubAlloc.h:
Beta 11 bugs were fixed:
- VirtualFree was used incorrectly
- checking WIN32 instead _WINDOWS.
Compress/LZ/MatchFinder/Patricia.h:
Beta 11 bug with deleting m_Hash2Descendants was fixed.
2.30 Beta 11 2002-01-15
-------------------------
- Compress/LZ/MatchFinder/BinTreemain.h:
Compress/LZ/MatchFinder/Patricia.h:
Compress/PPM/PPMd/SubAlloc.h:
using VirtualAlloc for memory allocating
- Exlorer/ContextMenu.cpp:
Testing supporting.
CreateProcess instead WinExec
- Format/Common/IArchiveHandler.h:
Exlorer/ProxyHandler.cpp:
FAR/Plugin.cpp:
New properties names: Method, HostOS.
- Exlorer/OverwriteDialog.cpp:
FAR/OverwriteDialog.cpp:
Windows/PropVariantConversions.h
Using National time format was eliminated.
2.30 Beta 10 2002-01-11
-------------------------
- Exlorer/ContextMenu.cpp: bug with context menu on
Windows NT4 in Unicode version was fixed.
- Format/7z/UpdateArchiveEngine.cpp: bug was fixed -
Updating in Beta 8 and 9 didn't work.
- Exlorer/CCompressDialog.cpp: history growing bug was fixed.
2.30 Beta 9 2002-01-08
-------------------------
- SDK/Common/Vector.h: sopporting sorted object vectors .
- Lang features.
- Two new match finders: pat3h and pat4h.
- SDK/Archive/Zip/InEngine.cpp: bug was fixed.
- SDK/Windows/FileDir.cpp: function CreateComplexDirectory
was changed.
+298 -307
View File
@@ -1,7 +1,7 @@
LZMA SDK 4.49
-------------
LZMA SDK 4.58 beta
------------------
LZMA SDK Copyright (C) 1999-2007 Igor Pavlov
LZMA SDK Copyright (C) 1999-2008 Igor Pavlov
LZMA SDK provides the documentation, samples, header files, libraries,
and tools you need to develop applications that use LZMA compression.
@@ -24,26 +24,21 @@ LZMA SDK is available under any of the following licenses:
1) GNU Lesser General Public License (GNU LGPL)
2) Common Public License (CPL)
3) Simplified license for unmodified code (read SPECIAL EXCEPTION)
4) Proprietary license
3) Common Development and Distribution License (CDDL) Version 1.0
4) Simplified license for unmodified code (read SPECIAL EXCEPTION)
It means that you can select one of these four options and follow rules of that license.
It means that you can select one of these options and follow rules of that license.
1,2) GNU LGPL and CPL licenses are pretty similar and both these
licenses are classified as
1,2,3) GNU LGPL, CPL and CDDL licenses are classified as
- "Free software licenses" at http://www.gnu.org/
- "OSI-approved" at http://www.opensource.org/
3) SPECIAL EXCEPTION
4) Simplified license for unmodified code (read SPECIAL EXCEPTION)
Igor Pavlov, as the author of this code, expressly permits you
to statically or dynamically link your code (or bind by name)
to the files from LZMA SDK without subjecting your linked
code to the terms of the CPL or GNU LGPL.
Any modifications or additions to files from LZMA SDK, however,
are subject to the GNU LGPL or CPL terms.
to the files from LZMA SDK.
SPECIAL EXCEPTION allows you to use LZMA SDK in applications with closed code,
while you keep LZMA SDK code unmodified.
@@ -56,27 +51,21 @@ Agreement you have for any previous version of LZMA SDK developed by Igor Pavlov
SPECIAL EXCEPTION #2 allows owners of proprietary licenses to use latest version
of LZMA SDK as update for previous versions.
Some files in LZMA SDK are placed in public domain.
Some of these "public domain" files:
C\Types.h,
C\LzmaLib.*
C\LzmaLibUtil.*
LzmaAlone.cpp,
LzmaAlone.cs,
LzmaAlone.java
SPECIAL EXCEPTION #3: Igor Pavlov, as the author of this code, expressly permits
you to use code of the following files:
BranchTypes.h, LzmaTypes.h, LzmaTest.c, LzmaStateTest.c, LzmaAlone.cpp,
LzmaAlone.cs, LzmaAlone.java
as public domain code.
So you can change them as you want and use "SPECIAL EXCEPTION"
for other unmodified files. For example, you can edit C\Types.h to solve some
compatibility problems with your compiler.
4) Proprietary license
LZMA SDK also can be available under a proprietary license which
can include:
1) Right to modify code without subjecting modified code to the
terms of the CPL or GNU LGPL
2) Technical support for code
To request such proprietary license or any additional consultations,
send email message from that page:
http://www.7-zip.org/support.html
-----
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
@@ -85,92 +74,82 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
You should have received a copy of the Common Public License
along with this library.
You should have received a copy of the Common Development and Distribution
License Version 1.0 along with this library.
LZMA SDK Contents
-----------------
LZMA SDK includes:
- C++ source code of LZMA compressing and decompressing
- ANSI-C compatible source code for LZMA decompressing
- C# source code for LZMA compressing and decompressing
- Java source code for LZMA compressing and decompressing
- ANSI-C/C++/C#/Java source code for LZMA compressing and decompressing
- Compiled file->file LZMA compressing/decompressing program for Windows system
ANSI-C 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.
UNIX/Linux version
------------------
To compile C++ version of file->file LZMA, go to directory
C/7zip/Compress/LZMA_Alone
and type "make" or "make clean all" to recompile all.
To compile C++ version of file->file LZMA encoding, go to directory
C++/7zip/Compress/LZMA_Alone
and call make to recompile it:
make -f makefile.gcc clean all
In some UNIX/Linux versions you must compile LZMA with static libraries.
To compile with static libraries, change string in makefile
LIB = -lm
to string
To compile with static libraries, you can use
LIB = -lm -static
Files
---------------------
C - C source code
CPP - CPP source code
CS - C# source code
Java - Java source code
lzma.txt - LZMA SDK description (this file)
lzma.txt - LZMA SDK description (this file)
7zFormat.txt - 7z Format description
7zC.txt - 7z ANSI-C Decoder description (this file)
7zC.txt - 7z ANSI-C Decoder description
methods.txt - Compression method IDs for .7z
LGPL.txt - GNU Lesser General Public License
CPL.html - Common Public License
lzma.exe - Compiled file->file LZMA encoder/decoder for Windows
history.txt - history of the LZMA SDK
lzma.exe - Compiled file->file LZMA encoder/decoder for Windows
history.txt - history of the LZMA SDK
LGPL.txt - GNU Lesser General Public License
CPL.html - Common Public License
CDDL.html - Common Development and Distribution License (CDDL)
Source code structure
---------------------
C - C files
Compress - files related to compression/decompression
Lz - files related to LZ (Lempel-Ziv) compression algorithm
Lzma - ANSI-C compatible LZMA decompressor
C/ - C files
7zCrc*.* - CRC code
Alloc.* - Memory allocation functions
Bra*.* - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
LzFind.* - Match finder for LZ (LZMA) encoders
LzFindMt.* - Match finder for LZ (LZMA) encoders for multithreading encoding
LzHash.h - Additional file for LZ match finder
LzmaDec.* - LZMA decoding
LzmaEnc.* - LZMA encoding
LzmaLib.* - LZMA Library for DLL calling
Types.h - Basic types for another .c files
Threads.* - The code for multithreading.
LzmaDecode.h - interface for LZMA decoding on ANSI-C
LzmaDecode.c - LZMA decoding on ANSI-C (new fastest version)
LzmaDecodeSize.c - LZMA decoding on ANSI-C (old size-optimized version)
LzmaTest.c - test application that decodes LZMA encoded file
LzmaTypes.h - basic types for LZMA Decoder
LzmaStateDecode.h - interface for LZMA decoding (State version)
LzmaStateDecode.c - LZMA decoding on ANSI-C (State version)
LzmaStateTest.c - test application (State version)
Branch - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
LzmaLib - LZMA Library (.DLL for Windows)
LzmaUtil - LZMA Utility (file->file LZMA encoder/decoder).
Archive - files related to archiving
7z_C - 7z ANSI-C Decoder
7z - 7z ANSI-C Decoder
CPP -- CPP files
CPP/ -- CPP files
Common - common files for C++ projects
Windows - common files for Windows related code
7zip - files related to 7-Zip Project
Common - common files for 7-Zip
Compress - files related to compression/decompression
LZ - files related to LZ (Lempel-Ziv) compression algorithm
Copy - Copy coder
RangeCoder - Range Coder (special code of compression/decompression)
LZMA - LZMA compression/decompression on C++
LZMA_Alone - file->file LZMA compression/decompression
Branch - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
Archive - files related to archiving
@@ -192,7 +171,7 @@ CPP -- CPP files
CS - C# files
CS/ - C# files
7zip
Common - some common files for 7-Zip
Compress - files related to compression/decompression
@@ -201,46 +180,40 @@ CS - C# files
LzmaAlone - file->file LZMA compression/decompression
RangeCoder - Range Coder (special code of compression/decompression)
Java - Java files
Java/ - Java files
SevenZip
Compression - files related to compression/decompression
LZ - files related to LZ (Lempel-Ziv) compression algorithm
LZMA - LZMA compression/decompression
RangeCoder - Range Coder (special code of compression/decompression)
C/C++ source code of LZMA SDK is part of 7-Zip project.
You can find ANSI-C LZMA decompressing code at folder
C/7zip/Compress/Lzma
7-Zip doesn't use that ANSI-C LZMA code and that code was developed
specially for this SDK. And files from C/7zip/Compress/Lzma do not need
files from other directories of SDK for compiling.
7-Zip source code can be downloaded from 7-Zip's SourceForge page:
http://sourceforge.net/projects/sevenzip/
LZMA features
-------------
- Variable dictionary size (up to 1 GB)
- Estimated compressing speed: about 1 MB/s on 1 GHz CPU
- Estimated compressing speed: about 2 MB/s on 2 GHz CPU
- Estimated decompressing speed:
- 8-12 MB/s on 1 GHz Intel Pentium 3 or AMD Athlon
- 500-1000 KB/s on 100 MHz ARM, MIPS, PowerPC or other simple RISC
- Small memory requirements for decompressing (8-32 KB + DictionarySize)
- Small code size for decompressing: 2-8 KB (depending from
speed optimizations)
- 20-30 MB/s on 2 GHz Core 2 or AMD Athlon 64
- 1-2 MB/s on 200 MHz ARM, MIPS, PowerPC or other simple RISC
- Small memory requirements for decompressing (16 KB + DictionarySize)
- Small code size for decompressing: 5-8 KB
LZMA decoder uses only integer operations and can be
implemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions).
Some critical operations that affect to speed of LZMA decompression:
Some critical operations that affect the speed of LZMA decompression:
1) 32*16 bit integer multiply
2) Misspredicted branches (penalty mostly depends from pipeline length)
3) 32-bit shift and arithmetic operations
Speed of LZMA decompressing mostly depends from CPU speed.
The speed of LZMA decompressing mostly depends from CPU speed.
Memory speed has no big meaning. But if your CPU has small data cache,
overall weight of memory speed will slightly increase.
@@ -260,11 +233,11 @@ Usage: LZMA <e|d> inputFile outputFile [<switches>...]
b: Benchmark. There are two tests: compressing and decompressing
with LZMA method. Benchmark shows rating in MIPS (million
instructions per second). Rating value is calculated from
measured speed and it is normalized with AMD Athlon 64 X2 CPU
results. Also Benchmark checks possible hardware errors (RAM
measured speed and it is normalized with Intel's Core 2 results.
Also Benchmark checks possible hardware errors (RAM
errors in most cases). Benchmark uses these settings:
(-a1, -d21, -fb32, -mfbt4). You can change only -d. Also you
can change number of iterations. Example for 30 iterations:
(-a1, -d21, -fb32, -mfbt4). You can change only -d parameter.
Also you can change the number of iterations. Example for 30 iterations:
LZMA b 30
Default number of iterations is 10.
@@ -345,32 +318,29 @@ Compression ratio hints
Recommendations
---------------
To increase compression ratio for LZMA compressing it's desirable
To increase the compression ratio for LZMA compressing it's desirable
to have aligned data (if it's possible) and also it's desirable to locate
data in such order, where code is grouped in one place and data is
grouped in other place (it's better than such mixing: code, data, code,
data, ...).
Using Filters
-------------
You can increase compression ratio for some data types, using
Filters
-------
You can increase the compression ratio for some data types, using
special filters before compressing. For example, it's possible to
increase compression ratio on 5-10% for code for those CPU ISAs:
increase the compression ratio on 5-10% for code for those CPU ISAs:
x86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC.
You can find C/C++ source code of such filters in folder "7zip/Compress/Branch"
You can find C source code of such filters in C/Bra*.* files
You can check compression ratio gain of these filters with such
You can check the compression ratio gain of these filters with such
7-Zip commands (example for ARM code):
No filter:
7z a a1.7z a.bin -m0=lzma
With filter for little-endian ARM code:
7z a a2.7z a.bin -m0=bc_arm -m1=lzma
With filter for big-endian ARM code (using additional Swap4 filter):
7z a a3.7z a.bin -m0=swap4 -m1=bc_arm -m2=lzma
7z a a2.7z a.bin -m0=arm -m1=lzma
It works in such manner:
Compressing = Filter_encoding + LZMA_encoding
@@ -383,8 +353,7 @@ since compression ratio with filtering is higher.
These filters convert CALL (calling procedure) instructions
from relative offsets to absolute addresses, so such data becomes more
compressible. Source code of these CALL filters is pretty simple
(about 20 lines of C++), so you can convert it from C++ version yourself.
compressible.
For some ISAs (for example, for MIPS) it's impossible to get gain from such filter.
@@ -392,7 +361,7 @@ For some ISAs (for example, for MIPS) it's impossible to get gain from such filt
LZMA compressed file format
---------------------------
Offset Size Description
0 1 Special LZMA properties for compressed data
0 1 Special LZMA properties (lc,lp, pb in encoded form)
1 4 Dictionary size (little endian)
5 8 Uncompressed size (little endian). -1 means unknown size
13 Compressed data
@@ -401,263 +370,285 @@ Offset Size Description
ANSI-C LZMA Decoder
~~~~~~~~~~~~~~~~~~~
To compile ANSI-C LZMA Decoder you can use one of the following files sets:
1) LzmaDecode.h + LzmaDecode.c + LzmaTest.c (fastest version)
2) LzmaDecode.h + LzmaDecodeSize.c + LzmaTest.c (old size-optimized version)
3) LzmaStateDecode.h + LzmaStateDecode.c + LzmaStateTest.c (zlib-like interface)
Please note that interfaces for ANSI-C code were changed in LZMA SDK 4.58.
If you want to use old interfaces you can download previous version of LZMA SDK
from sourceforge.net site.
To use ANSI-C LZMA Decoder you need the following files:
1) LzmaDec.h + LzmaDec.c + Types.h
LzmaUtil/LzmaUtil.c is example application that uses these files.
Memory requirements for LZMA decoding
-------------------------------------
LZMA decoder doesn't allocate memory itself, so you must
allocate memory and send it to LZMA.
Stack usage of LZMA decoding function for local variables is not
larger than 200 bytes.
larger than 200-400 bytes.
LZMA Decoder uses dictionary buffer and internal state structure.
Internal state structure consumes
state_size = (4 + (1.5 << (lc + lp))) KB
by default (lc=3, lp=0), state_size = 16 KB.
How To decompress data
----------------------
LZMA Decoder (ANSI-C version) now supports 5 interfaces:
LZMA Decoder (ANSI-C version) now supports 2 interfaces:
1) Single-call Decompressing
2) Single-call Decompressing with input stream callback
3) Multi-call Decompressing with output buffer
4) Multi-call Decompressing with input callback and output buffer
5) Multi-call State Decompressing (zlib-like interface)
2) Multi-call State Decompressing (zlib-like interface)
Variant-5 is similar to Variant-4, but Variant-5 doesn't use callback functions.
You must use external allocator:
Example:
void *SzAlloc(void *p, size_t size) { p = p; return malloc(size); }
void SzFree(void *p, void *address) { p = p; free(address); }
ISzAlloc alloc = { SzAlloc, SzFree };
Decompressing steps
-------------------
1) read LZMA properties (5 bytes):
unsigned char properties[LZMA_PROPERTIES_SIZE];
2) read uncompressed size (8 bytes, little-endian)
3) Decode properties:
CLzmaDecoderState state; /* it's 24-140 bytes structure, if int is 32-bit */
if (LzmaDecodeProperties(&state.Properties, properties, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK)
return PrintError(rs, "Incorrect stream properties");
4) Allocate memory block for internal Structures:
state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
if (state.Probs == 0)
return PrintError(rs, kCantAllocateMessage);
LZMA decoder uses array of CProb variables as internal structure.
By default, CProb is unsigned_short. But you can define _LZMA_PROB32 to make
it unsigned_int. It can increase speed on some 32-bit CPUs, but memory
usage will be doubled in that case.
You can use p = p; operator to disable compiler warnings.
5) Main Decompressing
You must use one of the following interfaces:
5.1 Single-call Decompressing
-----------------------------
Single-call Decompressing
-------------------------
When to use: RAM->RAM decompressing
Compile files: LzmaDecode.h, LzmaDecode.c
Compile files: LzmaDec.h + LzmaDec.c + Types.h
Compile defines: no defines
Memory Requirements:
- Input buffer: compressed size
- Output buffer: uncompressed size
- LZMA Internal Structures (~16 KB for default settings)
- LZMA Internal Structures: state_size (16 KB for default settings)
Interface:
int res = LzmaDecode(&state,
inStream, compressedSize, &inProcessed,
outStream, outSize, &outProcessed);
int LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
ELzmaStatus *status, ISzAlloc *alloc);
In:
dest - output data
destLen - output data size
src - input data
srcLen - input data size
propData - LZMA properties (5 bytes)
propSize - size of propData buffer (5 bytes)
finishMode - It has meaning only if the decoding reaches output limit (*destLen).
LZMA_FINISH_ANY - Decode just destLen bytes.
LZMA_FINISH_END - Stream must be finished after (*destLen).
You can use LZMA_FINISH_END, when you know that
current output buffer covers last bytes of stream.
alloc - Memory allocator.
Out:
destLen - processed output size
srcLen - processed input size
Output:
SZ_OK
status:
LZMA_STATUS_FINISHED_WITH_MARK
LZMA_STATUS_NOT_FINISHED
LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
SZ_ERROR_DATA - Data error
SZ_ERROR_MEM - Memory allocation error
SZ_ERROR_UNSUPPORTED - Unsupported properties
SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
If LZMA decoder sees end_marker before reaching output limit, it returns OK result,
and output value of destLen will be less than output buffer size limit.
You can use multiple checks to test data integrity after full decompression:
1) Check Result and "status" variable.
2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
You must use correct finish mode in that case. */
5.2 Single-call Decompressing with input stream callback
--------------------------------------------------------
When to use: File->RAM or Flash->RAM decompressing.
Compile files: LzmaDecode.h, LzmaDecode.c
Compile defines: _LZMA_IN_CB
Memory Requirements:
- Buffer for input stream: any size (for example, 16 KB)
- Output buffer: uncompressed size
- LZMA Internal Structures (~16 KB for default settings)
Multi-call State Decompressing (zlib-like interface)
----------------------------------------------------
Interface:
typedef struct _CBuffer
{
ILzmaInCallback InCallback;
FILE *File;
unsigned char Buffer[kInBufferSize];
} CBuffer;
int LzmaReadCompressed(void *object, const unsigned char **buffer, SizeT *size)
{
CBuffer *bo = (CBuffer *)object;
*buffer = bo->Buffer;
*size = MyReadFile(bo->File, bo->Buffer, kInBufferSize);
return LZMA_RESULT_OK;
}
CBuffer g_InBuffer;
g_InBuffer.File = inFile;
g_InBuffer.InCallback.Read = LzmaReadCompressed;
int res = LzmaDecode(&state,
&g_InBuffer.InCallback,
outStream, outSize, &outProcessed);
5.3 Multi-call decompressing with output buffer
-----------------------------------------------
When to use: RAM->File decompressing
Compile files: LzmaDecode.h, LzmaDecode.c
Compile defines: _LZMA_OUT_READ
Memory Requirements:
- Input buffer: compressed size
- Buffer for output stream: any size (for example, 16 KB)
- LZMA Internal Structures (~16 KB for default settings)
- LZMA dictionary (dictionary size is encoded in stream properties)
Interface:
state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize);
LzmaDecoderInit(&state);
do
{
LzmaDecode(&state,
inBuffer, inAvail, &inProcessed,
g_OutBuffer, outAvail, &outProcessed);
inAvail -= inProcessed;
inBuffer += inProcessed;
}
while you need more bytes
see LzmaTest.c for more details.
5.4 Multi-call decompressing with input callback and output buffer
------------------------------------------------------------------
When to use: File->File decompressing
Compile files: LzmaDecode.h, LzmaDecode.c
Compile defines: _LZMA_IN_CB, _LZMA_OUT_READ
Memory Requirements:
- Buffer for input stream: any size (for example, 16 KB)
- Buffer for output stream: any size (for example, 16 KB)
- LZMA Internal Structures (~16 KB for default settings)
- LZMA dictionary (dictionary size is encoded in stream properties)
Interface:
state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize);
LzmaDecoderInit(&state);
do
{
LzmaDecode(&state,
&bo.InCallback,
g_OutBuffer, outAvail, &outProcessed);
}
while you need more bytes
see LzmaTest.c for more details:
5.5 Multi-call State Decompressing (zlib-like interface)
------------------------------------------------------------------
When to use: file->file decompressing
Compile files: LzmaStateDecode.h, LzmaStateDecode.c
Compile defines:
Compile files: LzmaDec.h + LzmaDec.c + Types.h
Memory Requirements:
- Buffer for input stream: any size (for example, 16 KB)
- Buffer for output stream: any size (for example, 16 KB)
- LZMA Internal Structures (~16 KB for default settings)
- LZMA dictionary (dictionary size is encoded in stream properties)
Interface:
- LZMA Internal Structures: state_size (16 KB for default settings)
- LZMA dictionary (dictionary size is encoded in LZMA properties header)
state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize);
1) read LZMA properties (5 bytes) and uncompressed size (8 bytes, little-endian) to header:
unsigned char header[LZMA_PROPERTIES_SIZE + 8];
ReadFile(inFile, header, sizeof(header)
LzmaDecoderInit(&state);
do
2) Allocate CLzmaDec structures (state + dictionary) using LZMA properties
CLzmaDec state;
LzmaDec_Constr(&state);
res = LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc);
if (res != SZ_OK)
return res;
3) Init LzmaDec structure before any new LZMA stream. And call LzmaDec_DecodeToBuf in loop
LzmaDec_Init(&state);
for (;;)
{
res = LzmaDecode(&state,
inBuffer, inAvail, &inProcessed,
g_OutBuffer, outAvail, &outProcessed,
finishDecoding);
inAvail -= inProcessed;
inBuffer += inProcessed;
...
int res = LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode);
...
}
while you need more bytes
see LzmaStateTest.c for more details:
6) Free all allocated blocks
4) Free all allocated structures
LzmaDec_Free(&state, &g_Alloc);
For full code example, look at C/LzmaUtil/LzmaUtil.c code.
Note
----
LzmaDecodeSize.c is size-optimized version of LzmaDecode.c.
But compiled code of LzmaDecodeSize.c can be larger than
compiled code of LzmaDecode.c. So it's better to use
LzmaDecode.c in most cases.
How To compress data
--------------------
Compile files: LzmaEnc.h + LzmaEnc.c + Types.h +
LzFind.c + LzFind.h + LzFindMt.c + LzFindMt.h + LzHash.h
Memory Requirements:
- (dictSize * 11.5 + 6 MB) + state_size
Lzma Encoder can use two memory allocators:
1) alloc - for small arrays.
2) allocBig - for big arrays.
For example, you can use Large RAM Pages (2 MB) in allocBig allocator for
better compression speed. Note that Windows has bad implementation for
Large RAM Pages.
It's OK to use same allocator for alloc and allocBig.
EXIT codes
-----------
Single-call Compression with callbacks
--------------------------------------
LZMA decoder can return one of the following codes:
Check C/LzmaUtil/LzmaUtil.c as example,
#define LZMA_RESULT_OK 0
#define LZMA_RESULT_DATA_ERROR 1
When to use: file->file decompressing
If you use callback function for input data and you return some
error code, LZMA Decoder also returns that code.
1) you must implement callback structures for interfaces:
ISeqInStream
ISeqOutStream
ICompressProgress
ISzAlloc
static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }
static void SzFree(void *p, void *address) { p = p; MyFree(address); }
static ISzAlloc g_Alloc = { SzAlloc, SzFree };
CFileSeqInStream inStream;
CFileSeqOutStream outStream;
inStream.funcTable.Read = MyRead;
inStream.file = inFile;
outStream.funcTable.Write = MyWrite;
outStream.file = outFile;
2) Create CLzmaEncHandle object;
CLzmaEncHandle enc;
enc = LzmaEnc_Create(&g_Alloc);
if (enc == 0)
return SZ_ERROR_MEM;
3) initialize CLzmaEncProps properties;
LzmaEncProps_Init(&props);
Then you can change some properties in that structure.
4) Send LZMA properties to LZMA Encoder
res = LzmaEnc_SetProps(enc, &props);
5) Write encoded properties to header
Byte header[LZMA_PROPS_SIZE + 8];
size_t headerSize = LZMA_PROPS_SIZE;
UInt64 fileSize;
int i;
res = LzmaEnc_WriteProperties(enc, header, &headerSize);
fileSize = MyGetFileLength(inFile);
for (i = 0; i < 8; i++)
header[headerSize++] = (Byte)(fileSize >> (8 * i));
MyWriteFileAndCheck(outFile, header, headerSize)
6) Call encoding function:
res = LzmaEnc_Encode(enc, &outStream.funcTable, &inStream.funcTable,
NULL, &g_Alloc, &g_Alloc);
7) Destroy LZMA Encoder Object
LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc);
If callback function return some error code, LzmaEnc_Encode also returns that code.
Single-call RAM->RAM Compression
--------------------------------
Single-call RAM->RAM Compression is similar to Compression with callbacks,
but you provide pointers to buffers instead of pointers to stream callbacks:
HRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
Return code:
SZ_OK - OK
SZ_ERROR_MEM - Memory allocation error
SZ_ERROR_PARAM - Incorrect paramater
SZ_ERROR_OUTPUT_EOF - output buffer overflow
SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
LZMA Defines
------------
_LZMA_IN_CB - Use callback for input data
_LZMA_SIZE_OPT - Enable some optimizations in LZMA Decoder to get smaller executable code.
_LZMA_OUT_READ - Use read function for output data
_LZMA_PROB32 - It can increase the speed on some 32-bit CPUs, but memory usage for
some structures will be doubled in that case.
_LZMA_LOC_OPT - Enable local speed optimizations inside code.
_LZMA_LOC_OPT is only for LzmaDecodeSize.c (size-optimized version).
_LZMA_LOC_OPT doesn't affect LzmaDecode.c (speed-optimized version)
and LzmaStateDecode.c
_LZMA_PROB32 - It can increase speed on some 32-bit CPUs,
but memory usage will be doubled in that case
_LZMA_UINT32_IS_ULONG - Define it if int is 16-bit on your compiler
and long is 32-bit.
_LZMA_SYSTEM_SIZE_T - Define it if you want to use system's size_t.
You can use it to enable 64-bit sizes supporting
_LZMA_UINT32_IS_ULONG - Define it if int is 16-bit on your compiler and long is 32-bit.
_LZMA_NO_SYSTEM_SIZE_T - Define it if you don't want to use size_t type.
C++ LZMA Encoder/Decoder
~~~~~~~~~~~~~~~~~~~~~~~~
C++ LZMA code use COM-like interfaces. So if you want to use it,
you can study basics of COM/OLE.
C++ LZMA code is just wrapper over ANSI-C code.
By default, LZMA Encoder contains all Match Finders.
But for compressing it's enough to have just one of them.
So for reducing size of compressing code you can define:
#define COMPRESS_MF_BT
#define COMPRESS_MF_BT4
and it will use only bt4 match finder.
C++ Notes
~~~~~~~~~~~~~~~~~~~~~~~~
If you use some C++ code folders in 7-Zip (for example, C++ code for .7z handling),
you must check that you correctly work with "new" operator.
7-Zip can be compiled with MSVC 6.0 that doesn't throw "exception" from "new" operator.
So 7-Zip uses "CPP\Common\NewHandler.cpp" that redefines "new" operator:
operator new(size_t size)
{
void *p = ::malloc(size);
if (p == 0)
throw CNewException();
return p;
}
If you use MSCV that throws exception for "new" operator, you can compile without
"NewHandler.cpp". So standard exception will be used. Actually some code of
7-Zip catches any exception in internal code and converts it to HRESULT code.
So you don't need to catch CNewException, if you call COM interfaces of 7-Zip.
---
http://www.7-zip.org
http://www.7-zip.org/sdk.html
http://www.7-zip.org/support.html
+5 -1
View File
@@ -1,4 +1,4 @@
7-Zip 4.57 Sources
7-Zip 4.58 Sources
------------------
7-Zip is a file archiver for Windows 95/98/ME/NT/2000/2003/XP/Vista.
@@ -63,6 +63,10 @@ Tools / Options / Directories
To compile 7-Zip for AMD64 and IA64 you need:
Windows Server 2003 SP1 Platform SDK from microsoft.com
Also you need Microsoft Macro Assembler:
- ml.exe for x86
- ml64.exe for AMD64
You can use ml.exe from Windows SDK for Windows Vista or some other version.
Compiling under Unix/Linux