From 2741e0cc8bbc72bbc1f008cff7ef65f182fea864 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Tue, 30 Aug 2016 23:32:33 +0200 Subject: [PATCH] Get rid off pre-compiled lzma host util Import lzma cli utility from LZMA SDK 4.65, from OpenWrt SDK. Remove not needed code, clean rest little bit and enable building it by default, but only for LZMA compressed images. This finally fixes #57. --- .gitignore | 3 + host_util/darwin-x86_64/lzma | Bin 185748 -> 0 bytes host_util/linux-x86_32/lzma | Bin 245760 -> 0 bytes host_util/linux-x86_64/lzma | Bin 714440 -> 0 bytes host_util/lzma/C/7zCrc.c | 35 + host_util/lzma/C/7zCrc.h | 24 + host_util/lzma/C/Alloc.c | 127 ++ host_util/lzma/C/Alloc.h | 32 + host_util/lzma/C/LzFind.c | 751 ++++++++ host_util/lzma/C/LzFind.h | 107 ++ host_util/lzma/C/LzHash.h | 54 + host_util/lzma/C/LzmaDec.c | 1007 ++++++++++ host_util/lzma/C/LzmaDec.h | 223 +++ host_util/lzma/C/LzmaEnc.c | 2283 +++++++++++++++++++++++ host_util/lzma/C/LzmaEnc.h | 72 + host_util/lzma/C/Types.h | 208 +++ host_util/lzma/Common/CRC.cpp | 10 + host_util/lzma/Common/C_FileIO.cpp | 88 + host_util/lzma/Common/C_FileIO.h | 48 + host_util/lzma/Common/Defs.h | 20 + host_util/lzma/Common/MyCom.h | 225 +++ host_util/lzma/Common/MyException.h | 14 + host_util/lzma/Common/MyGuidDef.h | 54 + host_util/lzma/Common/MyInitGuid.h | 15 + host_util/lzma/Common/MyString.cpp | 200 ++ host_util/lzma/Common/MyString.h | 628 +++++++ host_util/lzma/Common/MyUnknown.h | 24 + host_util/lzma/Common/MyVector.cpp | 87 + host_util/lzma/Common/MyVector.h | 250 +++ host_util/lzma/Common/MyWindows.h | 217 +++ host_util/lzma/Common/NewHandler.cpp | 116 ++ host_util/lzma/Common/NewHandler.h | 16 + host_util/lzma/Common/StdAfx.h | 9 + host_util/lzma/Common/StringConvert.cpp | 102 + host_util/lzma/Common/StringConvert.h | 73 + host_util/lzma/Common/StringToInt.cpp | 90 + host_util/lzma/Common/StringToInt.h | 18 + host_util/lzma/Common/Types.h | 14 + host_util/lzma/Exception.h | 45 + host_util/lzma/FileStreams.cpp | 261 +++ host_util/lzma/FileStreams.h | 133 ++ host_util/lzma/ICoder.h | 186 ++ host_util/lzma/IDecl.h | 15 + host_util/lzma/IStream.h | 58 + host_util/lzma/InBuffer.cpp | 83 + host_util/lzma/InBuffer.h | 81 + host_util/lzma/LzmaDecoder.cpp | 190 ++ host_util/lzma/LzmaDecoder.h | 73 + host_util/lzma/LzmaEncoder.cpp | 211 +++ host_util/lzma/LzmaEncoder.h | 64 + host_util/lzma/OutBuffer.cpp | 119 ++ host_util/lzma/OutBuffer.h | 64 + host_util/lzma/StdAfx.h | 9 + host_util/lzma/StreamUtils.cpp | 56 + host_util/lzma/StreamUtils.h | 13 + host_util/lzma/history.txt | 236 +++ host_util/lzma/lzma.txt | 594 ++++++ host_util/lzma/lzma_version.h | 31 + host_util/lzma/lzmp.cpp | 893 +++++++++ host_util/lzma/makefile.gcc | 80 + u-boot/Makefile | 15 +- 61 files changed, 10751 insertions(+), 3 deletions(-) delete mode 100755 host_util/darwin-x86_64/lzma delete mode 100755 host_util/linux-x86_32/lzma delete mode 100755 host_util/linux-x86_64/lzma create mode 100644 host_util/lzma/C/7zCrc.c create mode 100644 host_util/lzma/C/7zCrc.h create mode 100644 host_util/lzma/C/Alloc.c create mode 100644 host_util/lzma/C/Alloc.h create mode 100644 host_util/lzma/C/LzFind.c create mode 100644 host_util/lzma/C/LzFind.h create mode 100644 host_util/lzma/C/LzHash.h create mode 100644 host_util/lzma/C/LzmaDec.c create mode 100644 host_util/lzma/C/LzmaDec.h create mode 100644 host_util/lzma/C/LzmaEnc.c create mode 100644 host_util/lzma/C/LzmaEnc.h create mode 100644 host_util/lzma/C/Types.h create mode 100644 host_util/lzma/Common/CRC.cpp create mode 100644 host_util/lzma/Common/C_FileIO.cpp create mode 100644 host_util/lzma/Common/C_FileIO.h create mode 100644 host_util/lzma/Common/Defs.h create mode 100644 host_util/lzma/Common/MyCom.h create mode 100644 host_util/lzma/Common/MyException.h create mode 100644 host_util/lzma/Common/MyGuidDef.h create mode 100644 host_util/lzma/Common/MyInitGuid.h create mode 100644 host_util/lzma/Common/MyString.cpp create mode 100644 host_util/lzma/Common/MyString.h create mode 100644 host_util/lzma/Common/MyUnknown.h create mode 100644 host_util/lzma/Common/MyVector.cpp create mode 100644 host_util/lzma/Common/MyVector.h create mode 100644 host_util/lzma/Common/MyWindows.h create mode 100644 host_util/lzma/Common/NewHandler.cpp create mode 100644 host_util/lzma/Common/NewHandler.h create mode 100644 host_util/lzma/Common/StdAfx.h create mode 100644 host_util/lzma/Common/StringConvert.cpp create mode 100644 host_util/lzma/Common/StringConvert.h create mode 100644 host_util/lzma/Common/StringToInt.cpp create mode 100644 host_util/lzma/Common/StringToInt.h create mode 100644 host_util/lzma/Common/Types.h create mode 100644 host_util/lzma/Exception.h create mode 100644 host_util/lzma/FileStreams.cpp create mode 100644 host_util/lzma/FileStreams.h create mode 100644 host_util/lzma/ICoder.h create mode 100644 host_util/lzma/IDecl.h create mode 100644 host_util/lzma/IStream.h create mode 100644 host_util/lzma/InBuffer.cpp create mode 100644 host_util/lzma/InBuffer.h create mode 100644 host_util/lzma/LzmaDecoder.cpp create mode 100644 host_util/lzma/LzmaDecoder.h create mode 100644 host_util/lzma/LzmaEncoder.cpp create mode 100644 host_util/lzma/LzmaEncoder.h create mode 100644 host_util/lzma/OutBuffer.cpp create mode 100644 host_util/lzma/OutBuffer.h create mode 100644 host_util/lzma/StdAfx.h create mode 100644 host_util/lzma/StreamUtils.cpp create mode 100644 host_util/lzma/StreamUtils.h create mode 100755 host_util/lzma/history.txt create mode 100755 host_util/lzma/lzma.txt create mode 100644 host_util/lzma/lzma_version.h create mode 100644 host_util/lzma/lzmp.cpp create mode 100644 host_util/lzma/makefile.gcc diff --git a/.gitignore b/.gitignore index ac10b38..6628b1a 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,9 @@ # host programs on Cygwin *.exe +# lzma host util +host_util/lzma/lzma + # # Top-level generic files # diff --git a/host_util/darwin-x86_64/lzma b/host_util/darwin-x86_64/lzma deleted file mode 100755 index 9e161c9bac1abef02ab25570a6c0b0879e76d2cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185748 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 Z8SFo-`Zo{uL)X}v#2Qo@P;oKG{{h*mD!u>! diff --git a/host_util/linux-x86_32/lzma b/host_util/linux-x86_32/lzma deleted file mode 100755 index ac81e120a32b5e38e62037c04b5d7d9517460ccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245760 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�P 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

<;Fir)4k;YX;$(_jV@?Ab%t1O4ma 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%0Af#-#NI{FI4IXVa- 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 z z5^N6(K;#i2CH29Lwxq0bK5mGZl4>}}l+=!wf>I|3A&cvM8?dpolNi1-;(Us~+6A%1a1!cH0Yf-t z0ILZ2x(*6V!U*Jq!=OaM=mVY(;~%4R0wNQ}JW()Vh-ZCX4NAFYpnZAYwPRJ#Gg(m1 zR!flgbq3Lgi0=#6g7pN<WI&kFp%tvf?^^4?G}46d?9d2eV0-*k-&?RP-N zKTdKWNIB$h5Gi;QNQUCZRVX}sBy65YsJ*El4m+_vZJ4F?1w!-K&xYEZoXeLIbA2tI?nqt3vsnA>Z@y zJ&CKIUB>Jw(B5``ZCzbC>ln` zv%I^T==wn2+u?7_=y;xY8C0D~9EAHBL|+f6xfVvrlO)A?_JZ{ke+>#L{Q zQgw^5$!of3)C{Kjsw{l>6YM1R{6`Hs12K~Y&6P2+|e+t z;a&)(HLQL;==5G?mz9p{(CD{iiyxsn9A7feF3Be*YL%xggokwZWeV}&1s$R1%Gm5L2 z_XxQYTqWNGHr(Wzf%Q#X?+vgi&HN_F#kc!Fl&ZFs1LNhJY39a24h`r|{H9e_1=7qb z2S#Q5OtzapLJR+nOe2tVYEUSD9BGU@8Cz!&z`;DN(zkFOG z$MyaIGlUe@JjkW6UIbC9UaK@FxRab%TUsZL1zu#E()!hEUtCP>x~8w$K|yOvw)_gM zI1k^=*W$Pgd}IRR%QDVbP8H)fVC`XY|CDI_sj|V4^jU|M0=3k@64`2EVF8VDJfE5m zu{WaJ^96aD+eWd3<0;EMDq#^u?n%k= z^qUDlh5A;*d_5GNEWk&Ki>Jtrc()shB6lFnj9A*#lIDj$^7l&&GY+GqPZ;|jV9@0s zUT%b)Z7ApPX3G(%wn;qM`E!Hi-5IZna@S*+Rc>#pC1Xbc5WA&@|2DW^Jo8wEn`$vQ z4se6Ph8WvfSE&br)N?X$TfytE9)PXFLhxHmL{l3BVj&5}^)-mRe87rkAT@9jnksi2 z_cjJrL88XzL*MQ;9$+N$JhfC6nPk!L+MCpgxHs>esohY&EZ6e<%i)tVOFe6F^~5hc zq=3m{g)ZRTAU~rs4LO%6{;-KfhMU$6>I?eMA2?YF6gHS1Fvd7BxK&U*&LnP6z5MN< zSUz6LGXp87Y4QZ?JaxPKoOWWT&KiOHq>4WCwNJd<`TL5Vx3pYz*XR1IuZE`^s*Ho({+&tP^gVegrX~ zhXFDHeNibOx6Ndt7|?q}>44IW9}!y;P_^5_0bOelOX$xP>LVLaA3&sr=7PYw&A|9_ zNF*R`3F>Ji<=Vh48{h@^0X+ph9gsy>CjxCQAcz5dMn`lF4K#KlHPnqL22^)yIG{TW zDq>3l3K4f)+b0*S3SN>)WlN|h}EN-W+PS5Oyg1CtqEo|ZpVb_|-U zH${yV_aWm+Pa@pc4fYg^A>h0GDfrH#)K3F2SG7k6wg|sA=BPRs5!3@Bg0L9E&AXyk zpfhY5qnX50*pC^reIWCy_zIx0Nb&r2Y-2nW6iegdwBKec|18zV2vBnJcgIG&n}TOl z2|f;w5qTXW{{u!R;#Z}TeEY#Uip)#onMi+QC)VJ+WZ(OezdVqc!p9~d14*)w6rX)w zqiu|Jc1r&oa4JHD;608`!uSNbXV*7Ge!}7erM=QXf1b zt7OBw&^I1t3i-PL+gL)C0Y#aRB+j%YWW_dvC=chWn~d=X?!i4TSd}h4ksW4Yl!RP= z(S~Qy=4L!q8(rPVLMAL#whOx5H%E2#7RdiWl~;^2!&*wPkAtBn$j^;-xOHCUi-oF8 zkp2>M=IK8gM2fMmC)zghYeb!an8JD1g2HCn_{79in!s)M>(OH~4hO}=3Hj#wB^Nn) z&zR@6Tso?OlUMHruf31#|Bt%&0I#ZO{>RUry*D{YC2y=schQi@Y%nM{m4M51NcV

ytQCybuK#W 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 z ^(|J>85QzTm3S>V6#`({QDE8CJb9b&+ z*ZEN&6eE{+>g&m@K59r^-MsTU{eyaa>$B5n$;+OdW;gHTe=VH0gQJfYQVAXnV#*sqxKd_qv^moN@bfYFbDrgg~~W=Vxc~ zLLhU=@p{~hKN0n(LH%h|f11>vEs#d@`Po9&N~sgNaM%#f+mcR$2%8dvskul)qL-b_ zrjk>sakhRio}bIc#^U)%#79-Ju_y?2EE`L&}f)`MT$M~b`H;7@>xZXHZv3SCC(@buTs|?IR^7JJ*+Ooz;wA*~F1623;AAH(oH_2y+BcNg6(1Uu z-bF_S1`~bJ_>k&hVkVUu=dctt@f0eYlQlMVI5|I_NH(;lli6HK@3slcn-#3%ZHz(6@pxgZu&`h+0#9h3VeRID~P|TJjU1TEfBhj%cE< zy*KLaM3*^l>0?IYwho<~8ELwykeXkN&0ww47#}uU)1Kj2=fD6(BeuV4FxDF#R75Z& zZO0G9Rns7tk^X^bUt(ln57?q+eK{0r!(xC6$gfv9wlT`(GSdTTJvN2qno6bS^rDcH zl8q)H1BBDX6S>LR!*jFL3py|}dW5Z8c9P>^X}AM&iNl#Z30>$Xok?ZEe2k34sD`4w z{1FV(ip4q;F;_T2vgPxO2_>1RnH0d-@nF2GeXx`tW}!r&w^*gF%*3QDlkm3ucC}bI zD=&=aN4L(8vu#mKu%Wk>u(Qqv%z`wPYa~mTFJU4vj!~!~7_ls;yQ#?&S+tcqW`7#aW1L2$k~^<$GF zYA6G_X*55_8zS``uI?Ub+D!((AFIwIzUE4vSQ$^@$76~E!wWx*(}w1h`_}3cyiH7 zh&9RMB4rtTlN6?WlBVafQ6(GOJNL!nl$x==-ThXgQ%xR6qa@8vp3Fxjz$$=-8yga` z42|_jBUXwPG$^f14a}3VVLqjC=a&!PyudH+~m72n;3hRkblOBk5axAyb&ZHYivn&mXFqeRxQHcMF=tY#w4fZ2B6u`}hJm` z;2L>Qsi-hb^J;TKXPtq}#SxUVbFofrkY0%3xg<|?wK}0&MdaTG`L|L2r8XI VK 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ν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 z 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 ksq}M-l;nW~OXwf_Ji2wiq diff --git a/host_util/lzma/C/7zCrc.c b/host_util/lzma/C/7zCrc.c new file mode 100644 index 0000000..71962b2 --- /dev/null +++ b/host_util/lzma/C/7zCrc.c @@ -0,0 +1,35 @@ +/* 7zCrc.c -- CRC32 calculation +2008-08-05 +Igor Pavlov +Public domain */ + +#include "7zCrc.h" + +#define kCrcPoly 0xEDB88320 +UInt32 g_CrcTable[256]; + +void MY_FAST_CALL CrcGenerateTable(void) +{ + UInt32 i; + for (i = 0; i < 256; i++) + { + UInt32 r = i; + int j; + for (j = 0; j < 8; j++) + r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); + g_CrcTable[i] = r; + } +} + +UInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size) +{ + const Byte *p = (const Byte *)data; + for (; size > 0 ; size--, p++) + v = CRC_UPDATE_BYTE(v, *p); + return v; +} + +UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size) +{ + return CrcUpdate(CRC_INIT_VAL, data, size) ^ 0xFFFFFFFF; +} diff --git a/host_util/lzma/C/7zCrc.h b/host_util/lzma/C/7zCrc.h new file mode 100644 index 0000000..00dc29c --- /dev/null +++ b/host_util/lzma/C/7zCrc.h @@ -0,0 +1,24 @@ +/* 7zCrc.h -- CRC32 calculation +2008-03-13 +Igor Pavlov +Public domain */ + +#ifndef __7Z_CRC_H +#define __7Z_CRC_H + +#include + +#include "Types.h" + +extern UInt32 g_CrcTable[]; + +void MY_FAST_CALL CrcGenerateTable(void); + +#define CRC_INIT_VAL 0xFFFFFFFF +#define CRC_GET_DIGEST(crc) ((crc) ^ 0xFFFFFFFF) +#define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt32 MY_FAST_CALL CrcUpdate(UInt32 crc, const void *data, size_t size); +UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size); + +#endif diff --git a/host_util/lzma/C/Alloc.c b/host_util/lzma/C/Alloc.c new file mode 100644 index 0000000..358a7b5 --- /dev/null +++ b/host_util/lzma/C/Alloc.c @@ -0,0 +1,127 @@ +/* Alloc.c -- Memory allocation functions +2008-09-24 +Igor Pavlov +Public domain */ + +#ifdef _WIN32 +#include +#endif +#include + +#include "Alloc.h" + +/* #define _SZ_ALLOC_DEBUG */ + +/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ +#ifdef _SZ_ALLOC_DEBUG +#include +int g_allocCount = 0; +int g_allocCountMid = 0; +int g_allocCountBig = 0; +#endif + +void *MyAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + { + void *p = malloc(size); + fprintf(stderr, "\nAlloc %10d bytes, count = %10d, addr = %8X", size, g_allocCount++, (unsigned)p); + return p; + } + #else + return malloc(size); + #endif +} + +void MyFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree; count = %10d, addr = %8X", --g_allocCount, (unsigned)address); + #endif + free(address); +} + +#ifdef _WIN32 + +void *MidAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++); + #endif + return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); +} + +void MidFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid); + #endif + if (address == 0) + return; + VirtualFree(address, 0, MEM_RELEASE); +} + +#ifndef MEM_LARGE_PAGES +#undef _7ZIP_LARGE_PAGES +#endif + +#ifdef _7ZIP_LARGE_PAGES +SIZE_T g_LargePageSize = 0; +typedef SIZE_T (WINAPI *GetLargePageMinimumP)(); +#endif + +void SetLargePageSize() +{ + #ifdef _7ZIP_LARGE_PAGES + SIZE_T size = 0; + GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) + GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); + if (largePageMinimum == 0) + return; + size = largePageMinimum(); + if (size == 0 || (size & (size - 1)) != 0) + return; + g_LargePageSize = size; + #endif +} + + +void *BigAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++); + #endif + + #ifdef _7ZIP_LARGE_PAGES + if (g_LargePageSize != 0 && g_LargePageSize <= (1 << 30) && size >= (1 << 18)) + { + void *res = VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)), + MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE); + if (res != 0) + return res; + } + #endif + return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); +} + +void BigFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig); + #endif + + if (address == 0) + return; + VirtualFree(address, 0, MEM_RELEASE); +} + +#endif diff --git a/host_util/lzma/C/Alloc.h b/host_util/lzma/C/Alloc.h new file mode 100644 index 0000000..ff0669c --- /dev/null +++ b/host_util/lzma/C/Alloc.h @@ -0,0 +1,32 @@ +/* Alloc.h -- Memory allocation functions +2008-03-13 +Igor Pavlov +Public domain */ + +#ifndef __COMMON_ALLOC_H +#define __COMMON_ALLOC_H + +#include + +void *MyAlloc(size_t size); +void MyFree(void *address); + +#ifdef _WIN32 + +void SetLargePageSize(); + +void *MidAlloc(size_t size); +void MidFree(void *address); +void *BigAlloc(size_t size); +void BigFree(void *address); + +#else + +#define MidAlloc(size) MyAlloc(size) +#define MidFree(address) MyFree(address) +#define BigAlloc(size) MyAlloc(size) +#define BigFree(address) MyFree(address) + +#endif + +#endif diff --git a/host_util/lzma/C/LzFind.c b/host_util/lzma/C/LzFind.c new file mode 100644 index 0000000..34f4f09 --- /dev/null +++ b/host_util/lzma/C/LzFind.c @@ -0,0 +1,751 @@ +/* LzFind.c -- Match finder for LZ algorithms +2008-10-04 : Igor Pavlov : Public domain */ + +#include + +#include "LzFind.h" +#include "LzHash.h" + +#define kEmptyHashValue 0 +#define kMaxValForNormalize ((UInt32)0xFFFFFFFF) +#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */ +#define kNormalizeMask (~(kNormalizeStepMin - 1)) +#define kMaxHistorySize ((UInt32)3 << 30) + +#define kStartMaxLen 3 + +static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc) +{ + if (!p->directInput) + { + alloc->Free(alloc, p->bufferBase); + p->bufferBase = 0; + } +} + +/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ + +static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc) +{ + UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; + if (p->directInput) + { + p->blockSize = blockSize; + return 1; + } + if (p->bufferBase == 0 || p->blockSize != blockSize) + { + LzInWindow_Free(p, alloc); + p->blockSize = blockSize; + p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize); + } + return (p->bufferBase != 0); +} + +Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } +Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; } + +UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } + +void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) +{ + p->posLimit -= subValue; + p->pos -= subValue; + p->streamPos -= subValue; +} + +static void MatchFinder_ReadBlock(CMatchFinder *p) +{ + if (p->streamEndWasReached || p->result != SZ_OK) + return; + for (;;) + { + Byte *dest = p->buffer + (p->streamPos - p->pos); + size_t size = (p->bufferBase + p->blockSize - dest); + if (size == 0) + return; + p->result = p->stream->Read(p->stream, dest, &size); + if (p->result != SZ_OK) + return; + if (size == 0) + { + p->streamEndWasReached = 1; + return; + } + p->streamPos += (UInt32)size; + if (p->streamPos - p->pos > p->keepSizeAfter) + return; + } +} + +void MatchFinder_MoveBlock(CMatchFinder *p) +{ + memmove(p->bufferBase, + p->buffer - p->keepSizeBefore, + (size_t)(p->streamPos - p->pos + p->keepSizeBefore)); + p->buffer = p->bufferBase + p->keepSizeBefore; +} + +int MatchFinder_NeedMove(CMatchFinder *p) +{ + /* if (p->streamEndWasReached) return 0; */ + return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); +} + +void MatchFinder_ReadIfRequired(CMatchFinder *p) +{ + if (p->streamEndWasReached) + return; + if (p->keepSizeAfter >= p->streamPos - p->pos) + MatchFinder_ReadBlock(p); +} + +static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p) +{ + if (MatchFinder_NeedMove(p)) + MatchFinder_MoveBlock(p); + MatchFinder_ReadBlock(p); +} + +static void MatchFinder_SetDefaultSettings(CMatchFinder *p) +{ + p->cutValue = 32; + p->btMode = 1; + p->numHashBytes = 4; + /* p->skipModeBits = 0; */ + p->directInput = 0; + p->bigHash = 0; +} + +#define kCrcPoly 0xEDB88320 + +void MatchFinder_Construct(CMatchFinder *p) +{ + UInt32 i; + p->bufferBase = 0; + p->directInput = 0; + p->hash = 0; + MatchFinder_SetDefaultSettings(p); + + for (i = 0; i < 256; i++) + { + UInt32 r = i; + int j; + for (j = 0; j < 8; j++) + r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); + p->crc[i] = r; + } +} + +static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->hash); + p->hash = 0; +} + +void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc) +{ + MatchFinder_FreeThisClassMemory(p, alloc); + LzInWindow_Free(p, alloc); +} + +static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc) +{ + size_t sizeInBytes = (size_t)num * sizeof(CLzRef); + if (sizeInBytes / sizeof(CLzRef) != num) + return 0; + return (CLzRef *)alloc->Alloc(alloc, sizeInBytes); +} + +int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, + UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, + ISzAlloc *alloc) +{ + UInt32 sizeReserv; + if (historySize > kMaxHistorySize) + { + MatchFinder_Free(p, alloc); + return 0; + } + sizeReserv = historySize >> 1; + if (historySize > ((UInt32)2 << 30)) + sizeReserv = historySize >> 2; + sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19); + + p->keepSizeBefore = historySize + keepAddBufferBefore + 1; + p->keepSizeAfter = matchMaxLen + keepAddBufferAfter; + /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */ + if (LzInWindow_Create(p, sizeReserv, alloc)) + { + UInt32 newCyclicBufferSize = (historySize /* >> p->skipModeBits */) + 1; + UInt32 hs; + p->matchMaxLen = matchMaxLen; + { + p->fixedHashSize = 0; + if (p->numHashBytes == 2) + hs = (1 << 16) - 1; + else + { + hs = historySize - 1; + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + hs >>= 1; + /* hs >>= p->skipModeBits; */ + hs |= 0xFFFF; /* don't change it! It's required for Deflate */ + if (hs > (1 << 24)) + { + if (p->numHashBytes == 3) + hs = (1 << 24) - 1; + else + hs >>= 1; + } + } + p->hashMask = hs; + hs++; + if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; + if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; + if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size; + hs += p->fixedHashSize; + } + + { + UInt32 prevSize = p->hashSizeSum + p->numSons; + UInt32 newSize; + p->historySize = historySize; + p->hashSizeSum = hs; + p->cyclicBufferSize = newCyclicBufferSize; + p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize); + newSize = p->hashSizeSum + p->numSons; + if (p->hash != 0 && prevSize == newSize) + return 1; + MatchFinder_FreeThisClassMemory(p, alloc); + p->hash = AllocRefs(newSize, alloc); + if (p->hash != 0) + { + p->son = p->hash + p->hashSizeSum; + return 1; + } + } + } + MatchFinder_Free(p, alloc); + return 0; +} + +static void MatchFinder_SetLimits(CMatchFinder *p) +{ + UInt32 limit = kMaxValForNormalize - p->pos; + UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos; + if (limit2 < limit) + limit = limit2; + limit2 = p->streamPos - p->pos; + if (limit2 <= p->keepSizeAfter) + { + if (limit2 > 0) + limit2 = 1; + } + else + limit2 -= p->keepSizeAfter; + if (limit2 < limit) + limit = limit2; + { + UInt32 lenLimit = p->streamPos - p->pos; + if (lenLimit > p->matchMaxLen) + lenLimit = p->matchMaxLen; + p->lenLimit = lenLimit; + } + p->posLimit = p->pos + limit; +} + +void MatchFinder_Init(CMatchFinder *p) +{ + UInt32 i; + for (i = 0; i < p->hashSizeSum; i++) + p->hash[i] = kEmptyHashValue; + p->cyclicBufferPos = 0; + p->buffer = p->bufferBase; + p->pos = p->streamPos = p->cyclicBufferSize; + p->result = SZ_OK; + p->streamEndWasReached = 0; + MatchFinder_ReadBlock(p); + MatchFinder_SetLimits(p); +} + +static UInt32 MatchFinder_GetSubValue(CMatchFinder *p) +{ + return (p->pos - p->historySize - 1) & kNormalizeMask; +} + +void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems) +{ + UInt32 i; + for (i = 0; i < numItems; i++) + { + UInt32 value = items[i]; + if (value <= subValue) + value = kEmptyHashValue; + else + value -= subValue; + items[i] = value; + } +} + +static void MatchFinder_Normalize(CMatchFinder *p) +{ + UInt32 subValue = MatchFinder_GetSubValue(p); + MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons); + MatchFinder_ReduceOffsets(p, subValue); +} + +static void MatchFinder_CheckLimits(CMatchFinder *p) +{ + if (p->pos == kMaxValForNormalize) + MatchFinder_Normalize(p); + if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos) + MatchFinder_CheckAndMoveAndRead(p); + if (p->cyclicBufferPos == p->cyclicBufferSize) + p->cyclicBufferPos = 0; + MatchFinder_SetLimits(p); +} + +static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, + UInt32 *distances, UInt32 maxLen) +{ + son[_cyclicBufferPos] = curMatch; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + return distances; + { + const Byte *pb = cur - delta; + curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; + if (pb[maxLen] == cur[maxLen] && *pb == *cur) + { + UInt32 len = 0; + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + *distances++ = maxLen = len; + *distances++ = delta - 1; + if (len == lenLimit) + return distances; + } + } + } + } +} + +UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, + UInt32 *distances, UInt32 maxLen) +{ + CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + (_cyclicBufferPos << 1); + UInt32 len0 = 0, len1 = 0; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + { + *ptr0 = *ptr1 = kEmptyHashValue; + return distances; + } + { + CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + UInt32 len = (len0 < len1 ? len0 : len1); + if (pb[len] == cur[len]) + { + if (++len != lenLimit && pb[len] == cur[len]) + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + *distances++ = maxLen = len; + *distances++ = delta - 1; + if (len == lenLimit) + { + *ptr1 = pair[0]; + *ptr0 = pair[1]; + return distances; + } + } + } + if (pb[len] < cur[len]) + { + *ptr1 = curMatch; + ptr1 = pair + 1; + curMatch = *ptr1; + len1 = len; + } + else + { + *ptr0 = curMatch; + ptr0 = pair; + curMatch = *ptr0; + len0 = len; + } + } + } +} + +static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) +{ + CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + (_cyclicBufferPos << 1); + UInt32 len0 = 0, len1 = 0; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + { + *ptr0 = *ptr1 = kEmptyHashValue; + return; + } + { + CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + UInt32 len = (len0 < len1 ? len0 : len1); + if (pb[len] == cur[len]) + { + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + { + if (len == lenLimit) + { + *ptr1 = pair[0]; + *ptr0 = pair[1]; + return; + } + } + } + if (pb[len] < cur[len]) + { + *ptr1 = curMatch; + ptr1 = pair + 1; + curMatch = *ptr1; + len1 = len; + } + else + { + *ptr0 = curMatch; + ptr0 = pair; + curMatch = *ptr0; + len0 = len; + } + } + } +} + +#define MOVE_POS \ + ++p->cyclicBufferPos; \ + p->buffer++; \ + if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); + +#define MOVE_POS_RET MOVE_POS return offset; + +static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } + +#define GET_MATCHES_HEADER2(minLen, ret_op) \ + UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \ + lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ + cur = p->buffer; + +#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) +#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue) + +#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue + +#define GET_MATCHES_FOOTER(offset, maxLen) \ + offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \ + distances + offset, maxLen) - distances); MOVE_POS_RET; + +#define SKIP_FOOTER \ + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; + +static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 offset; + GET_MATCHES_HEADER(2) + HASH2_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + offset = 0; + GET_MATCHES_FOOTER(offset, 1) +} + +UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 offset; + GET_MATCHES_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + offset = 0; + GET_MATCHES_FOOTER(offset, 2) +} + +static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 hash2Value, delta2, maxLen, offset; + GET_MATCHES_HEADER(3) + + HASH3_CALC; + + delta2 = p->pos - p->hash[hash2Value]; + curMatch = p->hash[kFix3HashSize + hashValue]; + + p->hash[hash2Value] = + p->hash[kFix3HashSize + hashValue] = p->pos; + + + maxLen = 2; + offset = 0; + if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) + { + for (; maxLen != lenLimit; maxLen++) + if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) + break; + distances[0] = maxLen; + distances[1] = delta2 - 1; + offset = 2; + if (maxLen == lenLimit) + { + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; + } + } + GET_MATCHES_FOOTER(offset, maxLen) +} + +static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; + GET_MATCHES_HEADER(4) + + HASH4_CALC; + + delta2 = p->pos - p->hash[ hash2Value]; + delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; + curMatch = p->hash[kFix4HashSize + hashValue]; + + p->hash[ hash2Value] = + p->hash[kFix3HashSize + hash3Value] = + p->hash[kFix4HashSize + hashValue] = p->pos; + + maxLen = 1; + offset = 0; + if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = delta2 - 1; + offset = 2; + } + if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) + { + maxLen = 3; + distances[offset + 1] = delta3 - 1; + offset += 2; + delta2 = delta3; + } + if (offset != 0) + { + for (; maxLen != lenLimit; maxLen++) + if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) + break; + distances[offset - 2] = maxLen; + if (maxLen == lenLimit) + { + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; + } + } + if (maxLen < 3) + maxLen = 3; + GET_MATCHES_FOOTER(offset, maxLen) +} + +static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; + GET_MATCHES_HEADER(4) + + HASH4_CALC; + + delta2 = p->pos - p->hash[ hash2Value]; + delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; + curMatch = p->hash[kFix4HashSize + hashValue]; + + p->hash[ hash2Value] = + p->hash[kFix3HashSize + hash3Value] = + p->hash[kFix4HashSize + hashValue] = p->pos; + + maxLen = 1; + offset = 0; + if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = delta2 - 1; + offset = 2; + } + if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) + { + maxLen = 3; + distances[offset + 1] = delta3 - 1; + offset += 2; + delta2 = delta3; + } + if (offset != 0) + { + for (; maxLen != lenLimit; maxLen++) + if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) + break; + distances[offset - 2] = maxLen; + if (maxLen == lenLimit) + { + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS_RET; + } + } + if (maxLen < 3) + maxLen = 3; + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances + offset, maxLen) - (distances)); + MOVE_POS_RET +} + +UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 offset; + GET_MATCHES_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances, 2) - (distances)); + MOVE_POS_RET +} + +static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + SKIP_HEADER(2) + HASH2_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + SKIP_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 hash2Value; + SKIP_HEADER(3) + HASH3_CALC; + curMatch = p->hash[kFix3HashSize + hashValue]; + p->hash[hash2Value] = + p->hash[kFix3HashSize + hashValue] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 hash2Value, hash3Value; + SKIP_HEADER(4) + HASH4_CALC; + curMatch = p->hash[kFix4HashSize + hashValue]; + p->hash[ hash2Value] = + p->hash[kFix3HashSize + hash3Value] = p->pos; + p->hash[kFix4HashSize + hashValue] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 hash2Value, hash3Value; + SKIP_HEADER(4) + HASH4_CALC; + curMatch = p->hash[kFix4HashSize + hashValue]; + p->hash[ hash2Value] = + p->hash[kFix3HashSize + hash3Value] = + p->hash[kFix4HashSize + hashValue] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); +} + +void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + SKIP_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); +} + +void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable) +{ + vTable->Init = (Mf_Init_Func)MatchFinder_Init; + vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte; + vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; + vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; + if (!p->btMode) + { + vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; + } + else if (p->numHashBytes == 2) + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip; + } + else if (p->numHashBytes == 3) + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; + } + else + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; + } +} diff --git a/host_util/lzma/C/LzFind.h b/host_util/lzma/C/LzFind.h new file mode 100644 index 0000000..5b9cebf --- /dev/null +++ b/host_util/lzma/C/LzFind.h @@ -0,0 +1,107 @@ +/* LzFind.h -- Match finder for LZ algorithms +2008-10-04 : Igor Pavlov : Public domain */ + +#ifndef __LZFIND_H +#define __LZFIND_H + +#include "Types.h" + +typedef UInt32 CLzRef; + +typedef struct _CMatchFinder +{ + Byte *buffer; + UInt32 pos; + UInt32 posLimit; + UInt32 streamPos; + UInt32 lenLimit; + + UInt32 cyclicBufferPos; + UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ + + UInt32 matchMaxLen; + CLzRef *hash; + CLzRef *son; + UInt32 hashMask; + UInt32 cutValue; + + Byte *bufferBase; + ISeqInStream *stream; + int streamEndWasReached; + + UInt32 blockSize; + UInt32 keepSizeBefore; + UInt32 keepSizeAfter; + + UInt32 numHashBytes; + int directInput; + int btMode; + /* int skipModeBits; */ + int bigHash; + UInt32 historySize; + UInt32 fixedHashSize; + UInt32 hashSizeSum; + UInt32 numSons; + SRes result; + UInt32 crc[256]; +} CMatchFinder; + +#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) +#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)]) + +#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) + +int MatchFinder_NeedMove(CMatchFinder *p); +Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); +void MatchFinder_MoveBlock(CMatchFinder *p); +void MatchFinder_ReadIfRequired(CMatchFinder *p); + +void MatchFinder_Construct(CMatchFinder *p); + +/* Conditions: + historySize <= 3 GB + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB +*/ +int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, + UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, + ISzAlloc *alloc); +void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); +void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems); +void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); + +UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, + UInt32 *distances, UInt32 maxLen); + +/* +Conditions: + Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. + Mf_GetPointerToCurrentPos_Func's result must be used only before any other function +*/ + +typedef void (*Mf_Init_Func)(void *object); +typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index); +typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); +typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); +typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); +typedef void (*Mf_Skip_Func)(void *object, UInt32); + +typedef struct _IMatchFinder +{ + Mf_Init_Func Init; + Mf_GetIndexByte_Func GetIndexByte; + Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; + Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; + Mf_GetMatches_Func GetMatches; + Mf_Skip_Func Skip; +} IMatchFinder; + +void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); + +void MatchFinder_Init(CMatchFinder *p); +UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); +UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); +void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); +void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); + +#endif diff --git a/host_util/lzma/C/LzHash.h b/host_util/lzma/C/LzHash.h new file mode 100644 index 0000000..9f4173e --- /dev/null +++ b/host_util/lzma/C/LzHash.h @@ -0,0 +1,54 @@ +/* LzHash.h -- HASH functions for LZ algorithms +2008-10-04 : Igor Pavlov : Public domain */ + +#ifndef __LZHASH_H +#define __LZHASH_H + +#define kHash2Size (1 << 10) +#define kHash3Size (1 << 16) +#define kHash4Size (1 << 20) + +#define kFix3HashSize (kHash2Size) +#define kFix4HashSize (kHash2Size + kHash3Size) +#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) + +#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8); + +#define HASH3_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } + +#define HASH4_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ + hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; } + +#define HASH5_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ + hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \ + hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \ + hash4Value &= (kHash4Size - 1); } + +/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */ +#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; + + +#define MT_HASH2_CALC \ + hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1); + +#define MT_HASH3_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } + +#define MT_HASH4_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ + hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); } + +#endif diff --git a/host_util/lzma/C/LzmaDec.c b/host_util/lzma/C/LzmaDec.c new file mode 100644 index 0000000..d87eb19 --- /dev/null +++ b/host_util/lzma/C/LzmaDec.c @@ -0,0 +1,1007 @@ +/* LzmaDec.c -- LZMA Decoder +2008-11-06 : Igor Pavlov : Public domain */ + +#include "LzmaDec.h" + +#include + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 + +#define RC_INIT_SIZE 5 + +#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } + +#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) +#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); +#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); +#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ + { UPDATE_0(p); i = (i + i); A0; } else \ + { UPDATE_1(p); i = (i + i) + 1; A1; } +#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;) + +#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); } +#define TREE_DECODE(probs, limit, i) \ + { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } + +/* #define _LZMA_SIZE_OPT */ + +#ifdef _LZMA_SIZE_OPT +#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) +#else +#define TREE_6_DECODE(probs, i) \ + { i = 1; \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + i -= 0x40; } +#endif + +#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } + +#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) +#define UPDATE_0_CHECK range = bound; +#define UPDATE_1_CHECK range -= bound; code -= bound; +#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ + { UPDATE_0_CHECK; i = (i + i); A0; } else \ + { UPDATE_1_CHECK; i = (i + i) + 1; A1; } +#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) +#define TREE_DECODE_CHECK(probs, limit, i) \ + { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } + + +#define kNumPosBitsMax 4 +#define kNumPosStatesMax (1 << kNumPosBitsMax) + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define LenChoice 0 +#define LenChoice2 (LenChoice + 1) +#define LenLow (LenChoice2 + 1) +#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) +#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) +#define kNumLenProbs (LenHigh + kLenNumHighSymbols) + + +#define kNumStates 12 +#define kNumLitStates 7 + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +#define kNumPosSlotBits 6 +#define kNumLenToPosStates 4 + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) + +#define kMatchMinLen 2 +#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) + +#define IsMatch 0 +#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) +#define IsRepG0 (IsRep + kNumStates) +#define IsRepG1 (IsRepG0 + kNumStates) +#define IsRepG2 (IsRepG1 + kNumStates) +#define IsRep0Long (IsRepG2 + kNumStates) +#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) +#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) +#define LenCoder (Align + kAlignTableSize) +#define RepLenCoder (LenCoder + kNumLenProbs) +#define Literal (RepLenCoder + kNumLenProbs) + +#define LZMA_BASE_SIZE 1846 +#define LZMA_LIT_SIZE 768 + +#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) + +#if Literal != LZMA_BASE_SIZE +StopCompilingDueBUG +#endif + +static const Byte kLiteralNextStates[kNumStates * 2] = +{ + 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5, + 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10 +}; + +#define LZMA_DIC_MIN (1 << 12) + +/* First LZMA-symbol is always decoded. +And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization +Out: + Result: + SZ_OK - OK + SZ_ERROR_DATA - Error + p->remainLen: + < kMatchSpecLenStart : normal remain + = kMatchSpecLenStart : finished + = kMatchSpecLenStart + 1 : Flush marker + = kMatchSpecLenStart + 2 : State Init Marker +*/ + +static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +{ + CLzmaProb *probs = p->probs; + + unsigned state = p->state; + UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; + unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; + unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1; + unsigned lc = p->prop.lc; + + Byte *dic = p->dic; + SizeT dicBufSize = p->dicBufSize; + SizeT dicPos = p->dicPos; + + UInt32 processedPos = p->processedPos; + UInt32 checkDicSize = p->checkDicSize; + unsigned len = 0; + + const Byte *buf = p->buf; + UInt32 range = p->range; + UInt32 code = p->code; + + do + { + CLzmaProb *prob; + UInt32 bound; + unsigned ttt; + unsigned posState = processedPos & pbMask; + + prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; + IF_BIT_0(prob) + { + unsigned symbol; + UPDATE_0(prob); + prob = probs + Literal; + if (checkDicSize != 0 || processedPos != 0) + prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) + + (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc)))); + + if (state < kNumLitStates) + { + symbol = 1; + do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100); + } + else + { + unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; + unsigned offs = 0x100; + symbol = 1; + do + { + unsigned bit; + CLzmaProb *probLit; + matchByte <<= 1; + bit = (matchByte & offs); + probLit = prob + offs + bit + symbol; + GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit) + } + while (symbol < 0x100); + } + dic[dicPos++] = (Byte)symbol; + processedPos++; + + state = kLiteralNextStates[state]; + /* if (state < 4) state = 0; else if (state < 10) state -= 3; else state -= 6; */ + continue; + } + else + { + UPDATE_1(prob); + prob = probs + IsRep + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + state += kNumStates; + prob = probs + LenCoder; + } + else + { + UPDATE_1(prob); + if (checkDicSize == 0 && processedPos == 0) + return SZ_ERROR_DATA; + prob = probs + IsRepG0 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; + IF_BIT_0(prob) + { + UPDATE_0(prob); + dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; + dicPos++; + processedPos++; + state = state < kNumLitStates ? 9 : 11; + continue; + } + UPDATE_1(prob); + } + else + { + UInt32 distance; + UPDATE_1(prob); + prob = probs + IsRepG1 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + distance = rep1; + } + else + { + UPDATE_1(prob); + prob = probs + IsRepG2 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + distance = rep2; + } + else + { + UPDATE_1(prob); + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + state = state < kNumLitStates ? 8 : 11; + prob = probs + RepLenCoder; + } + { + unsigned limit, offset; + CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenLow + (posState << kLenNumLowBits); + offset = 0; + limit = (1 << kLenNumLowBits); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenChoice2; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenMid + (posState << kLenNumMidBits); + offset = kLenNumLowSymbols; + limit = (1 << kLenNumMidBits); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenHigh; + offset = kLenNumLowSymbols + kLenNumMidSymbols; + limit = (1 << kLenNumHighBits); + } + } + TREE_DECODE(probLen, limit, len); + len += offset; + } + + if (state >= kNumStates) + { + UInt32 distance; + prob = probs + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); + TREE_6_DECODE(prob, distance); + if (distance >= kStartPosModelIndex) + { + unsigned posSlot = (unsigned)distance; + int numDirectBits = (int)(((distance >> 1) - 1)); + distance = (2 | (distance & 1)); + if (posSlot < kEndPosModelIndex) + { + distance <<= numDirectBits; + prob = probs + SpecPos + distance - posSlot - 1; + { + UInt32 mask = 1; + unsigned i = 1; + do + { + GET_BIT2(prob + i, i, ; , distance |= mask); + mask <<= 1; + } + while (--numDirectBits != 0); + } + } + else + { + numDirectBits -= kNumAlignBits; + do + { + NORMALIZE + range >>= 1; + + { + UInt32 t; + code -= range; + t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ + distance = (distance << 1) + (t + 1); + code += range & t; + } + /* + distance <<= 1; + if (code >= range) + { + code -= range; + distance |= 1; + } + */ + } + while (--numDirectBits != 0); + prob = probs + Align; + distance <<= kNumAlignBits; + { + unsigned i = 1; + GET_BIT2(prob + i, i, ; , distance |= 1); + GET_BIT2(prob + i, i, ; , distance |= 2); + GET_BIT2(prob + i, i, ; , distance |= 4); + GET_BIT2(prob + i, i, ; , distance |= 8); + } + if (distance == (UInt32)0xFFFFFFFF) + { + len += kMatchSpecLenStart; + state -= kNumStates; + break; + } + } + } + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + rep0 = distance + 1; + if (checkDicSize == 0) + { + if (distance >= processedPos) + return SZ_ERROR_DATA; + } + else if (distance >= checkDicSize) + return SZ_ERROR_DATA; + state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; + /* state = kLiteralNextStates[state]; */ + } + + len += kMatchMinLen; + + if (limit == dicPos) + return SZ_ERROR_DATA; + { + SizeT rem = limit - dicPos; + unsigned curLen = ((rem < len) ? (unsigned)rem : len); + SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0); + + processedPos += curLen; + + len -= curLen; + if (pos + curLen <= dicBufSize) + { + Byte *dest = dic + dicPos; + ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; + const Byte *lim = dest + curLen; + dicPos += curLen; + do + *(dest) = (Byte)*(dest + src); + while (++dest != lim); + } + else + { + do + { + dic[dicPos++] = dic[pos]; + if (++pos == dicBufSize) + pos = 0; + } + while (--curLen != 0); + } + } + } + } + while (dicPos < limit && buf < bufLimit); + NORMALIZE; + p->buf = buf; + p->range = range; + p->code = code; + p->remainLen = len; + p->dicPos = dicPos; + p->processedPos = processedPos; + p->reps[0] = rep0; + p->reps[1] = rep1; + p->reps[2] = rep2; + p->reps[3] = rep3; + p->state = state; + + return SZ_OK; +} + +static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) +{ + if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart) + { + Byte *dic = p->dic; + SizeT dicPos = p->dicPos; + SizeT dicBufSize = p->dicBufSize; + unsigned len = p->remainLen; + UInt32 rep0 = p->reps[0]; + if (limit - dicPos < len) + len = (unsigned)(limit - dicPos); + + if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) + p->checkDicSize = p->prop.dicSize; + + p->processedPos += len; + p->remainLen -= len; + while (len-- != 0) + { + dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; + dicPos++; + } + p->dicPos = dicPos; + } +} + +static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +{ + do + { + SizeT limit2 = limit; + if (p->checkDicSize == 0) + { + UInt32 rem = p->prop.dicSize - p->processedPos; + if (limit - p->dicPos > rem) + limit2 = p->dicPos + rem; + } + RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit)); + if (p->processedPos >= p->prop.dicSize) + p->checkDicSize = p->prop.dicSize; + LzmaDec_WriteRem(p, limit); + } + while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); + + if (p->remainLen > kMatchSpecLenStart) + { + p->remainLen = kMatchSpecLenStart; + } + return 0; +} + +typedef enum +{ + DUMMY_ERROR, /* unexpected end of input stream */ + DUMMY_LIT, + DUMMY_MATCH, + DUMMY_REP +} ELzmaDummy; + +static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize) +{ + UInt32 range = p->range; + UInt32 code = p->code; + const Byte *bufLimit = buf + inSize; + CLzmaProb *probs = p->probs; + unsigned state = p->state; + ELzmaDummy res; + + { + CLzmaProb *prob; + UInt32 bound; + unsigned ttt; + unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1); + + prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK + + /* if (bufLimit - buf >= 7) return DUMMY_LIT; */ + + prob = probs + Literal; + if (p->checkDicSize != 0 || p->processedPos != 0) + prob += (LZMA_LIT_SIZE * + ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) + + (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); + + if (state < kNumLitStates) + { + unsigned symbol = 1; + do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100); + } + else + { + unsigned matchByte = p->dic[p->dicPos - p->reps[0] + + ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)]; + unsigned offs = 0x100; + unsigned symbol = 1; + do + { + unsigned bit; + CLzmaProb *probLit; + matchByte <<= 1; + bit = (matchByte & offs); + probLit = prob + offs + bit + symbol; + GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit) + } + while (symbol < 0x100); + } + res = DUMMY_LIT; + } + else + { + unsigned len; + UPDATE_1_CHECK; + + prob = probs + IsRep + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + state = 0; + prob = probs + LenCoder; + res = DUMMY_MATCH; + } + else + { + UPDATE_1_CHECK; + res = DUMMY_REP; + prob = probs + IsRepG0 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + NORMALIZE_CHECK; + return DUMMY_REP; + } + else + { + UPDATE_1_CHECK; + } + } + else + { + UPDATE_1_CHECK; + prob = probs + IsRepG1 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + } + else + { + UPDATE_1_CHECK; + prob = probs + IsRepG2 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + } + else + { + UPDATE_1_CHECK; + } + } + } + state = kNumStates; + prob = probs + RepLenCoder; + } + { + unsigned limit, offset; + CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0_CHECK(probLen) + { + UPDATE_0_CHECK; + probLen = prob + LenLow + (posState << kLenNumLowBits); + offset = 0; + limit = 1 << kLenNumLowBits; + } + else + { + UPDATE_1_CHECK; + probLen = prob + LenChoice2; + IF_BIT_0_CHECK(probLen) + { + UPDATE_0_CHECK; + probLen = prob + LenMid + (posState << kLenNumMidBits); + offset = kLenNumLowSymbols; + limit = 1 << kLenNumMidBits; + } + else + { + UPDATE_1_CHECK; + probLen = prob + LenHigh; + offset = kLenNumLowSymbols + kLenNumMidSymbols; + limit = 1 << kLenNumHighBits; + } + } + TREE_DECODE_CHECK(probLen, limit, len); + len += offset; + } + + if (state < 4) + { + unsigned posSlot; + prob = probs + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << + kNumPosSlotBits); + TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); + if (posSlot >= kStartPosModelIndex) + { + int numDirectBits = ((posSlot >> 1) - 1); + + /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */ + + if (posSlot < kEndPosModelIndex) + { + prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1; + } + else + { + numDirectBits -= kNumAlignBits; + do + { + NORMALIZE_CHECK + range >>= 1; + code -= range & (((code - range) >> 31) - 1); + /* if (code >= range) code -= range; */ + } + while (--numDirectBits != 0); + prob = probs + Align; + numDirectBits = kNumAlignBits; + } + { + unsigned i = 1; + do + { + GET_BIT_CHECK(prob + i, i); + } + while (--numDirectBits != 0); + } + } + } + } + } + NORMALIZE_CHECK; + return res; +} + + +static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data) +{ + p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]); + p->range = 0xFFFFFFFF; + p->needFlush = 0; +} + +void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) +{ + p->needFlush = 1; + p->remainLen = 0; + p->tempBufSize = 0; + + if (initDic) + { + p->processedPos = 0; + p->checkDicSize = 0; + p->needInitState = 1; + } + if (initState) + p->needInitState = 1; +} + +void LzmaDec_Init(CLzmaDec *p) +{ + p->dicPos = 0; + LzmaDec_InitDicAndState(p, True, True); +} + +static void LzmaDec_InitStateReal(CLzmaDec *p) +{ + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp)); + UInt32 i; + CLzmaProb *probs = p->probs; + for (i = 0; i < numProbs; i++) + probs[i] = kBitModelTotal >> 1; + p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; + p->state = 0; + p->needInitState = 0; +} + +SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, + ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT inSize = *srcLen; + (*srcLen) = 0; + LzmaDec_WriteRem(p, dicLimit); + + *status = LZMA_STATUS_NOT_SPECIFIED; + + while (p->remainLen != kMatchSpecLenStart) + { + int checkEndMarkNow; + + if (p->needFlush != 0) + { + for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) + p->tempBuf[p->tempBufSize++] = *src++; + if (p->tempBufSize < RC_INIT_SIZE) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (p->tempBuf[0] != 0) + return SZ_ERROR_DATA; + + LzmaDec_InitRc(p, p->tempBuf); + p->tempBufSize = 0; + } + + checkEndMarkNow = 0; + if (p->dicPos >= dicLimit) + { + if (p->remainLen == 0 && p->code == 0) + { + *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; + return SZ_OK; + } + if (finishMode == LZMA_FINISH_ANY) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_OK; + } + if (p->remainLen != 0) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + checkEndMarkNow = 1; + } + + if (p->needInitState) + LzmaDec_InitStateReal(p); + + if (p->tempBufSize == 0) + { + SizeT processed; + const Byte *bufLimit; + if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) + { + int dummyRes = LzmaDec_TryDummy(p, src, inSize); + if (dummyRes == DUMMY_ERROR) + { + memcpy(p->tempBuf, src, inSize); + p->tempBufSize = (unsigned)inSize; + (*srcLen) += inSize; + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (checkEndMarkNow && dummyRes != DUMMY_MATCH) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + bufLimit = src; + } + else + bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; + p->buf = src; + if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0) + return SZ_ERROR_DATA; + processed = (SizeT)(p->buf - src); + (*srcLen) += processed; + src += processed; + inSize -= processed; + } + else + { + unsigned rem = p->tempBufSize, lookAhead = 0; + while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) + p->tempBuf[rem++] = src[lookAhead++]; + p->tempBufSize = rem; + if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) + { + int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem); + if (dummyRes == DUMMY_ERROR) + { + (*srcLen) += lookAhead; + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (checkEndMarkNow && dummyRes != DUMMY_MATCH) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + } + p->buf = p->tempBuf; + if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0) + return SZ_ERROR_DATA; + lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf)); + (*srcLen) += lookAhead; + src += lookAhead; + inSize -= lookAhead; + p->tempBufSize = 0; + } + } + if (p->code == 0) + *status = LZMA_STATUS_FINISHED_WITH_MARK; + return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; +} + +SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT outSize = *destLen; + SizeT inSize = *srcLen; + *srcLen = *destLen = 0; + for (;;) + { + SizeT inSizeCur = inSize, outSizeCur, dicPos; + ELzmaFinishMode curFinishMode; + SRes res; + if (p->dicPos == p->dicBufSize) + p->dicPos = 0; + dicPos = p->dicPos; + if (outSize > p->dicBufSize - dicPos) + { + outSizeCur = p->dicBufSize; + curFinishMode = LZMA_FINISH_ANY; + } + else + { + outSizeCur = dicPos + outSize; + curFinishMode = finishMode; + } + + res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status); + src += inSizeCur; + inSize -= inSizeCur; + *srcLen += inSizeCur; + outSizeCur = p->dicPos - dicPos; + memcpy(dest, p->dic + dicPos, outSizeCur); + dest += outSizeCur; + outSize -= outSizeCur; + *destLen += outSizeCur; + if (res != 0) + return res; + if (outSizeCur == 0 || outSize == 0) + return SZ_OK; + } +} + +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->probs); + p->probs = 0; +} + +static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->dic); + p->dic = 0; +} + +void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc) +{ + LzmaDec_FreeProbs(p, alloc); + LzmaDec_FreeDict(p, alloc); +} + +SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) +{ + UInt32 dicSize; + Byte d; + + if (size < LZMA_PROPS_SIZE) + return SZ_ERROR_UNSUPPORTED; + else + dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); + + if (dicSize < LZMA_DIC_MIN) + dicSize = LZMA_DIC_MIN; + p->dicSize = dicSize; + + d = data[0]; + if (d >= (9 * 5 * 5)) + return SZ_ERROR_UNSUPPORTED; + + p->lc = d % 9; + d /= 9; + p->pb = d / 5; + p->lp = d % 5; + + return SZ_OK; +} + +static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc) +{ + UInt32 numProbs = LzmaProps_GetNumProbs(propNew); + if (p->probs == 0 || numProbs != p->numProbs) + { + LzmaDec_FreeProbs(p, alloc); + p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb)); + p->numProbs = numProbs; + if (p->probs == 0) + return SZ_ERROR_MEM; + } + return SZ_OK; +} + +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) +{ + CLzmaProps propNew; + RINOK(LzmaProps_Decode(&propNew, props, propsSize)); + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + p->prop = propNew; + return SZ_OK; +} + +SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) +{ + CLzmaProps propNew; + SizeT dicBufSize; + RINOK(LzmaProps_Decode(&propNew, props, propsSize)); + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + dicBufSize = propNew.dicSize; + if (p->dic == 0 || dicBufSize != p->dicBufSize) + { + LzmaDec_FreeDict(p, alloc); + p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize); + if (p->dic == 0) + { + LzmaDec_FreeProbs(p, alloc); + return SZ_ERROR_MEM; + } + } + p->dicBufSize = dicBufSize; + p->prop = propNew; + return SZ_OK; +} + +SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAlloc *alloc) +{ + CLzmaDec p; + SRes res; + SizeT inSize = *srcLen; + SizeT outSize = *destLen; + *srcLen = *destLen = 0; + if (inSize < RC_INIT_SIZE) + return SZ_ERROR_INPUT_EOF; + + LzmaDec_Construct(&p); + res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc); + if (res != 0) + return res; + p.dic = dest; + p.dicBufSize = outSize; + + LzmaDec_Init(&p); + + *srcLen = inSize; + res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); + + if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) + res = SZ_ERROR_INPUT_EOF; + + (*destLen) = p.dicPos; + LzmaDec_FreeProbs(&p, alloc); + return res; +} diff --git a/host_util/lzma/C/LzmaDec.h b/host_util/lzma/C/LzmaDec.h new file mode 100644 index 0000000..98cdbe9 --- /dev/null +++ b/host_util/lzma/C/LzmaDec.h @@ -0,0 +1,223 @@ +/* LzmaDec.h -- LZMA Decoder +2008-10-04 : Igor Pavlov : Public domain */ + +#ifndef __LZMADEC_H +#define __LZMADEC_H + +#include "Types.h" + +/* #define _LZMA_PROB32 */ +/* _LZMA_PROB32 can increase the speed on some CPUs, + but memory usage for CLzmaDec::probs will be doubled in that case */ + +#ifdef _LZMA_PROB32 +#define CLzmaProb UInt32 +#else +#define CLzmaProb UInt16 +#endif + + +/* ---------- LZMA Properties ---------- */ + +#define LZMA_PROPS_SIZE 5 + +typedef struct _CLzmaProps +{ + unsigned lc, lp, pb; + UInt32 dicSize; +} CLzmaProps; + +/* LzmaProps_Decode - decodes properties +Returns: + SZ_OK + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); + + +/* ---------- LZMA Decoder state ---------- */ + +/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. + Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ + +#define LZMA_REQUIRED_INPUT_MAX 20 + +typedef struct +{ + CLzmaProps prop; + CLzmaProb *probs; + Byte *dic; + const Byte *buf; + UInt32 range, code; + SizeT dicPos; + SizeT dicBufSize; + UInt32 processedPos; + UInt32 checkDicSize; + unsigned state; + UInt32 reps[4]; + unsigned remainLen; + int needFlush; + int needInitState; + UInt32 numProbs; + unsigned tempBufSize; + Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; +} CLzmaDec; + +#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } + +void LzmaDec_Init(CLzmaDec *p); + +/* There are two types of LZMA streams: + 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. + 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ + +typedef enum +{ + LZMA_FINISH_ANY, /* finish at any point */ + LZMA_FINISH_END /* block must be finished at the end */ +} ELzmaFinishMode; + +/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! + + You must use LZMA_FINISH_END, when you know that current output buffer + covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. + + If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, + and output value of destLen will be less than output buffer size limit. + You can check status result also. + + 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. */ + +typedef enum +{ + LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ + LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ + LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ + LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ +} ELzmaStatus; + +/* ELzmaStatus is used only as output value for function call */ + + +/* ---------- Interfaces ---------- */ + +/* There are 3 levels of interfaces: + 1) Dictionary Interface + 2) Buffer Interface + 3) One Call Interface + You can select any of these interfaces, but don't mix functions from different + groups for same object. */ + + +/* There are two variants to allocate state for Dictionary Interface: + 1) LzmaDec_Allocate / LzmaDec_Free + 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs + You can use variant 2, if you set dictionary buffer manually. + For Buffer Interface you must always use variant 1. + +LzmaDec_Allocate* can return: + SZ_OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); + +SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); +void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); + +/* ---------- Dictionary Interface ---------- */ + +/* You can use it, if you want to eliminate the overhead for data copying from + dictionary to some other external buffer. + You must work with CLzmaDec variables directly in this interface. + + STEPS: + LzmaDec_Constr() + LzmaDec_Allocate() + for (each new stream) + { + LzmaDec_Init() + while (it needs more decompression) + { + LzmaDec_DecodeToDic() + use data from CLzmaDec::dic and update CLzmaDec::dicPos + } + } + LzmaDec_Free() +*/ + +/* LzmaDec_DecodeToDic + + The decoding to internal dictionary buffer (CLzmaDec::dic). + You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! + +finishMode: + It has meaning only if the decoding reaches output limit (dicLimit). + LZMA_FINISH_ANY - Decode just dicLimit bytes. + LZMA_FINISH_END - Stream must be finished after dicLimit. + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_NEEDS_MORE_INPUT + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error +*/ + +SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- Buffer Interface ---------- */ + +/* It's zlib-like interface. + See LzmaDec_DecodeToDic description for information about STEPS and return results, + but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need + to work with CLzmaDec variables manually. + +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). +*/ + +SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- One Call Interface ---------- */ + +/* LzmaDecode + +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). + +Returns: + 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). +*/ + +SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAlloc *alloc); + +#endif diff --git a/host_util/lzma/C/LzmaEnc.c b/host_util/lzma/C/LzmaEnc.c new file mode 100644 index 0000000..fb49137 --- /dev/null +++ b/host_util/lzma/C/LzmaEnc.c @@ -0,0 +1,2283 @@ +/* LzmaEnc.c -- LZMA Encoder +2009-02-02 : Igor Pavlov : Public domain */ + +#include + +/* #define SHOW_STAT */ +/* #define SHOW_STAT2 */ + +#if defined(SHOW_STAT) || defined(SHOW_STAT2) +#include +#endif + +#include "LzmaEnc.h" + +#include "LzFind.h" +#ifdef COMPRESS_MF_MT +#include "LzFindMt.h" +#endif + +#ifdef SHOW_STAT +static int ttt = 0; +#endif + +#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1) + +#define kBlockSize (9 << 10) +#define kUnpackBlockSize (1 << 18) +#define kMatchArraySize (1 << 21) +#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX) + +#define kNumMaxDirectBits (31) + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 +#define kProbInitValue (kBitModelTotal >> 1) + +#define kNumMoveReducingBits 4 +#define kNumBitPriceShiftBits 4 +#define kBitPrice (1 << kNumBitPriceShiftBits) + +void LzmaEncProps_Init(CLzmaEncProps *p) +{ + p->level = 5; + p->dictSize = p->mc = 0; + p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; + p->writeEndMark = 0; +} + +void LzmaEncProps_Normalize(CLzmaEncProps *p) +{ + int level = p->level; + if (level < 0) level = 5; + p->level = level; + if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26))); + if (p->lc < 0) p->lc = 3; + if (p->lp < 0) p->lp = 0; + if (p->pb < 0) p->pb = 2; + if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); + if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); + if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); + if (p->numHashBytes < 0) p->numHashBytes = 4; + if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1); + if (p->numThreads < 0) + p->numThreads = + #ifdef COMPRESS_MF_MT + ((p->btMode && p->algo) ? 2 : 1); + #else + 1; + #endif +} + +UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) +{ + CLzmaEncProps props = *props2; + LzmaEncProps_Normalize(&props); + return props.dictSize; +} + +/* #define LZMA_LOG_BSR */ +/* Define it for Intel's CPU */ + + +#ifdef LZMA_LOG_BSR + +#define kDicLogSizeMaxCompress 30 + +#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); } + +UInt32 GetPosSlot1(UInt32 pos) +{ + UInt32 res; + BSR2_RET(pos, res); + return res; +} +#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } +#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } + +#else + +#define kNumLogBits (9 + (int)sizeof(size_t) / 2) +#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) + +void LzmaEnc_FastPosInit(Byte *g_FastPos) +{ + int c = 2, slotFast; + g_FastPos[0] = 0; + g_FastPos[1] = 1; + + for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++) + { + UInt32 k = (1 << ((slotFast >> 1) - 1)); + UInt32 j; + for (j = 0; j < k; j++, c++) + g_FastPos[c] = (Byte)slotFast; + } +} + +#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \ + (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ + res = p->g_FastPos[pos >> i] + (i * 2); } +/* +#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \ + p->g_FastPos[pos >> 6] + 12 : \ + p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; } +*/ + +#define GetPosSlot1(pos) p->g_FastPos[pos] +#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } +#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); } + +#endif + + +#define LZMA_NUM_REPS 4 + +typedef unsigned CState; + +typedef struct _COptimal +{ + UInt32 price; + + CState state; + int prev1IsChar; + int prev2; + + UInt32 posPrev2; + UInt32 backPrev2; + + UInt32 posPrev; + UInt32 backPrev; + UInt32 backs[LZMA_NUM_REPS]; +} COptimal; + +#define kNumOpts (1 << 12) + +#define kNumLenToPosStates 4 +#define kNumPosSlotBits 6 +#define kDicLogSizeMin 0 +#define kDicLogSizeMax 32 +#define kDistTableSizeMax (kDicLogSizeMax * 2) + + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) +#define kAlignMask (kAlignTableSize - 1) + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex) + +#define kNumFullDistances (1 << (kEndPosModelIndex / 2)) + +#ifdef _LZMA_PROB32 +#define CLzmaProb UInt32 +#else +#define CLzmaProb UInt16 +#endif + +#define LZMA_PB_MAX 4 +#define LZMA_LC_MAX 8 +#define LZMA_LP_MAX 4 + +#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) + + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) + +#define LZMA_MATCH_LEN_MIN 2 +#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) + +#define kNumStates 12 + +typedef struct +{ + CLzmaProb choice; + CLzmaProb choice2; + CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits]; + CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits]; + CLzmaProb high[kLenNumHighSymbols]; +} CLenEnc; + +typedef struct +{ + CLenEnc p; + UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; + UInt32 tableSize; + UInt32 counters[LZMA_NUM_PB_STATES_MAX]; +} CLenPriceEnc; + +typedef struct _CRangeEnc +{ + UInt32 range; + Byte cache; + UInt64 low; + UInt64 cacheSize; + Byte *buf; + Byte *bufLim; + Byte *bufBase; + ISeqOutStream *outStream; + UInt64 processed; + SRes res; +} CRangeEnc; + +typedef struct _CSeqInStreamBuf +{ + ISeqInStream funcTable; + const Byte *data; + SizeT rem; +} CSeqInStreamBuf; + +static SRes MyRead(void *pp, void *data, size_t *size) +{ + size_t curSize = *size; + CSeqInStreamBuf *p = (CSeqInStreamBuf *)pp; + if (p->rem < curSize) + curSize = p->rem; + memcpy(data, p->data, curSize); + p->rem -= curSize; + p->data += curSize; + *size = curSize; + return SZ_OK; +} + +typedef struct +{ + CLzmaProb *litProbs; + + CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; + CLzmaProb isRep[kNumStates]; + CLzmaProb isRepG0[kNumStates]; + CLzmaProb isRepG1[kNumStates]; + CLzmaProb isRepG2[kNumStates]; + CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; + + CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; + CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; + CLzmaProb posAlignEncoder[1 << kNumAlignBits]; + + CLenPriceEnc lenEnc; + CLenPriceEnc repLenEnc; + + UInt32 reps[LZMA_NUM_REPS]; + UInt32 state; +} CSaveState; + +typedef struct _CLzmaEnc +{ + IMatchFinder matchFinder; + void *matchFinderObj; + + #ifdef COMPRESS_MF_MT + Bool mtMode; + CMatchFinderMt matchFinderMt; + #endif + + CMatchFinder matchFinderBase; + + #ifdef COMPRESS_MF_MT + Byte pad[128]; + #endif + + UInt32 optimumEndIndex; + UInt32 optimumCurrentIndex; + + UInt32 longestMatchLength; + UInt32 numPairs; + UInt32 numAvail; + COptimal opt[kNumOpts]; + + #ifndef LZMA_LOG_BSR + Byte g_FastPos[1 << kNumLogBits]; + #endif + + UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; + UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1]; + UInt32 numFastBytes; + UInt32 additionalOffset; + UInt32 reps[LZMA_NUM_REPS]; + UInt32 state; + + UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; + UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; + UInt32 alignPrices[kAlignTableSize]; + UInt32 alignPriceCount; + + UInt32 distTableSize; + + unsigned lc, lp, pb; + unsigned lpMask, pbMask; + + CLzmaProb *litProbs; + + CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; + CLzmaProb isRep[kNumStates]; + CLzmaProb isRepG0[kNumStates]; + CLzmaProb isRepG1[kNumStates]; + CLzmaProb isRepG2[kNumStates]; + CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; + + CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; + CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; + CLzmaProb posAlignEncoder[1 << kNumAlignBits]; + + CLenPriceEnc lenEnc; + CLenPriceEnc repLenEnc; + + unsigned lclp; + + Bool fastMode; + + CRangeEnc rc; + + Bool writeEndMark; + UInt64 nowPos64; + UInt32 matchPriceCount; + Bool finished; + Bool multiThread; + + SRes result; + UInt32 dictSize; + UInt32 matchFinderCycles; + + ISeqInStream *inStream; + CSeqInStreamBuf seqBufInStream; + + CSaveState saveState; +} CLzmaEnc; + +void LzmaEnc_SaveState(CLzmaEncHandle pp) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + CSaveState *dest = &p->saveState; + int i; + dest->lenEnc = p->lenEnc; + dest->repLenEnc = p->repLenEnc; + dest->state = p->state; + + for (i = 0; i < kNumStates; i++) + { + memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); + memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); + } + for (i = 0; i < kNumLenToPosStates; i++) + memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); + memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); + memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); + memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); + memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); + memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); + memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); + memcpy(dest->reps, p->reps, sizeof(p->reps)); + memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb)); +} + +void LzmaEnc_RestoreState(CLzmaEncHandle pp) +{ + CLzmaEnc *dest = (CLzmaEnc *)pp; + const CSaveState *p = &dest->saveState; + int i; + dest->lenEnc = p->lenEnc; + dest->repLenEnc = p->repLenEnc; + dest->state = p->state; + + for (i = 0; i < kNumStates; i++) + { + memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); + memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); + } + for (i = 0; i < kNumLenToPosStates; i++) + memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); + memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); + memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); + memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); + memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); + memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); + memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); + memcpy(dest->reps, p->reps, sizeof(p->reps)); + memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb)); +} + +SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + CLzmaEncProps props = *props2; + LzmaEncProps_Normalize(&props); + + if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX || + props.dictSize > (1 << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30)) + return SZ_ERROR_PARAM; + p->dictSize = props.dictSize; + p->matchFinderCycles = props.mc; + { + unsigned fb = props.fb; + if (fb < 5) + fb = 5; + if (fb > LZMA_MATCH_LEN_MAX) + fb = LZMA_MATCH_LEN_MAX; + p->numFastBytes = fb; + } + p->lc = props.lc; + p->lp = props.lp; + p->pb = props.pb; + p->fastMode = (props.algo == 0); + p->matchFinderBase.btMode = props.btMode; + { + UInt32 numHashBytes = 4; + if (props.btMode) + { + if (props.numHashBytes < 2) + numHashBytes = 2; + else if (props.numHashBytes < 4) + numHashBytes = props.numHashBytes; + } + p->matchFinderBase.numHashBytes = numHashBytes; + } + + p->matchFinderBase.cutValue = props.mc; + + p->writeEndMark = props.writeEndMark; + + #ifdef COMPRESS_MF_MT + /* + if (newMultiThread != _multiThread) + { + ReleaseMatchFinder(); + _multiThread = newMultiThread; + } + */ + p->multiThread = (props.numThreads > 1); + #endif + + return SZ_OK; +} + +static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; +static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; +static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; +static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; + +#define IsCharState(s) ((s) < 7) + +#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) + +#define kInfinityPrice (1 << 30) + +static void RangeEnc_Construct(CRangeEnc *p) +{ + p->outStream = 0; + p->bufBase = 0; +} + +#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize) + +#define RC_BUF_SIZE (1 << 16) +static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc) +{ + if (p->bufBase == 0) + { + p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE); + if (p->bufBase == 0) + return 0; + p->bufLim = p->bufBase + RC_BUF_SIZE; + } + return 1; +} + +static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->bufBase); + p->bufBase = 0; +} + +static void RangeEnc_Init(CRangeEnc *p) +{ + /* Stream.Init(); */ + p->low = 0; + p->range = 0xFFFFFFFF; + p->cacheSize = 1; + p->cache = 0; + + p->buf = p->bufBase; + + p->processed = 0; + p->res = SZ_OK; +} + +static void RangeEnc_FlushStream(CRangeEnc *p) +{ + size_t num; + if (p->res != SZ_OK) + return; + num = p->buf - p->bufBase; + if (num != p->outStream->Write(p->outStream, p->bufBase, num)) + p->res = SZ_ERROR_WRITE; + p->processed += num; + p->buf = p->bufBase; +} + +static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) +{ + if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0) + { + Byte temp = p->cache; + do + { + Byte *buf = p->buf; + *buf++ = (Byte)(temp + (Byte)(p->low >> 32)); + p->buf = buf; + if (buf == p->bufLim) + RangeEnc_FlushStream(p); + temp = 0xFF; + } + while (--p->cacheSize != 0); + p->cache = (Byte)((UInt32)p->low >> 24); + } + p->cacheSize++; + p->low = (UInt32)p->low << 8; +} + +static void RangeEnc_FlushData(CRangeEnc *p) +{ + int i; + for (i = 0; i < 5; i++) + RangeEnc_ShiftLow(p); +} + +static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits) +{ + do + { + p->range >>= 1; + p->low += p->range & (0 - ((value >> --numBits) & 1)); + if (p->range < kTopValue) + { + p->range <<= 8; + RangeEnc_ShiftLow(p); + } + } + while (numBits != 0); +} + +static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol) +{ + UInt32 ttt = *prob; + UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt; + if (symbol == 0) + { + p->range = newBound; + ttt += (kBitModelTotal - ttt) >> kNumMoveBits; + } + else + { + p->low += newBound; + p->range -= newBound; + ttt -= ttt >> kNumMoveBits; + } + *prob = (CLzmaProb)ttt; + if (p->range < kTopValue) + { + p->range <<= 8; + RangeEnc_ShiftLow(p); + } +} + +static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol) +{ + symbol |= 0x100; + do + { + RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); + symbol <<= 1; + } + while (symbol < 0x10000); +} + +static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte) +{ + UInt32 offs = 0x100; + symbol |= 0x100; + do + { + matchByte <<= 1; + RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); + symbol <<= 1; + offs &= ~(matchByte ^ symbol); + } + while (symbol < 0x10000); +} + +void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) +{ + UInt32 i; + for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits)) + { + const int kCyclesBits = kNumBitPriceShiftBits; + UInt32 w = i; + UInt32 bitCount = 0; + int j; + for (j = 0; j < kCyclesBits; j++) + { + w = w * w; + bitCount <<= 1; + while (w >= ((UInt32)1 << 16)) + { + w >>= 1; + bitCount++; + } + } + ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); + } +} + + +#define GET_PRICE(prob, symbol) \ + p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; + +#define GET_PRICEa(prob, symbol) \ + ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; + +#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] +#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] + +#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits] +#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] + +static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices) +{ + UInt32 price = 0; + symbol |= 0x100; + do + { + price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1); + symbol <<= 1; + } + while (symbol < 0x10000); + return price; +} + +static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices) +{ + UInt32 price = 0; + UInt32 offs = 0x100; + symbol |= 0x100; + do + { + matchByte <<= 1; + price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1); + symbol <<= 1; + offs &= ~(matchByte ^ symbol); + } + while (symbol < 0x10000); + return price; +} + + +static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) +{ + UInt32 m = 1; + int i; + for (i = numBitLevels; i != 0;) + { + UInt32 bit; + i--; + bit = (symbol >> i) & 1; + RangeEnc_EncodeBit(rc, probs + m, bit); + m = (m << 1) | bit; + } +} + +static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) +{ + UInt32 m = 1; + int i; + for (i = 0; i < numBitLevels; i++) + { + UInt32 bit = symbol & 1; + RangeEnc_EncodeBit(rc, probs + m, bit); + m = (m << 1) | bit; + symbol >>= 1; + } +} + +static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) +{ + UInt32 price = 0; + symbol |= (1 << numBitLevels); + while (symbol != 1) + { + price += GET_PRICEa(probs[symbol >> 1], symbol & 1); + symbol >>= 1; + } + return price; +} + +static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) +{ + UInt32 price = 0; + UInt32 m = 1; + int i; + for (i = numBitLevels; i != 0; i--) + { + UInt32 bit = symbol & 1; + symbol >>= 1; + price += GET_PRICEa(probs[m], bit); + m = (m << 1) | bit; + } + return price; +} + + +static void LenEnc_Init(CLenEnc *p) +{ + unsigned i; + p->choice = p->choice2 = kProbInitValue; + for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++) + p->low[i] = kProbInitValue; + for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++) + p->mid[i] = kProbInitValue; + for (i = 0; i < kLenNumHighSymbols; i++) + p->high[i] = kProbInitValue; +} + +static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState) +{ + if (symbol < kLenNumLowSymbols) + { + RangeEnc_EncodeBit(rc, &p->choice, 0); + RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol); + } + else + { + RangeEnc_EncodeBit(rc, &p->choice, 1); + if (symbol < kLenNumLowSymbols + kLenNumMidSymbols) + { + RangeEnc_EncodeBit(rc, &p->choice2, 0); + RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols); + } + else + { + RangeEnc_EncodeBit(rc, &p->choice2, 1); + RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols); + } + } +} + +static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices) +{ + UInt32 a0 = GET_PRICE_0a(p->choice); + UInt32 a1 = GET_PRICE_1a(p->choice); + UInt32 b0 = a1 + GET_PRICE_0a(p->choice2); + UInt32 b1 = a1 + GET_PRICE_1a(p->choice2); + UInt32 i = 0; + for (i = 0; i < kLenNumLowSymbols; i++) + { + if (i >= numSymbols) + return; + prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices); + } + for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++) + { + if (i >= numSymbols) + return; + prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices); + } + for (; i < numSymbols; i++) + prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices); +} + +static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices) +{ + LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices); + p->counters[posState] = p->tableSize; +} + +static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices) +{ + UInt32 posState; + for (posState = 0; posState < numPosStates; posState++) + LenPriceEnc_UpdateTable(p, posState, ProbPrices); +} + +static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices) +{ + LenEnc_Encode(&p->p, rc, symbol, posState); + if (updatePrice) + if (--p->counters[posState] == 0) + LenPriceEnc_UpdateTable(p, posState, ProbPrices); +} + + + + +static void MovePos(CLzmaEnc *p, UInt32 num) +{ + #ifdef SHOW_STAT + ttt += num; + printf("\n MovePos %d", num); + #endif + if (num != 0) + { + p->additionalOffset += num; + p->matchFinder.Skip(p->matchFinderObj, num); + } +} + +static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes) +{ + UInt32 lenRes = 0, numPairs; + p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); + numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); + #ifdef SHOW_STAT + printf("\n i = %d numPairs = %d ", ttt, numPairs / 2); + ttt++; + { + UInt32 i; + for (i = 0; i < numPairs; i += 2) + printf("%2d %6d | ", p->matches[i], p->matches[i + 1]); + } + #endif + if (numPairs > 0) + { + lenRes = p->matches[numPairs - 2]; + if (lenRes == p->numFastBytes) + { + const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + UInt32 distance = p->matches[numPairs - 1] + 1; + UInt32 numAvail = p->numAvail; + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + { + const Byte *pby2 = pby - distance; + for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++); + } + } + } + p->additionalOffset++; + *numDistancePairsRes = numPairs; + return lenRes; +} + + +#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False; +#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False; +#define IsShortRep(p) ((p)->backPrev == 0) + +static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState) +{ + return + GET_PRICE_0(p->isRepG0[state]) + + GET_PRICE_0(p->isRep0Long[state][posState]); +} + +static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState) +{ + UInt32 price; + if (repIndex == 0) + { + price = GET_PRICE_0(p->isRepG0[state]); + price += GET_PRICE_1(p->isRep0Long[state][posState]); + } + else + { + price = GET_PRICE_1(p->isRepG0[state]); + if (repIndex == 1) + price += GET_PRICE_0(p->isRepG1[state]); + else + { + price += GET_PRICE_1(p->isRepG1[state]); + price += GET_PRICE(p->isRepG2[state], repIndex - 2); + } + } + return price; +} + +static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState) +{ + return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] + + GetPureRepPrice(p, repIndex, state, posState); +} + +static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur) +{ + UInt32 posMem = p->opt[cur].posPrev; + UInt32 backMem = p->opt[cur].backPrev; + p->optimumEndIndex = cur; + do + { + if (p->opt[cur].prev1IsChar) + { + MakeAsChar(&p->opt[posMem]) + p->opt[posMem].posPrev = posMem - 1; + if (p->opt[cur].prev2) + { + p->opt[posMem - 1].prev1IsChar = False; + p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2; + p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2; + } + } + { + UInt32 posPrev = posMem; + UInt32 backCur = backMem; + + backMem = p->opt[posPrev].backPrev; + posMem = p->opt[posPrev].posPrev; + + p->opt[posPrev].backPrev = backCur; + p->opt[posPrev].posPrev = cur; + cur = posPrev; + } + } + while (cur != 0); + *backRes = p->opt[0].backPrev; + p->optimumCurrentIndex = p->opt[0].posPrev; + return p->optimumCurrentIndex; +} + +#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300) + +static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) +{ + UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur; + UInt32 matchPrice, repMatchPrice, normalMatchPrice; + UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS]; + UInt32 *matches; + const Byte *data; + Byte curByte, matchByte; + if (p->optimumEndIndex != p->optimumCurrentIndex) + { + const COptimal *opt = &p->opt[p->optimumCurrentIndex]; + UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex; + *backRes = opt->backPrev; + p->optimumCurrentIndex = opt->posPrev; + return lenRes; + } + p->optimumCurrentIndex = p->optimumEndIndex = 0; + + if (p->additionalOffset == 0) + mainLen = ReadMatchDistances(p, &numPairs); + else + { + mainLen = p->longestMatchLength; + numPairs = p->numPairs; + } + + numAvail = p->numAvail; + if (numAvail < 2) + { + *backRes = (UInt32)(-1); + return 1; + } + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + repMaxIndex = 0; + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 lenTest; + const Byte *data2; + reps[i] = p->reps[i]; + data2 = data - (reps[i] + 1); + if (data[0] != data2[0] || data[1] != data2[1]) + { + repLens[i] = 0; + continue; + } + for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); + repLens[i] = lenTest; + if (lenTest > repLens[repMaxIndex]) + repMaxIndex = i; + } + if (repLens[repMaxIndex] >= p->numFastBytes) + { + UInt32 lenRes; + *backRes = repMaxIndex; + lenRes = repLens[repMaxIndex]; + MovePos(p, lenRes - 1); + return lenRes; + } + + matches = p->matches; + if (mainLen >= p->numFastBytes) + { + *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; + MovePos(p, mainLen - 1); + return mainLen; + } + curByte = *data; + matchByte = *(data - (reps[0] + 1)); + + if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2) + { + *backRes = (UInt32)-1; + return 1; + } + + p->opt[0].state = (CState)p->state; + + posState = (position & p->pbMask); + + { + const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); + p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + + (!IsCharState(p->state) ? + LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : + LitEnc_GetPrice(probs, curByte, p->ProbPrices)); + } + + MakeAsChar(&p->opt[1]); + + matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); + repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); + + if (matchByte == curByte) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState); + if (shortRepPrice < p->opt[1].price) + { + p->opt[1].price = shortRepPrice; + MakeAsShortRep(&p->opt[1]); + } + } + lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]); + + if (lenEnd < 2) + { + *backRes = p->opt[1].backPrev; + return 1; + } + + p->opt[1].posPrev = 0; + for (i = 0; i < LZMA_NUM_REPS; i++) + p->opt[0].backs[i] = reps[i]; + + len = lenEnd; + do + p->opt[len--].price = kInfinityPrice; + while (len >= 2); + + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 repLen = repLens[i]; + UInt32 price; + if (repLen < 2) + continue; + price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState); + do + { + UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2]; + COptimal *opt = &p->opt[repLen]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = 0; + opt->backPrev = i; + opt->prev1IsChar = False; + } + } + while (--repLen >= 2); + } + + normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); + + len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); + if (len <= mainLen) + { + UInt32 offs = 0; + while (len > matches[offs]) + offs += 2; + for (; ; len++) + { + COptimal *opt; + UInt32 distance = matches[offs + 1]; + + UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN]; + UInt32 lenToPosState = GetLenToPosState(len); + if (distance < kNumFullDistances) + curAndLenPrice += p->distancesPrices[lenToPosState][distance]; + else + { + UInt32 slot; + GetPosSlot2(distance, slot); + curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot]; + } + opt = &p->opt[len]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = 0; + opt->backPrev = distance + LZMA_NUM_REPS; + opt->prev1IsChar = False; + } + if (len == matches[offs]) + { + offs += 2; + if (offs == numPairs) + break; + } + } + } + + cur = 0; + + #ifdef SHOW_STAT2 + if (position >= 0) + { + unsigned i; + printf("\n pos = %4X", position); + for (i = cur; i <= lenEnd; i++) + printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price); + } + #endif + + for (;;) + { + UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen; + UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice; + Bool nextIsChar; + Byte curByte, matchByte; + const Byte *data; + COptimal *curOpt; + COptimal *nextOpt; + + cur++; + if (cur == lenEnd) + return Backward(p, backRes, cur); + + newLen = ReadMatchDistances(p, &numPairs); + if (newLen >= p->numFastBytes) + { + p->numPairs = numPairs; + p->longestMatchLength = newLen; + return Backward(p, backRes, cur); + } + position++; + curOpt = &p->opt[cur]; + posPrev = curOpt->posPrev; + if (curOpt->prev1IsChar) + { + posPrev--; + if (curOpt->prev2) + { + state = p->opt[curOpt->posPrev2].state; + if (curOpt->backPrev2 < LZMA_NUM_REPS) + state = kRepNextStates[state]; + else + state = kMatchNextStates[state]; + } + else + state = p->opt[posPrev].state; + state = kLiteralNextStates[state]; + } + else + state = p->opt[posPrev].state; + if (posPrev == cur - 1) + { + if (IsShortRep(curOpt)) + state = kShortRepNextStates[state]; + else + state = kLiteralNextStates[state]; + } + else + { + UInt32 pos; + const COptimal *prevOpt; + if (curOpt->prev1IsChar && curOpt->prev2) + { + posPrev = curOpt->posPrev2; + pos = curOpt->backPrev2; + state = kRepNextStates[state]; + } + else + { + pos = curOpt->backPrev; + if (pos < LZMA_NUM_REPS) + state = kRepNextStates[state]; + else + state = kMatchNextStates[state]; + } + prevOpt = &p->opt[posPrev]; + if (pos < LZMA_NUM_REPS) + { + UInt32 i; + reps[0] = prevOpt->backs[pos]; + for (i = 1; i <= pos; i++) + reps[i] = prevOpt->backs[i - 1]; + for (; i < LZMA_NUM_REPS; i++) + reps[i] = prevOpt->backs[i]; + } + else + { + UInt32 i; + reps[0] = (pos - LZMA_NUM_REPS); + for (i = 1; i < LZMA_NUM_REPS; i++) + reps[i] = prevOpt->backs[i - 1]; + } + } + curOpt->state = (CState)state; + + curOpt->backs[0] = reps[0]; + curOpt->backs[1] = reps[1]; + curOpt->backs[2] = reps[2]; + curOpt->backs[3] = reps[3]; + + curPrice = curOpt->price; + nextIsChar = False; + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + curByte = *data; + matchByte = *(data - (reps[0] + 1)); + + posState = (position & p->pbMask); + + curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]); + { + const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); + curAnd1Price += + (!IsCharState(state) ? + LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : + LitEnc_GetPrice(probs, curByte, p->ProbPrices)); + } + + nextOpt = &p->opt[cur + 1]; + + if (curAnd1Price < nextOpt->price) + { + nextOpt->price = curAnd1Price; + nextOpt->posPrev = cur; + MakeAsChar(nextOpt); + nextIsChar = True; + } + + matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]); + repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); + + if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0)) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState); + if (shortRepPrice <= nextOpt->price) + { + nextOpt->price = shortRepPrice; + nextOpt->posPrev = cur; + MakeAsShortRep(nextOpt); + nextIsChar = True; + } + } + numAvailFull = p->numAvail; + { + UInt32 temp = kNumOpts - 1 - cur; + if (temp < numAvailFull) + numAvailFull = temp; + } + + if (numAvailFull < 2) + continue; + numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); + + if (!nextIsChar && matchByte != curByte) /* speed optimization */ + { + /* try Literal + rep0 */ + UInt32 temp; + UInt32 lenTest2; + const Byte *data2 = data - (reps[0] + 1); + UInt32 limit = p->numFastBytes + 1; + if (limit > numAvailFull) + limit = numAvailFull; + + for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++); + lenTest2 = temp - 1; + if (lenTest2 >= 2) + { + UInt32 state2 = kLiteralNextStates[state]; + UInt32 posStateNext = (position + 1) & p->pbMask; + UInt32 nextRepMatchPrice = curAnd1Price + + GET_PRICE_1(p->isMatch[state2][posStateNext]) + + GET_PRICE_1(p->isRep[state2]); + /* for (; lenTest2 >= 2; lenTest2--) */ + { + UInt32 curAndLenPrice; + COptimal *opt; + UInt32 offset = cur + 1 + lenTest2; + while (lenEnd < offset) + p->opt[++lenEnd].price = kInfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); + opt = &p->opt[offset]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur + 1; + opt->backPrev = 0; + opt->prev1IsChar = True; + opt->prev2 = False; + } + } + } + } + + startLen = 2; /* speed optimization */ + { + UInt32 repIndex; + for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++) + { + UInt32 lenTest; + UInt32 lenTestTemp; + UInt32 price; + const Byte *data2 = data - (reps[repIndex] + 1); + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); + while (lenEnd < cur + lenTest) + p->opt[++lenEnd].price = kInfinityPrice; + lenTestTemp = lenTest; + price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState); + do + { + UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2]; + COptimal *opt = &p->opt[cur + lenTest]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur; + opt->backPrev = repIndex; + opt->prev1IsChar = False; + } + } + while (--lenTest >= 2); + lenTest = lenTestTemp; + + if (repIndex == 0) + startLen = lenTest + 1; + + /* if (_maxMode) */ + { + UInt32 lenTest2 = lenTest + 1; + UInt32 limit = lenTest2 + p->numFastBytes; + UInt32 nextRepMatchPrice; + if (limit > numAvailFull) + limit = numAvailFull; + for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); + lenTest2 -= lenTest + 1; + if (lenTest2 >= 2) + { + UInt32 state2 = kRepNextStates[state]; + UInt32 posStateNext = (position + lenTest) & p->pbMask; + UInt32 curAndLenCharPrice = + price + p->repLenEnc.prices[posState][lenTest - 2] + + GET_PRICE_0(p->isMatch[state2][posStateNext]) + + LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), + data[lenTest], data2[lenTest], p->ProbPrices); + state2 = kLiteralNextStates[state2]; + posStateNext = (position + lenTest + 1) & p->pbMask; + nextRepMatchPrice = curAndLenCharPrice + + GET_PRICE_1(p->isMatch[state2][posStateNext]) + + GET_PRICE_1(p->isRep[state2]); + + /* for (; lenTest2 >= 2; lenTest2--) */ + { + UInt32 curAndLenPrice; + COptimal *opt; + UInt32 offset = cur + lenTest + 1 + lenTest2; + while (lenEnd < offset) + p->opt[++lenEnd].price = kInfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); + opt = &p->opt[offset]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur + lenTest + 1; + opt->backPrev = 0; + opt->prev1IsChar = True; + opt->prev2 = True; + opt->posPrev2 = cur; + opt->backPrev2 = repIndex; + } + } + } + } + } + } + /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */ + if (newLen > numAvail) + { + newLen = numAvail; + for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2); + matches[numPairs] = newLen; + numPairs += 2; + } + if (newLen >= startLen) + { + UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); + UInt32 offs, curBack, posSlot; + UInt32 lenTest; + while (lenEnd < cur + newLen) + p->opt[++lenEnd].price = kInfinityPrice; + + offs = 0; + while (startLen > matches[offs]) + offs += 2; + curBack = matches[offs + 1]; + GetPosSlot2(curBack, posSlot); + for (lenTest = /*2*/ startLen; ; lenTest++) + { + UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN]; + UInt32 lenToPosState = GetLenToPosState(lenTest); + COptimal *opt; + if (curBack < kNumFullDistances) + curAndLenPrice += p->distancesPrices[lenToPosState][curBack]; + else + curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask]; + + opt = &p->opt[cur + lenTest]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur; + opt->backPrev = curBack + LZMA_NUM_REPS; + opt->prev1IsChar = False; + } + + if (/*_maxMode && */lenTest == matches[offs]) + { + /* Try Match + Literal + Rep0 */ + const Byte *data2 = data - (curBack + 1); + UInt32 lenTest2 = lenTest + 1; + UInt32 limit = lenTest2 + p->numFastBytes; + UInt32 nextRepMatchPrice; + if (limit > numAvailFull) + limit = numAvailFull; + for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); + lenTest2 -= lenTest + 1; + if (lenTest2 >= 2) + { + UInt32 state2 = kMatchNextStates[state]; + UInt32 posStateNext = (position + lenTest) & p->pbMask; + UInt32 curAndLenCharPrice = curAndLenPrice + + GET_PRICE_0(p->isMatch[state2][posStateNext]) + + LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), + data[lenTest], data2[lenTest], p->ProbPrices); + state2 = kLiteralNextStates[state2]; + posStateNext = (posStateNext + 1) & p->pbMask; + nextRepMatchPrice = curAndLenCharPrice + + GET_PRICE_1(p->isMatch[state2][posStateNext]) + + GET_PRICE_1(p->isRep[state2]); + + /* for (; lenTest2 >= 2; lenTest2--) */ + { + UInt32 offset = cur + lenTest + 1 + lenTest2; + UInt32 curAndLenPrice; + COptimal *opt; + while (lenEnd < offset) + p->opt[++lenEnd].price = kInfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); + opt = &p->opt[offset]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur + lenTest + 1; + opt->backPrev = 0; + opt->prev1IsChar = True; + opt->prev2 = True; + opt->posPrev2 = cur; + opt->backPrev2 = curBack + LZMA_NUM_REPS; + } + } + } + offs += 2; + if (offs == numPairs) + break; + curBack = matches[offs + 1]; + if (curBack >= kNumFullDistances) + GetPosSlot2(curBack, posSlot); + } + } + } + } +} + +#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) + +static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes) +{ + UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i; + const Byte *data; + const UInt32 *matches; + + if (p->additionalOffset == 0) + mainLen = ReadMatchDistances(p, &numPairs); + else + { + mainLen = p->longestMatchLength; + numPairs = p->numPairs; + } + + numAvail = p->numAvail; + *backRes = (UInt32)-1; + if (numAvail < 2) + return 1; + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + + repLen = repIndex = 0; + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 len; + const Byte *data2 = data - (p->reps[i] + 1); + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + for (len = 2; len < numAvail && data[len] == data2[len]; len++); + if (len >= p->numFastBytes) + { + *backRes = i; + MovePos(p, len - 1); + return len; + } + if (len > repLen) + { + repIndex = i; + repLen = len; + } + } + + matches = p->matches; + if (mainLen >= p->numFastBytes) + { + *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; + MovePos(p, mainLen - 1); + return mainLen; + } + + mainDist = 0; /* for GCC */ + if (mainLen >= 2) + { + mainDist = matches[numPairs - 1]; + while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1) + { + if (!ChangePair(matches[numPairs - 3], mainDist)) + break; + numPairs -= 2; + mainLen = matches[numPairs - 2]; + mainDist = matches[numPairs - 1]; + } + if (mainLen == 2 && mainDist >= 0x80) + mainLen = 1; + } + + if (repLen >= 2 && ( + (repLen + 1 >= mainLen) || + (repLen + 2 >= mainLen && mainDist >= (1 << 9)) || + (repLen + 3 >= mainLen && mainDist >= (1 << 15)))) + { + *backRes = repIndex; + MovePos(p, repLen - 1); + return repLen; + } + + if (mainLen < 2 || numAvail <= 2) + return 1; + + p->longestMatchLength = ReadMatchDistances(p, &p->numPairs); + if (p->longestMatchLength >= 2) + { + UInt32 newDistance = matches[p->numPairs - 1]; + if ((p->longestMatchLength >= mainLen && newDistance < mainDist) || + (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) || + (p->longestMatchLength > mainLen + 1) || + (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist))) + return 1; + } + + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 len, limit; + const Byte *data2 = data - (p->reps[i] + 1); + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + limit = mainLen - 1; + for (len = 2; len < limit && data[len] == data2[len]; len++); + if (len >= limit) + return 1; + } + *backRes = mainDist + LZMA_NUM_REPS; + MovePos(p, mainLen - 2); + return mainLen; +} + +static void WriteEndMarker(CLzmaEnc *p, UInt32 posState) +{ + UInt32 len; + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); + RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); + p->state = kMatchNextStates[p->state]; + len = LZMA_MATCH_LEN_MIN; + LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); + RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1); + RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits); + RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); +} + +static SRes CheckErrors(CLzmaEnc *p) +{ + if (p->result != SZ_OK) + return p->result; + if (p->rc.res != SZ_OK) + p->result = SZ_ERROR_WRITE; + if (p->matchFinderBase.result != SZ_OK) + p->result = SZ_ERROR_READ; + if (p->result != SZ_OK) + p->finished = True; + return p->result; +} + +static SRes Flush(CLzmaEnc *p, UInt32 nowPos) +{ + /* ReleaseMFStream(); */ + p->finished = True; + if (p->writeEndMark) + WriteEndMarker(p, nowPos & p->pbMask); + RangeEnc_FlushData(&p->rc); + RangeEnc_FlushStream(&p->rc); + return CheckErrors(p); +} + +static void FillAlignPrices(CLzmaEnc *p) +{ + UInt32 i; + for (i = 0; i < kAlignTableSize; i++) + p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); + p->alignPriceCount = 0; +} + +static void FillDistancesPrices(CLzmaEnc *p) +{ + UInt32 tempPrices[kNumFullDistances]; + UInt32 i, lenToPosState; + for (i = kStartPosModelIndex; i < kNumFullDistances; i++) + { + UInt32 posSlot = GetPosSlot1(i); + UInt32 footerBits = ((posSlot >> 1) - 1); + UInt32 base = ((2 | (posSlot & 1)) << footerBits); + tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices); + } + + for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) + { + UInt32 posSlot; + const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState]; + UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState]; + for (posSlot = 0; posSlot < p->distTableSize; posSlot++) + posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); + for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++) + posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); + + { + UInt32 *distancesPrices = p->distancesPrices[lenToPosState]; + UInt32 i; + for (i = 0; i < kStartPosModelIndex; i++) + distancesPrices[i] = posSlotPrices[i]; + for (; i < kNumFullDistances; i++) + distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i]; + } + } + p->matchPriceCount = 0; +} + +void LzmaEnc_Construct(CLzmaEnc *p) +{ + RangeEnc_Construct(&p->rc); + MatchFinder_Construct(&p->matchFinderBase); + #ifdef COMPRESS_MF_MT + MatchFinderMt_Construct(&p->matchFinderMt); + p->matchFinderMt.MatchFinder = &p->matchFinderBase; + #endif + + { + CLzmaEncProps props; + LzmaEncProps_Init(&props); + LzmaEnc_SetProps(p, &props); + } + + #ifndef LZMA_LOG_BSR + LzmaEnc_FastPosInit(p->g_FastPos); + #endif + + LzmaEnc_InitPriceTables(p->ProbPrices); + p->litProbs = 0; + p->saveState.litProbs = 0; +} + +CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc) +{ + void *p; + p = alloc->Alloc(alloc, sizeof(CLzmaEnc)); + if (p != 0) + LzmaEnc_Construct((CLzmaEnc *)p); + return p; +} + +void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->litProbs); + alloc->Free(alloc, p->saveState.litProbs); + p->litProbs = 0; + p->saveState.litProbs = 0; +} + +void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + #ifdef COMPRESS_MF_MT + MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); + #endif + MatchFinder_Free(&p->matchFinderBase, allocBig); + LzmaEnc_FreeLits(p, alloc); + RangeEnc_Free(&p->rc, alloc); +} + +void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); + alloc->Free(alloc, p); +} + +static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize) +{ + UInt32 nowPos32, startPos32; + if (p->inStream != 0) + { + p->matchFinderBase.stream = p->inStream; + p->matchFinder.Init(p->matchFinderObj); + p->inStream = 0; + } + + if (p->finished) + return p->result; + RINOK(CheckErrors(p)); + + nowPos32 = (UInt32)p->nowPos64; + startPos32 = nowPos32; + + if (p->nowPos64 == 0) + { + UInt32 numPairs; + Byte curByte; + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) + return Flush(p, nowPos32); + ReadMatchDistances(p, &numPairs); + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0); + p->state = kLiteralNextStates[p->state]; + curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset); + LitEnc_Encode(&p->rc, p->litProbs, curByte); + p->additionalOffset--; + nowPos32++; + } + + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) + for (;;) + { + UInt32 pos, len, posState; + + if (p->fastMode) + len = GetOptimumFast(p, &pos); + else + len = GetOptimum(p, nowPos32, &pos); + + #ifdef SHOW_STAT2 + printf("\n pos = %4X, len = %d pos = %d", nowPos32, len, pos); + #endif + + posState = nowPos32 & p->pbMask; + if (len == 1 && pos == (UInt32)-1) + { + Byte curByte; + CLzmaProb *probs; + const Byte *data; + + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0); + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; + curByte = *data; + probs = LIT_PROBS(nowPos32, *(data - 1)); + if (IsCharState(p->state)) + LitEnc_Encode(&p->rc, probs, curByte); + else + LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1)); + p->state = kLiteralNextStates[p->state]; + } + else + { + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); + if (pos < LZMA_NUM_REPS) + { + RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1); + if (pos == 0) + { + RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0); + RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1)); + } + else + { + UInt32 distance = p->reps[pos]; + RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1); + if (pos == 1) + RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0); + else + { + RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1); + RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2); + if (pos == 3) + p->reps[3] = p->reps[2]; + p->reps[2] = p->reps[1]; + } + p->reps[1] = p->reps[0]; + p->reps[0] = distance; + } + if (len == 1) + p->state = kShortRepNextStates[p->state]; + else + { + LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); + p->state = kRepNextStates[p->state]; + } + } + else + { + UInt32 posSlot; + RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); + p->state = kMatchNextStates[p->state]; + LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); + pos -= LZMA_NUM_REPS; + GetPosSlot(pos, posSlot); + RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot); + + if (posSlot >= kStartPosModelIndex) + { + UInt32 footerBits = ((posSlot >> 1) - 1); + UInt32 base = ((2 | (posSlot & 1)) << footerBits); + UInt32 posReduced = pos - base; + + if (posSlot < kEndPosModelIndex) + RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced); + else + { + RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); + RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); + p->alignPriceCount++; + } + } + p->reps[3] = p->reps[2]; + p->reps[2] = p->reps[1]; + p->reps[1] = p->reps[0]; + p->reps[0] = pos; + p->matchPriceCount++; + } + } + p->additionalOffset -= len; + nowPos32 += len; + if (p->additionalOffset == 0) + { + UInt32 processed; + if (!p->fastMode) + { + if (p->matchPriceCount >= (1 << 7)) + FillDistancesPrices(p); + if (p->alignPriceCount >= kAlignTableSize) + FillAlignPrices(p); + } + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) + break; + processed = nowPos32 - startPos32; + if (useLimits) + { + if (processed + kNumOpts + 300 >= maxUnpackSize || + RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize) + break; + } + else if (processed >= (1 << 15)) + { + p->nowPos64 += nowPos32 - startPos32; + return CheckErrors(p); + } + } + } + p->nowPos64 += nowPos32 - startPos32; + return Flush(p, nowPos32); +} + +#define kBigHashDicLimit ((UInt32)1 << 24) + +static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + UInt32 beforeSize = kNumOpts; + #ifdef COMPRESS_MF_MT + Bool btMode; + #endif + if (!RangeEnc_Alloc(&p->rc, alloc)) + return SZ_ERROR_MEM; + #ifdef COMPRESS_MF_MT + btMode = (p->matchFinderBase.btMode != 0); + p->mtMode = (p->multiThread && !p->fastMode && btMode); + #endif + + { + unsigned lclp = p->lc + p->lp; + if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp) + { + LzmaEnc_FreeLits(p, alloc); + p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); + p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); + if (p->litProbs == 0 || p->saveState.litProbs == 0) + { + LzmaEnc_FreeLits(p, alloc); + return SZ_ERROR_MEM; + } + p->lclp = lclp; + } + } + + p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit); + + if (beforeSize + p->dictSize < keepWindowSize) + beforeSize = keepWindowSize - p->dictSize; + + #ifdef COMPRESS_MF_MT + if (p->mtMode) + { + RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)); + p->matchFinderObj = &p->matchFinderMt; + MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); + } + else + #endif + { + if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)) + return SZ_ERROR_MEM; + p->matchFinderObj = &p->matchFinderBase; + MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder); + } + return SZ_OK; +} + +void LzmaEnc_Init(CLzmaEnc *p) +{ + UInt32 i; + p->state = 0; + for (i = 0 ; i < LZMA_NUM_REPS; i++) + p->reps[i] = 0; + + RangeEnc_Init(&p->rc); + + + for (i = 0; i < kNumStates; i++) + { + UInt32 j; + for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) + { + p->isMatch[i][j] = kProbInitValue; + p->isRep0Long[i][j] = kProbInitValue; + } + p->isRep[i] = kProbInitValue; + p->isRepG0[i] = kProbInitValue; + p->isRepG1[i] = kProbInitValue; + p->isRepG2[i] = kProbInitValue; + } + + { + UInt32 num = 0x300 << (p->lp + p->lc); + for (i = 0; i < num; i++) + p->litProbs[i] = kProbInitValue; + } + + { + for (i = 0; i < kNumLenToPosStates; i++) + { + CLzmaProb *probs = p->posSlotEncoder[i]; + UInt32 j; + for (j = 0; j < (1 << kNumPosSlotBits); j++) + probs[j] = kProbInitValue; + } + } + { + for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) + p->posEncoders[i] = kProbInitValue; + } + + LenEnc_Init(&p->lenEnc.p); + LenEnc_Init(&p->repLenEnc.p); + + for (i = 0; i < (1 << kNumAlignBits); i++) + p->posAlignEncoder[i] = kProbInitValue; + + p->optimumEndIndex = 0; + p->optimumCurrentIndex = 0; + p->additionalOffset = 0; + + p->pbMask = (1 << p->pb) - 1; + p->lpMask = (1 << p->lp) - 1; +} + +void LzmaEnc_InitPrices(CLzmaEnc *p) +{ + if (!p->fastMode) + { + FillDistancesPrices(p); + FillAlignPrices(p); + } + + p->lenEnc.tableSize = + p->repLenEnc.tableSize = + p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; + LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices); + LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices); +} + +static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + UInt32 i; + for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++) + if (p->dictSize <= ((UInt32)1 << i)) + break; + p->distTableSize = i * 2; + + p->finished = False; + p->result = SZ_OK; + RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); + LzmaEnc_Init(p); + LzmaEnc_InitPrices(p); + p->nowPos64 = 0; + return SZ_OK; +} + +static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqInStream *inStream, ISeqOutStream *outStream, + ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + p->inStream = inStream; + p->rc.outStream = outStream; + return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig); +} + +SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, + ISeqInStream *inStream, UInt32 keepWindowSize, + ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + p->inStream = inStream; + return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); +} + +static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) +{ + p->seqBufInStream.funcTable.Read = MyRead; + p->seqBufInStream.data = src; + p->seqBufInStream.rem = srcLen; +} + +SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, + UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + LzmaEnc_SetInputBuf(p, src, srcLen); + p->inStream = &p->seqBufInStream.funcTable; + return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); +} + +void LzmaEnc_Finish(CLzmaEncHandle pp) +{ + #ifdef COMPRESS_MF_MT + CLzmaEnc *p = (CLzmaEnc *)pp; + if (p->mtMode) + MatchFinderMt_ReleaseStream(&p->matchFinderMt); + #else + pp = pp; + #endif +} + +typedef struct _CSeqOutStreamBuf +{ + ISeqOutStream funcTable; + Byte *data; + SizeT rem; + Bool overflow; +} CSeqOutStreamBuf; + +static size_t MyWrite(void *pp, const void *data, size_t size) +{ + CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp; + if (p->rem < size) + { + size = p->rem; + p->overflow = True; + } + memcpy(p->data, data, size); + p->rem -= size; + p->data += size; + return size; +} + + +UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp) +{ + const CLzmaEnc *p = (CLzmaEnc *)pp; + return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); +} + +const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp) +{ + const CLzmaEnc *p = (CLzmaEnc *)pp; + return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; +} + +SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, + Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + UInt64 nowPos64; + SRes res; + CSeqOutStreamBuf outStream; + + outStream.funcTable.Write = MyWrite; + outStream.data = dest; + outStream.rem = *destLen; + outStream.overflow = False; + + p->writeEndMark = False; + p->finished = False; + p->result = SZ_OK; + + if (reInit) + LzmaEnc_Init(p); + LzmaEnc_InitPrices(p); + nowPos64 = p->nowPos64; + RangeEnc_Init(&p->rc); + p->rc.outStream = &outStream.funcTable; + + res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize); + + *unpackSize = (UInt32)(p->nowPos64 - nowPos64); + *destLen -= outStream.rem; + if (outStream.overflow) + return SZ_ERROR_OUTPUT_EOF; + + return res; +} + +SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, + ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + SRes res = SZ_OK; + + #ifdef COMPRESS_MF_MT + Byte allocaDummy[0x300]; + int i = 0; + for (i = 0; i < 16; i++) + allocaDummy[i] = (Byte)i; + #endif + + RINOK(LzmaEnc_Prepare(pp, inStream, outStream, alloc, allocBig)); + + for (;;) + { + res = LzmaEnc_CodeOneBlock(p, False, 0, 0); + if (res != SZ_OK || p->finished != 0) + break; + if (progress != 0) + { + res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); + if (res != SZ_OK) + { + res = SZ_ERROR_PROGRESS; + break; + } + } + } + LzmaEnc_Finish(pp); + return res; +} + +SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + int i; + UInt32 dictSize = p->dictSize; + if (*size < LZMA_PROPS_SIZE) + return SZ_ERROR_PARAM; + *size = LZMA_PROPS_SIZE; + props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); + + for (i = 11; i <= 30; i++) + { + if (dictSize <= ((UInt32)2 << i)) + { + dictSize = (2 << i); + break; + } + if (dictSize <= ((UInt32)3 << i)) + { + dictSize = (3 << i); + break; + } + } + + for (i = 0; i < 4; i++) + props[1 + i] = (Byte)(dictSize >> (8 * i)); + return SZ_OK; +} + +SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + SRes res; + CLzmaEnc *p = (CLzmaEnc *)pp; + + CSeqOutStreamBuf outStream; + + LzmaEnc_SetInputBuf(p, src, srcLen); + + outStream.funcTable.Write = MyWrite; + outStream.data = dest; + outStream.rem = *destLen; + outStream.overflow = False; + + p->writeEndMark = writeEndMark; + res = LzmaEnc_Encode(pp, &outStream.funcTable, &p->seqBufInStream.funcTable, + progress, alloc, allocBig); + + *destLen -= outStream.rem; + if (outStream.overflow) + return SZ_ERROR_OUTPUT_EOF; + return res; +} + +SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); + SRes res; + if (p == 0) + return SZ_ERROR_MEM; + + res = LzmaEnc_SetProps(p, props); + if (res == SZ_OK) + { + res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize); + if (res == SZ_OK) + res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen, + writeEndMark, progress, alloc, allocBig); + } + + LzmaEnc_Destroy(p, alloc, allocBig); + return res; +} diff --git a/host_util/lzma/C/LzmaEnc.h b/host_util/lzma/C/LzmaEnc.h new file mode 100644 index 0000000..bfbc7d2 --- /dev/null +++ b/host_util/lzma/C/LzmaEnc.h @@ -0,0 +1,72 @@ +/* LzmaEnc.h -- LZMA Encoder +2008-10-04 : Igor Pavlov : Public domain */ + +#ifndef __LZMAENC_H +#define __LZMAENC_H + +#include "Types.h" + +#define LZMA_PROPS_SIZE 5 + +typedef struct _CLzmaEncProps +{ + int level; /* 0 <= level <= 9 */ + UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version + (1 << 12) <= dictSize <= (1 << 30) for 64-bit version + default = (1 << 24) */ + int lc; /* 0 <= lc <= 8, default = 3 */ + int lp; /* 0 <= lp <= 4, default = 0 */ + int pb; /* 0 <= pb <= 4, default = 2 */ + int algo; /* 0 - fast, 1 - normal, default = 1 */ + int fb; /* 5 <= fb <= 273, default = 32 */ + int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ + int numHashBytes; /* 2, 3 or 4, default = 4 */ + UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ + unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ + int numThreads; /* 1 or 2, default = 2 */ +} CLzmaEncProps; + +void LzmaEncProps_Init(CLzmaEncProps *p); +void LzmaEncProps_Normalize(CLzmaEncProps *p); +UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2); + + +/* ---------- CLzmaEncHandle Interface ---------- */ + +/* LzmaEnc_* functions can return the following exit codes: +Returns: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater in props + SZ_ERROR_WRITE - Write callback error. + SZ_ERROR_PROGRESS - some break from progress callback + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) +*/ + +typedef void * CLzmaEncHandle; + +CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc); +void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig); +SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); +SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); +SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); +SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); + +/* ---------- One Call Interface ---------- */ + +/* LzmaEncode +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) +*/ + +SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); + +#endif diff --git a/host_util/lzma/C/Types.h b/host_util/lzma/C/Types.h new file mode 100644 index 0000000..1af5cfc --- /dev/null +++ b/host_util/lzma/C/Types.h @@ -0,0 +1,208 @@ +/* Types.h -- Basic types +2008-11-23 : Igor Pavlov : Public domain */ + +#ifndef __7Z_TYPES_H +#define __7Z_TYPES_H + +#include + +#ifdef _WIN32 +#include +#endif + +#define SZ_OK 0 + +#define SZ_ERROR_DATA 1 +#define SZ_ERROR_MEM 2 +#define SZ_ERROR_CRC 3 +#define SZ_ERROR_UNSUPPORTED 4 +#define SZ_ERROR_PARAM 5 +#define SZ_ERROR_INPUT_EOF 6 +#define SZ_ERROR_OUTPUT_EOF 7 +#define SZ_ERROR_READ 8 +#define SZ_ERROR_WRITE 9 +#define SZ_ERROR_PROGRESS 10 +#define SZ_ERROR_FAIL 11 +#define SZ_ERROR_THREAD 12 + +#define SZ_ERROR_ARCHIVE 16 +#define SZ_ERROR_NO_ARCHIVE 17 + +typedef int SRes; + +#ifdef _WIN32 +typedef DWORD WRes; +#else +typedef int WRes; +#endif + +#ifndef RINOK +#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } +#endif + +typedef unsigned char Byte; +typedef short Int16; +typedef unsigned short UInt16; + +#ifdef _LZMA_UINT32_IS_ULONG +typedef long Int32; +typedef unsigned long UInt32; +#else +typedef int Int32; +typedef unsigned int UInt32; +#endif + +#ifdef _SZ_NO_INT_64 + +/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. + NOTES: Some code will work incorrectly in that case! */ + +typedef long Int64; +typedef unsigned long UInt64; + +#else + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#else +typedef long long int Int64; +typedef unsigned long long int UInt64; +#endif + +#endif + +#ifdef _LZMA_NO_SYSTEM_SIZE_T +typedef UInt32 SizeT; +#else +typedef size_t SizeT; +#endif + +typedef int Bool; +#define True 1 +#define False 0 + + +#ifdef _MSC_VER + +#if _MSC_VER >= 1300 +#define MY_NO_INLINE __declspec(noinline) +#else +#define MY_NO_INLINE +#endif + +#define MY_CDECL __cdecl +#define MY_STD_CALL __stdcall +#define MY_FAST_CALL MY_NO_INLINE __fastcall + +#else + +#define MY_CDECL +#define MY_STD_CALL +#define MY_FAST_CALL + +#endif + + +/* The following interfaces use first parameter as pointer to structure */ + +typedef struct +{ + SRes (*Read)(void *p, void *buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) < input(*size)) is allowed */ +} ISeqInStream; + +/* it can return SZ_ERROR_INPUT_EOF */ +SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); +SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); +SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); + +typedef struct +{ + size_t (*Write)(void *p, const void *buf, size_t size); + /* Returns: result - the number of actually written bytes. + (result < size) means error */ +} ISeqOutStream; + +typedef enum +{ + SZ_SEEK_SET = 0, + SZ_SEEK_CUR = 1, + SZ_SEEK_END = 2 +} ESzSeek; + +typedef struct +{ + SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ + SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); +} ISeekInStream; + +typedef struct +{ + SRes (*Look)(void *p, void **buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) > input(*size)) is not allowed + (output(*size) < input(*size)) is allowed */ + SRes (*Skip)(void *p, size_t offset); + /* offset must be <= output(*size) of Look */ + + SRes (*Read)(void *p, void *buf, size_t *size); + /* reads directly (without buffer). It's same as ISeqInStream::Read */ + SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); +} ILookInStream; + +SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); +SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); + +/* reads via ILookInStream::Read */ +SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); +SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); + +#define LookToRead_BUF_SIZE (1 << 14) + +typedef struct +{ + ILookInStream s; + ISeekInStream *realStream; + size_t pos; + size_t size; + Byte buf[LookToRead_BUF_SIZE]; +} CLookToRead; + +void LookToRead_CreateVTable(CLookToRead *p, int lookahead); +void LookToRead_Init(CLookToRead *p); + +typedef struct +{ + ISeqInStream s; + ILookInStream *realStream; +} CSecToLook; + +void SecToLook_CreateVTable(CSecToLook *p); + +typedef struct +{ + ISeqInStream s; + ILookInStream *realStream; +} CSecToRead; + +void SecToRead_CreateVTable(CSecToRead *p); + +typedef struct +{ + SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); + /* Returns: result. (result != SZ_OK) means break. + Value (UInt64)(Int64)-1 for size means unknown value. */ +} ICompressProgress; + +typedef struct +{ + void *(*Alloc)(void *p, size_t size); + void (*Free)(void *p, void *address); /* address can be 0 */ +} ISzAlloc; + +#define IAlloc_Alloc(p, size) (p)->Alloc((p), size) +#define IAlloc_Free(p, a) (p)->Free((p), a) + +#endif diff --git a/host_util/lzma/Common/CRC.cpp b/host_util/lzma/Common/CRC.cpp new file mode 100644 index 0000000..6ed9427 --- /dev/null +++ b/host_util/lzma/Common/CRC.cpp @@ -0,0 +1,10 @@ +// Common/CRC.cpp + +#include "StdAfx.h" + +extern "C" +{ +#include "../C/7zCrc.h" +} + +struct CCRCTableInit { CCRCTableInit() { CrcGenerateTable(); } } g_CRCTableInit; diff --git a/host_util/lzma/Common/C_FileIO.cpp b/host_util/lzma/Common/C_FileIO.cpp new file mode 100644 index 0000000..b4893d6 --- /dev/null +++ b/host_util/lzma/Common/C_FileIO.cpp @@ -0,0 +1,88 @@ +// Common/C_FileIO.h + +#include "C_FileIO.h" + +#include +#include + +namespace NC { +namespace NFile { +namespace NIO { + +bool CFileBase::OpenBinary(const char *name, int flags) +{ + #ifdef O_BINARY + flags |= O_BINARY; + #endif + Close(); + _handle = ::open(name, flags, 0666); + return _handle != -1; +} + +bool CFileBase::Close() +{ + if (_handle == -1) + return true; + if (close(_handle) != 0) + return false; + _handle = -1; + return true; +} + +bool CFileBase::GetLength(UInt64 &length) const +{ + off_t curPos = Seek(0, SEEK_CUR); + off_t lengthTemp = Seek(0, SEEK_END); + Seek(curPos, SEEK_SET); + length = (UInt64)lengthTemp; + return true; +} + +off_t CFileBase::Seek(off_t distanceToMove, int moveMethod) const +{ + return ::lseek(_handle, distanceToMove, moveMethod); +} + +///////////////////////// +// CInFile + +bool CInFile::Open(const char *name) +{ + return CFileBase::OpenBinary(name, O_RDONLY); +} + +bool CInFile::OpenShared(const char *name, bool) +{ + return Open(name); +} + +ssize_t CInFile::Read(void *data, size_t size) +{ + return read(_handle, data, size); +} + +///////////////////////// +// COutFile + +bool COutFile::Create(const char *name, bool createAlways) +{ + if (createAlways) + { + Close(); + _handle = ::creat(name, 0666); + return _handle != -1; + } + return OpenBinary(name, O_CREAT | O_EXCL | O_WRONLY); +} + +bool COutFile::Open(const char *name, DWORD creationDisposition) +{ + return Create(name, false); +} + +ssize_t COutFile::Write(const void *data, size_t size) +{ + return write(_handle, data, size); +} + +}}} diff --git a/host_util/lzma/Common/C_FileIO.h b/host_util/lzma/Common/C_FileIO.h new file mode 100644 index 0000000..032ac91 --- /dev/null +++ b/host_util/lzma/Common/C_FileIO.h @@ -0,0 +1,48 @@ +// Common/C_FileIO.h + +#ifndef __COMMON_C_FILEIO_H +#define __COMMON_C_FILEIO_H + +#include +#include + +#include "Types.h" +#include "MyWindows.h" + +namespace NC { +namespace NFile { +namespace NIO { + +class CFileBase +{ +protected: + int _handle; + bool OpenBinary(const char *name, int flags); +public: + CFileBase(): _handle(-1) {}; + ~CFileBase() { Close(); } + bool Close(); + bool GetLength(UInt64 &length) const; + off_t Seek(off_t distanceToMove, int moveMethod) const; + int GetHandle() const { return _handle; } +}; + +class CInFile: public CFileBase +{ +public: + bool Open(const char *name); + bool OpenShared(const char *name, bool shareForWrite); + ssize_t Read(void *data, size_t size); +}; + +class COutFile: public CFileBase +{ +public: + bool Create(const char *name, bool createAlways); + bool Open(const char *name, DWORD creationDisposition); + ssize_t Write(const void *data, size_t size); +}; + +}}} + +#endif diff --git a/host_util/lzma/Common/Defs.h b/host_util/lzma/Common/Defs.h new file mode 100644 index 0000000..dad3ae8 --- /dev/null +++ b/host_util/lzma/Common/Defs.h @@ -0,0 +1,20 @@ +// Common/Defs.h + +#ifndef __COMMON_DEFS_H +#define __COMMON_DEFS_H + +template inline T MyMin(T a, T b) + { return a < b ? a : b; } +template inline T MyMax(T a, T b) + { return a > b ? a : b; } + +template inline int MyCompare(T a, T b) + { return a < b ? -1 : (a == b ? 0 : 1); } + +inline int BoolToInt(bool value) + { return (value ? 1: 0); } + +inline bool IntToBool(int value) + { return (value != 0); } + +#endif diff --git a/host_util/lzma/Common/MyCom.h b/host_util/lzma/Common/MyCom.h new file mode 100644 index 0000000..2f00c25 --- /dev/null +++ b/host_util/lzma/Common/MyCom.h @@ -0,0 +1,225 @@ +// MyCom.h + +#ifndef __MYCOM_H +#define __MYCOM_H + +#include "MyWindows.h" + +#ifndef RINOK +#define RINOK(x) { HRESULT __result_ = (x); if (__result_ != S_OK) return __result_; } +#endif + +template +class CMyComPtr +{ + T* _p; +public: + // typedef T _PtrClass; + CMyComPtr() { _p = NULL;} + CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); } + CMyComPtr(const CMyComPtr& lp) + { + if ((_p = lp._p) != NULL) + _p->AddRef(); + } + ~CMyComPtr() { if (_p) _p->Release(); } + void Release() { if (_p) { _p->Release(); _p = NULL; } } + operator T*() const { return (T*)_p; } + // T& operator*() const { return *_p; } + T** operator&() { return &_p; } + T* operator->() const { return _p; } + T* operator=(T* p) + { + if (p != 0) + p->AddRef(); + if (_p) + _p->Release(); + _p = p; + return p; + } + T* operator=(const CMyComPtr& lp) { return (*this = lp._p); } + bool operator!() const { return (_p == NULL); } + // bool operator==(T* pT) const { return _p == pT; } + // Compare two objects for equivalence + void Attach(T* p2) + { + Release(); + _p = p2; + } + T* Detach() + { + T* pt = _p; + _p = NULL; + return pt; + } + #ifdef _WIN32 + HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) + { + return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p); + } + #endif + /* + HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) + { + CLSID clsid; + HRESULT hr = CLSIDFromProgID(szProgID, &clsid); + ATLASSERT(_p == NULL); + if (SUCCEEDED(hr)) + hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p); + return hr; + } + */ + template + HRESULT QueryInterface(REFGUID iid, Q** pp) const + { + return _p->QueryInterface(iid, (void**)pp); + } +}; + +////////////////////////////////////////////////////////// + +inline HRESULT StringToBstr(LPCOLESTR src, BSTR *bstr) +{ + *bstr = ::SysAllocString(src); + return (*bstr != 0) ? S_OK : E_OUTOFMEMORY; +} + +class CMyComBSTR +{ +public: + BSTR m_str; + CMyComBSTR(): m_str(NULL) {} + CMyComBSTR(LPCOLESTR src) { m_str = ::SysAllocString(src); } + // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); } + // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize); } + CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); } + /* + CMyComBSTR(REFGUID src) + { + LPOLESTR szGuid; + StringFromCLSID(src, &szGuid); + m_str = ::SysAllocString(szGuid); + CoTaskMemFree(szGuid); + } + */ + ~CMyComBSTR() { ::SysFreeString(m_str); } + CMyComBSTR& operator=(const CMyComBSTR& src) + { + if (m_str != src.m_str) + { + if (m_str) + ::SysFreeString(m_str); + m_str = src.MyCopy(); + } + return *this; + } + CMyComBSTR& operator=(LPCOLESTR src) + { + ::SysFreeString(m_str); + m_str = ::SysAllocString(src); + return *this; + } + unsigned int Length() const { return ::SysStringLen(m_str); } + operator BSTR() const { return m_str; } + BSTR* operator&() { return &m_str; } + BSTR MyCopy() const + { + int byteLen = ::SysStringByteLen(m_str); + BSTR res = ::SysAllocStringByteLen(NULL, byteLen); + memcpy(res, m_str, byteLen); + return res; + } + /* + void Attach(BSTR src) { m_str = src; } + BSTR Detach() + { + BSTR s = m_str; + m_str = NULL; + return s; + } + */ + void Empty() + { + ::SysFreeString(m_str); + m_str = NULL; + } + bool operator!() const { return (m_str == NULL); } +}; + +////////////////////////////////////////////////////////// + +class CMyUnknownImp +{ +public: + ULONG __m_RefCount; + CMyUnknownImp(): __m_RefCount(0) {} +}; + +#define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \ + (REFGUID iid, void **outObject) { + +#define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \ + { *outObject = (void *)(i *)this; AddRef(); return S_OK; } + +#define MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) if (iid == IID_IUnknown) \ + { *outObject = (void *)(IUnknown *)(i *)this; AddRef(); return S_OK; } + +#define MY_QUERYINTERFACE_BEGIN2(i) MY_QUERYINTERFACE_BEGIN \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) \ + MY_QUERYINTERFACE_ENTRY(i) + +#define MY_QUERYINTERFACE_END return E_NOINTERFACE; } + +#define MY_ADDREF_RELEASE \ +STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \ +STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0) \ + return __m_RefCount; delete this; return 0; } + +#define MY_UNKNOWN_IMP_SPEC(i) \ + MY_QUERYINTERFACE_BEGIN \ + i \ + MY_QUERYINTERFACE_END \ + MY_ADDREF_RELEASE + + +#define MY_UNKNOWN_IMP MY_QUERYINTERFACE_BEGIN \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(IUnknown) \ + MY_QUERYINTERFACE_END \ + MY_ADDREF_RELEASE + +#define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) \ + MY_QUERYINTERFACE_ENTRY(i) \ + ) + +#define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + ) + +#define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + MY_QUERYINTERFACE_ENTRY(i3) \ + ) + +#define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + MY_QUERYINTERFACE_ENTRY(i3) \ + MY_QUERYINTERFACE_ENTRY(i4) \ + ) + +#define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + MY_QUERYINTERFACE_ENTRY(i3) \ + MY_QUERYINTERFACE_ENTRY(i4) \ + MY_QUERYINTERFACE_ENTRY(i5) \ + ) + +#endif diff --git a/host_util/lzma/Common/MyException.h b/host_util/lzma/Common/MyException.h new file mode 100644 index 0000000..f0ad111 --- /dev/null +++ b/host_util/lzma/Common/MyException.h @@ -0,0 +1,14 @@ +// Common/Exception.h + +#ifndef __COMMON_EXCEPTION_H +#define __COMMON_EXCEPTION_H + +#include "MyWindows.h" + +struct CSystemException +{ + HRESULT ErrorCode; + CSystemException(HRESULT errorCode): ErrorCode(errorCode) {} +}; + +#endif diff --git a/host_util/lzma/Common/MyGuidDef.h b/host_util/lzma/Common/MyGuidDef.h new file mode 100644 index 0000000..7cfaba0 --- /dev/null +++ b/host_util/lzma/Common/MyGuidDef.h @@ -0,0 +1,54 @@ +// Common/MyGuidDef.h + +#ifndef GUID_DEFINED +#define GUID_DEFINED + +#include "Types.h" + +typedef struct { + UInt32 Data1; + UInt16 Data2; + UInt16 Data3; + unsigned char Data4[8]; +} GUID; + +#ifdef __cplusplus +#define REFGUID const GUID & +#else +#define REFGUID const GUID * +#endif + +#define REFCLSID REFGUID +#define REFIID REFGUID + +#ifdef __cplusplus +inline int operator==(REFGUID g1, REFGUID g2) +{ + for (int i = 0; i < (int)sizeof(g1); i++) + if (((unsigned char *)&g1)[i] != ((unsigned char *)&g2)[i]) + return 0; + return 1; +} +inline int operator!=(REFGUID g1, REFGUID g2) { return !(g1 == g2); } +#endif + +#ifdef __cplusplus + #define MY_EXTERN_C extern "C" +#else + #define MY_EXTERN_C extern +#endif + +#endif // GUID_DEFINED + + +#ifdef DEFINE_GUID +#undef DEFINE_GUID +#endif + +#ifdef INITGUID + #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + MY_EXTERN_C const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } +#else + #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + MY_EXTERN_C const GUID name +#endif diff --git a/host_util/lzma/Common/MyInitGuid.h b/host_util/lzma/Common/MyInitGuid.h new file mode 100644 index 0000000..4fc1556 --- /dev/null +++ b/host_util/lzma/Common/MyInitGuid.h @@ -0,0 +1,15 @@ +// Common/MyInitGuid.h + +#ifndef __COMMON_MYINITGUID_H +#define __COMMON_MYINITGUID_H + +#ifdef _WIN32 +#include +#else +#define INITGUID +#include "MyGuidDef.h" +DEFINE_GUID(IID_IUnknown, +0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); +#endif + +#endif diff --git a/host_util/lzma/Common/MyString.cpp b/host_util/lzma/Common/MyString.cpp new file mode 100644 index 0000000..2c02e82 --- /dev/null +++ b/host_util/lzma/Common/MyString.cpp @@ -0,0 +1,200 @@ +// Common/MyString.cpp + +#include "StdAfx.h" + +#ifndef _WIN32 +#include +#endif + +#ifndef _UNICODE +#include "StringConvert.h" +#endif + +#include "MyString.h" + + +#ifdef _WIN32 + +#ifndef _UNICODE + +wchar_t MyCharUpper(wchar_t c) +{ + if (c == 0) + return 0; + wchar_t *res = CharUpperW((LPWSTR)(UINT_PTR)(unsigned int)c); + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return (wchar_t)(unsigned int)(UINT_PTR)res; + const int kBufferSize = 4; + char s[kBufferSize + 1]; + int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufferSize, 0, 0); + if (numChars == 0 || numChars > kBufferSize) + return c; + s[numChars] = 0; + ::CharUpperA(s); + ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1); + return c; +} + +wchar_t MyCharLower(wchar_t c) +{ + if (c == 0) + return 0; + wchar_t *res = CharLowerW((LPWSTR)(UINT_PTR)(unsigned int)c); + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return (wchar_t)(unsigned int)(UINT_PTR)res; + const int kBufferSize = 4; + char s[kBufferSize + 1]; + int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufferSize, 0, 0); + if (numChars == 0 || numChars > kBufferSize) + return c; + s[numChars] = 0; + ::CharLowerA(s); + ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1); + return c; +} + +wchar_t * MyStringUpper(wchar_t *s) +{ + if (s == 0) + return 0; + wchar_t *res = CharUpperW(s); + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return res; + AString a = UnicodeStringToMultiByte(s); + a.MakeUpper(); + return MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a)); +} + +wchar_t * MyStringLower(wchar_t *s) +{ + if (s == 0) + return 0; + wchar_t *res = CharLowerW(s); + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return res; + AString a = UnicodeStringToMultiByte(s); + a.MakeLower(); + return MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a)); +} + +#endif + +/* +inline int ConvertCompareResult(int r) { return r - 2; } + +int MyStringCollate(const wchar_t *s1, const wchar_t *s2) +{ + int res = CompareStringW( + LOCALE_USER_DEFAULT, SORT_STRINGSORT, s1, -1, s2, -1); + #ifdef _UNICODE + return ConvertCompareResult(res); + #else + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return ConvertCompareResult(res); + return MyStringCollate(UnicodeStringToMultiByte(s1), + UnicodeStringToMultiByte(s2)); + #endif +} + +#ifndef _WIN32_WCE +int MyStringCollate(const char *s1, const char *s2) +{ + return ConvertCompareResult(CompareStringA( + LOCALE_USER_DEFAULT, SORT_STRINGSORT, s1, -1, s2, -1)); +} + +int MyStringCollateNoCase(const char *s1, const char *s2) +{ + return ConvertCompareResult(CompareStringA( + LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, s1, -1, s2, -1)); +} +#endif + +int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2) +{ + int res = CompareStringW( + LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, s1, -1, s2, -1); + #ifdef _UNICODE + return ConvertCompareResult(res); + #else + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return ConvertCompareResult(res); + return MyStringCollateNoCase(UnicodeStringToMultiByte(s1), + UnicodeStringToMultiByte(s2)); + #endif +} +*/ + +#else + +wchar_t MyCharUpper(wchar_t c) +{ + return toupper(c); +} + +/* +int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2) +{ + for (;;) + { + wchar_t c1 = *s1++; + wchar_t c2 = *s2++; + wchar_t u1 = MyCharUpper(c1); + wchar_t u2 = MyCharUpper(c2); + + if (u1 < u2) return -1; + if (u1 > u2) return 1; + if (u1 == 0) return 0; + } +} +*/ + +#endif + +int MyStringCompare(const char *s1, const char *s2) +{ + for (;;) + { + unsigned char c1 = (unsigned char)*s1++; + unsigned char c2 = (unsigned char)*s2++; + if (c1 < c2) return -1; + if (c1 > c2) return 1; + if (c1 == 0) return 0; + } +} + +int MyStringCompare(const wchar_t *s1, const wchar_t *s2) +{ + for (;;) + { + wchar_t c1 = *s1++; + wchar_t c2 = *s2++; + if (c1 < c2) return -1; + if (c1 > c2) return 1; + if (c1 == 0) return 0; + } +} + +int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2) +{ + for (;;) + { + wchar_t c1 = *s1++; + wchar_t c2 = *s2++; + if (c1 != c2) + { + wchar_t u1 = MyCharUpper(c1); + wchar_t u2 = MyCharUpper(c2); + if (u1 < u2) return -1; + if (u1 > u2) return 1; + } + if (c1 == 0) return 0; + } +} + +/* +int MyStringCompareNoCase(const char *s1, const char *s2) +{ + return MyStringCompareNoCase(MultiByteToUnicodeString(s1), MultiByteToUnicodeString(s2)); +} +*/ diff --git a/host_util/lzma/Common/MyString.h b/host_util/lzma/Common/MyString.h new file mode 100644 index 0000000..bae239d --- /dev/null +++ b/host_util/lzma/Common/MyString.h @@ -0,0 +1,628 @@ +// Common/String.h + +#ifndef __COMMON_STRING_H +#define __COMMON_STRING_H + +#include +// #include + +#include "MyVector.h" + +#ifdef _WIN32 +#include "MyWindows.h" +#endif + +template +inline int MyStringLen(const T *s) +{ + int i; + for (i = 0; s[i] != '\0'; i++); + return i; +} + +template +inline T * MyStringCopy(T *dest, const T *src) +{ + T *destStart = dest; + while ((*dest++ = *src++) != 0); + return destStart; +} + +inline wchar_t* MyStringGetNextCharPointer(wchar_t *p) + { return (p + 1); } +inline const wchar_t* MyStringGetNextCharPointer(const wchar_t *p) + { return (p + 1); } +inline wchar_t* MyStringGetPrevCharPointer(const wchar_t *, wchar_t *p) + { return (p - 1); } +inline const wchar_t* MyStringGetPrevCharPointer(const wchar_t *, const wchar_t *p) + { return (p - 1); } + +#ifdef _WIN32 + +inline char* MyStringGetNextCharPointer(char *p) + { return CharNextA(p); } +inline const char* MyStringGetNextCharPointer(const char *p) + { return CharNextA(p); } + +inline char* MyStringGetPrevCharPointer(char *base, char *p) + { return CharPrevA(base, p); } +inline const char* MyStringGetPrevCharPointer(const char *base, const char *p) + { return CharPrevA(base, p); } + +inline char MyCharUpper(char c) + { return (char)(unsigned int)(UINT_PTR)CharUpperA((LPSTR)(UINT_PTR)(unsigned int)(unsigned char)c); } +#ifdef _UNICODE +inline wchar_t MyCharUpper(wchar_t c) + { return (wchar_t)(unsigned int)(UINT_PTR)CharUpperW((LPWSTR)(UINT_PTR)(unsigned int)c); } +#else +wchar_t MyCharUpper(wchar_t c); +#endif + +inline char MyCharLower(char c) + { return (char)(unsigned int)(UINT_PTR)CharLowerA((LPSTR)(UINT_PTR)(unsigned int)(unsigned char)c); } +#ifdef _UNICODE +inline wchar_t MyCharLower(wchar_t c) + { return (wchar_t)(unsigned int)(UINT_PTR)CharLowerW((LPWSTR)(UINT_PTR)(unsigned int)c); } +#else +wchar_t MyCharLower(wchar_t c); +#endif + +inline char * MyStringUpper(char *s) { return CharUpperA(s); } +#ifdef _UNICODE +inline wchar_t * MyStringUpper(wchar_t *s) { return CharUpperW(s); } +#else +wchar_t * MyStringUpper(wchar_t *s); +#endif + +inline char * MyStringLower(char *s) { return CharLowerA(s); } +#ifdef _UNICODE +inline wchar_t * MyStringLower(wchar_t *s) { return CharLowerW(s); } +#else +wchar_t * MyStringLower(wchar_t *s); +#endif + +#else // Standard-C +wchar_t MyCharUpper(wchar_t c); +#endif + +////////////////////////////////////// +// Compare + +/* +#ifndef _WIN32_WCE +int MyStringCollate(const char *s1, const char *s2); +int MyStringCollateNoCase(const char *s1, const char *s2); +#endif +int MyStringCollate(const wchar_t *s1, const wchar_t *s2); +int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2); +*/ + +int MyStringCompare(const char *s1, const char *s2); +int MyStringCompare(const wchar_t *s1, const wchar_t *s2); + +// int MyStringCompareNoCase(const char *s1, const char *s2); +int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2); + +template +class CStringBase +{ + void TrimLeftWithCharSet(const CStringBase &charSet) + { + const T *p = _chars; + while (charSet.Find(*p) >= 0 && (*p != 0)) + p = GetNextCharPointer(p); + Delete(0, (int)(p - _chars)); + } + void TrimRightWithCharSet(const CStringBase &charSet) + { + const T *p = _chars; + const T *pLast = NULL; + while (*p != 0) + { + if (charSet.Find(*p) >= 0) + { + if (pLast == NULL) + pLast = p; + } + else + pLast = NULL; + p = GetNextCharPointer(p); + } + if (pLast != NULL) + { + int i = (int)(pLast - _chars); + Delete(i, _length - i); + } + + } + void MoveItems(int destIndex, int srcIndex) + { + memmove(_chars + destIndex, _chars + srcIndex, + sizeof(T) * (_length - srcIndex + 1)); + } + + void InsertSpace(int &index, int size) + { + CorrectIndex(index); + GrowLength(size); + MoveItems(index + size, index); + } + + static T *GetNextCharPointer(T *p) + { return MyStringGetNextCharPointer(p); } + static const T *GetNextCharPointer(const T *p) + { return MyStringGetNextCharPointer(p); } + static T *GetPrevCharPointer(T *base, T *p) + { return MyStringGetPrevCharPointer(base, p); } + static const T *GetPrevCharPointer(const T *base, const T *p) + { return MyStringGetPrevCharPointer(base, p); } +protected: + T *_chars; + int _length; + int _capacity; + + void SetCapacity(int newCapacity) + { + int realCapacity = newCapacity + 1; + if (realCapacity == _capacity) + return; + /* + const int kMaxStringSize = 0x20000000; + #ifndef _WIN32_WCE + if (newCapacity > kMaxStringSize || newCapacity < _length) + throw 1052337; + #endif + */ + T *newBuffer = new T[realCapacity]; + if (_capacity > 0) + { + for (int i = 0; i < _length; i++) + newBuffer[i] = _chars[i]; + delete []_chars; + } + _chars = newBuffer; + _chars[_length] = 0; + _capacity = realCapacity; + } + + void GrowLength(int n) + { + int freeSize = _capacity - _length - 1; + if (n <= freeSize) + return; + int delta; + if (_capacity > 64) + delta = _capacity / 2; + else if (_capacity > 8) + delta = 16; + else + delta = 4; + if (freeSize + delta < n) + delta = n - freeSize; + SetCapacity(_capacity + delta); + } + + void CorrectIndex(int &index) const + { + if (index > _length) + index = _length; + } + +public: + CStringBase(): _chars(0), _length(0), _capacity(0) { SetCapacity(3); } + CStringBase(T c): _chars(0), _length(0), _capacity(0) + { + SetCapacity(1); + _chars[0] = c; + _chars[1] = 0; + _length = 1; + } + CStringBase(const T *chars): _chars(0), _length(0), _capacity(0) + { + int length = MyStringLen(chars); + SetCapacity(length); + MyStringCopy(_chars, chars); // can be optimized by memove() + _length = length; + } + CStringBase(const CStringBase &s): _chars(0), _length(0), _capacity(0) + { + SetCapacity(s._length); + MyStringCopy(_chars, s._chars); + _length = s._length; + } + ~CStringBase() { delete []_chars; } + + operator const T*() const { return _chars;} + + // The minimum size of the character buffer in characters. + // This value does not include space for a null terminator. + T* GetBuffer(int minBufLength) + { + if (minBufLength >= _capacity) + SetCapacity(minBufLength); + return _chars; + } + void ReleaseBuffer() { ReleaseBuffer(MyStringLen(_chars)); } + void ReleaseBuffer(int newLength) + { + /* + #ifndef _WIN32_WCE + if (newLength >= _capacity) + throw 282217; + #endif + */ + _chars[newLength] = 0; + _length = newLength; + } + + CStringBase& operator=(T c) + { + Empty(); + SetCapacity(1); + _chars[0] = c; + _chars[1] = 0; + _length = 1; + return *this; + } + CStringBase& operator=(const T *chars) + { + Empty(); + int length = MyStringLen(chars); + SetCapacity(length); + MyStringCopy(_chars, chars); + _length = length; + return *this; + } + CStringBase& operator=(const CStringBase& s) + { + if (&s == this) + return *this; + Empty(); + SetCapacity(s._length); + MyStringCopy(_chars, s._chars); + _length = s._length; + return *this; + } + + CStringBase& operator+=(T c) + { + GrowLength(1); + _chars[_length] = c; + _chars[++_length] = 0; + return *this; + } + CStringBase& operator+=(const T *s) + { + int len = MyStringLen(s); + GrowLength(len); + MyStringCopy(_chars + _length, s); + _length += len; + return *this; + } + CStringBase& operator+=(const CStringBase &s) + { + GrowLength(s._length); + MyStringCopy(_chars + _length, s._chars); + _length += s._length; + return *this; + } + void Empty() + { + _length = 0; + _chars[0] = 0; + } + int Length() const { return _length; } + bool IsEmpty() const { return (_length == 0); } + + CStringBase Mid(int startIndex) const + { return Mid(startIndex, _length - startIndex); } + CStringBase Mid(int startIndex, int count ) const + { + if (startIndex + count > _length) + count = _length - startIndex; + + if (startIndex == 0 && startIndex + count == _length) + return *this; + + CStringBase result; + result.SetCapacity(count); + // MyStringNCopy(result._chars, _chars + startIndex, count); + for (int i = 0; i < count; i++) + result._chars[i] = _chars[startIndex + i]; + result._chars[count] = 0; + result._length = count; + return result; + } + CStringBase Left(int count) const + { return Mid(0, count); } + CStringBase Right(int count) const + { + if (count > _length) + count = _length; + return Mid(_length - count, count); + } + + void MakeUpper() + { MyStringUpper(_chars); } + void MakeLower() + { MyStringLower(_chars); } + + int Compare(const CStringBase& s) const + { return MyStringCompare(_chars, s._chars); } + + int Compare(const T *s) const + { return MyStringCompare(_chars, s); } + + int CompareNoCase(const CStringBase& s) const + { return MyStringCompareNoCase(_chars, s._chars); } + + int CompareNoCase(const T *s) const + { return MyStringCompareNoCase(_chars, s); } + + /* + int Collate(const CStringBase& s) const + { return MyStringCollate(_chars, s._chars); } + int CollateNoCase(const CStringBase& s) const + { return MyStringCollateNoCase(_chars, s._chars); } + */ + + int Find(T c) const { return Find(c, 0); } + int Find(T c, int startIndex) const + { + T *p = _chars + startIndex; + for (;;) + { + if (*p == c) + return (int)(p - _chars); + if (*p == 0) + return -1; + p = GetNextCharPointer(p); + } + } + int Find(const CStringBase &s) const { return Find(s, 0); } + int Find(const CStringBase &s, int startIndex) const + { + if (s.IsEmpty()) + return startIndex; + for (; startIndex < _length; startIndex++) + { + int j; + for (j = 0; j < s._length && startIndex + j < _length; j++) + if (_chars[startIndex+j] != s._chars[j]) + break; + if (j == s._length) + return startIndex; + } + return -1; + } + int ReverseFind(T c) const + { + if (_length == 0) + return -1; + T *p = _chars + _length - 1; + for (;;) + { + if (*p == c) + return (int)(p - _chars); + if (p == _chars) + return -1; + p = GetPrevCharPointer(_chars, p); + } + } + int FindOneOf(const CStringBase &s) const + { + for (int i = 0; i < _length; i++) + if (s.Find(_chars[i]) >= 0) + return i; + return -1; + } + + void TrimLeft(T c) + { + const T *p = _chars; + while (c == *p) + p = GetNextCharPointer(p); + Delete(0, p - _chars); + } + private: + CStringBase GetTrimDefaultCharSet() + { + CStringBase charSet; + charSet += (T)' '; + charSet += (T)'\n'; + charSet += (T)'\t'; + return charSet; + } + public: + + void TrimLeft() + { + TrimLeftWithCharSet(GetTrimDefaultCharSet()); + } + void TrimRight() + { + TrimRightWithCharSet(GetTrimDefaultCharSet()); + } + void TrimRight(T c) + { + const T *p = _chars; + const T *pLast = NULL; + while (*p != 0) + { + if (*p == c) + { + if (pLast == NULL) + pLast = p; + } + else + pLast = NULL; + p = GetNextCharPointer(p); + } + if (pLast != NULL) + { + int i = pLast - _chars; + Delete(i, _length - i); + } + } + void Trim() + { + TrimRight(); + TrimLeft(); + } + + int Insert(int index, T c) + { + InsertSpace(index, 1); + _chars[index] = c; + _length++; + return _length; + } + int Insert(int index, const CStringBase &s) + { + CorrectIndex(index); + if (s.IsEmpty()) + return _length; + int numInsertChars = s.Length(); + InsertSpace(index, numInsertChars); + for (int i = 0; i < numInsertChars; i++) + _chars[index + i] = s[i]; + _length += numInsertChars; + return _length; + } + + // !!!!!!!!!!!!!!! test it if newChar = '\0' + int Replace(T oldChar, T newChar) + { + if (oldChar == newChar) + return 0; + int number = 0; + int pos = 0; + while (pos < Length()) + { + pos = Find(oldChar, pos); + if (pos < 0) + break; + _chars[pos] = newChar; + pos++; + number++; + } + return number; + } + int Replace(const CStringBase &oldString, const CStringBase &newString) + { + if (oldString.IsEmpty()) + return 0; + if (oldString == newString) + return 0; + int oldStringLength = oldString.Length(); + int newStringLength = newString.Length(); + int number = 0; + int pos = 0; + while (pos < _length) + { + pos = Find(oldString, pos); + if (pos < 0) + break; + Delete(pos, oldStringLength); + Insert(pos, newString); + pos += newStringLength; + number++; + } + return number; + } + int Delete(int index, int count = 1 ) + { + if (index + count > _length) + count = _length - index; + if (count > 0) + { + MoveItems(index, index + count); + _length -= count; + } + return _length; + } +}; + +template +CStringBase operator+(const CStringBase& s1, const CStringBase& s2) +{ + CStringBase result(s1); + result += s2; + return result; +} + +template +CStringBase operator+(const CStringBase& s, T c) +{ + CStringBase result(s); + result += c; + return result; +} + +template +CStringBase operator+(T c, const CStringBase& s) +{ + CStringBase result(c); + result += s; + return result; +} + +template +CStringBase operator+(const CStringBase& s, const T * chars) +{ + CStringBase result(s); + result += chars; + return result; +} + +template +CStringBase operator+(const T * chars, const CStringBase& s) +{ + CStringBase result(chars); + result += s; + return result; +} + +template +bool operator==(const CStringBase& s1, const CStringBase& s2) + { return (s1.Compare(s2) == 0); } + +template +bool operator<(const CStringBase& s1, const CStringBase& s2) + { return (s1.Compare(s2) < 0); } + +template +bool operator==(const T *s1, const CStringBase& s2) + { return (s2.Compare(s1) == 0); } + +template +bool operator==(const CStringBase& s1, const T *s2) + { return (s1.Compare(s2) == 0); } + +template +bool operator!=(const CStringBase& s1, const CStringBase& s2) + { return (s1.Compare(s2) != 0); } + +template +bool operator!=(const T *s1, const CStringBase& s2) + { return (s2.Compare(s1) != 0); } + +template +bool operator!=(const CStringBase& s1, const T *s2) + { return (s1.Compare(s2) != 0); } + +typedef CStringBase AString; +typedef CStringBase UString; + +typedef CObjectVector AStringVector; +typedef CObjectVector UStringVector; + +#ifdef _UNICODE + typedef UString CSysString; +#else + typedef AString CSysString; +#endif + +typedef CObjectVector CSysStringVector; + +#endif diff --git a/host_util/lzma/Common/MyUnknown.h b/host_util/lzma/Common/MyUnknown.h new file mode 100644 index 0000000..136145a --- /dev/null +++ b/host_util/lzma/Common/MyUnknown.h @@ -0,0 +1,24 @@ +// MyUnknown.h + +#ifndef __MYUNKNOWN_H +#define __MYUNKNOWN_H + +#ifdef _WIN32 + +#ifdef _WIN32_WCE +#if (_WIN32_WCE > 300) +#include +#else +#define MIDL_INTERFACE(x) struct +#endif +#else +#include +#endif + +#include + +#else +#include "MyWindows.h" +#endif + +#endif diff --git a/host_util/lzma/Common/MyVector.cpp b/host_util/lzma/Common/MyVector.cpp new file mode 100644 index 0000000..88d9993 --- /dev/null +++ b/host_util/lzma/Common/MyVector.cpp @@ -0,0 +1,87 @@ +// Common/MyVector.cpp + +#include "StdAfx.h" + +#include + +#include "MyVector.h" + +CBaseRecordVector::~CBaseRecordVector() { ClearAndFree(); } + +void CBaseRecordVector::ClearAndFree() +{ + Clear(); + delete []((unsigned char *)_items); + _capacity = 0; + _size = 0; + _items = 0; +} + +void CBaseRecordVector::Clear() { DeleteFrom(0); } +void CBaseRecordVector::DeleteBack() { Delete(_size - 1); } +void CBaseRecordVector::DeleteFrom(int index) { Delete(index, _size - index); } + +void CBaseRecordVector::ReserveOnePosition() +{ + if (_size != _capacity) + return; + int delta = 1; + if (_capacity >= 64) + delta = _capacity / 4; + else if (_capacity >= 8) + delta = 8; + Reserve(_capacity + delta); +} + +void CBaseRecordVector::Reserve(int newCapacity) +{ + // if (newCapacity <= _capacity) + if (newCapacity == _capacity) + return; + if ((unsigned)newCapacity >= ((unsigned)1 << (sizeof(unsigned) * 8 - 1))) + throw 1052353; + size_t newSize = (size_t)(unsigned)newCapacity * _itemSize; + if (newSize / _itemSize != (size_t)(unsigned)newCapacity) + throw 1052354; + unsigned char *p = NULL; + if (newSize > 0) + { + p = new unsigned char[newSize]; + if (p == 0) + throw 1052355; + int numRecordsToMove = (_size < newCapacity ? _size : newCapacity); + memcpy(p, _items, _itemSize * numRecordsToMove); + } + delete [](unsigned char *)_items; + _items = p; + _capacity = newCapacity; +} + +void CBaseRecordVector::ReserveDown() +{ + Reserve(_size); +} + +void CBaseRecordVector::MoveItems(int destIndex, int srcIndex) +{ + memmove(((unsigned char *)_items) + destIndex * _itemSize, + ((unsigned char *)_items) + srcIndex * _itemSize, + _itemSize * (_size - srcIndex)); +} + +void CBaseRecordVector::InsertOneItem(int index) +{ + ReserveOnePosition(); + MoveItems(index + 1, index); + _size++; +} + +void CBaseRecordVector::Delete(int index, int num) +{ + TestIndexAndCorrectNum(index, num); + if (num > 0) + { + MoveItems(index, index + num); + _size -= num; + } +} diff --git a/host_util/lzma/Common/MyVector.h b/host_util/lzma/Common/MyVector.h new file mode 100644 index 0000000..079e8ae --- /dev/null +++ b/host_util/lzma/Common/MyVector.h @@ -0,0 +1,250 @@ +// Common/Vector.h + +#ifndef __COMMON_VECTOR_H +#define __COMMON_VECTOR_H + +#include "Defs.h" + +class CBaseRecordVector +{ + void MoveItems(int destIndex, int srcIndex); +protected: + int _capacity; + int _size; + void *_items; + size_t _itemSize; + + void ReserveOnePosition(); + void InsertOneItem(int index); + void TestIndexAndCorrectNum(int index, int &num) const + { if (index + num > _size) num = _size - index; } +public: + CBaseRecordVector(size_t itemSize): _capacity(0), _size(0), _items(0), _itemSize(itemSize) {} + virtual ~CBaseRecordVector(); + void ClearAndFree(); + int Size() const { return _size; } + bool IsEmpty() const { return (_size == 0); } + void Reserve(int newCapacity); + void ReserveDown(); + virtual void Delete(int index, int num = 1); + void Clear(); + void DeleteFrom(int index); + void DeleteBack(); +}; + +template +class CRecordVector: public CBaseRecordVector +{ +public: + CRecordVector(): CBaseRecordVector(sizeof(T)){}; + CRecordVector(const CRecordVector &v): CBaseRecordVector(sizeof(T)) { *this = v; } + CRecordVector& operator=(const CRecordVector &v) + { + Clear(); + return (*this += v); + } + CRecordVector& operator+=(const CRecordVector &v) + { + int size = v.Size(); + Reserve(Size() + size); + for (int i = 0; i < size; i++) + Add(v[i]); + return *this; + } + int Add(T item) + { + ReserveOnePosition(); + ((T *)_items)[_size] = item; + return _size++; + } + void Insert(int index, T item) + { + InsertOneItem(index); + ((T *)_items)[index] = item; + } + // T* GetPointer() const { return (T*)_items; } + // operator const T *() const { return _items; }; + const T& operator[](int index) const { return ((T *)_items)[index]; } + T& operator[](int index) { return ((T *)_items)[index]; } + const T& Front() const { return operator[](0); } + T& Front() { return operator[](0); } + const T& Back() const { return operator[](_size - 1); } + T& Back() { return operator[](_size - 1); } + + void Swap(int i, int j) + { + T temp = operator[](i); + operator[](i) = operator[](j); + operator[](j) = temp; + } + + int FindInSorted(const T& item) const + { + int left = 0, right = Size(); + while (left != right) + { + int mid = (left + right) / 2; + const T& midValue = (*this)[mid]; + if (item == midValue) + return mid; + if (item < midValue) + right = mid; + else + left = mid + 1; + } + return -1; + } + + int AddToUniqueSorted(const T& item) + { + int left = 0, right = Size(); + while (left != right) + { + int mid = (left + right) / 2; + const T& midValue = (*this)[mid]; + if (item == midValue) + return mid; + if (item < midValue) + right = mid; + else + left = mid + 1; + } + Insert(right, item); + return right; + } + + static void SortRefDown(T* p, int k, int size, int (*compare)(const T*, const T*, void *), void *param) + { + T temp = p[k]; + for (;;) + { + int s = (k << 1); + if (s > size) + break; + if (s < size && compare(p + s + 1, p + s, param) > 0) + s++; + if (compare(&temp, p + s, param) >= 0) + break; + p[k] = p[s]; + k = s; + } + p[k] = temp; + } + + void Sort(int (*compare)(const T*, const T*, void *), void *param) + { + int size = _size; + if (size <= 1) + return; + T* p = (&Front()) - 1; + { + int i = size / 2; + do + SortRefDown(p, i, size, compare, param); + while (--i != 0); + } + do + { + T temp = p[size]; + p[size--] = p[1]; + p[1] = temp; + SortRefDown(p, 1, size, compare, param); + } + while (size > 1); + } +}; + +typedef CRecordVector CIntVector; +typedef CRecordVector CUIntVector; +typedef CRecordVector CBoolVector; +typedef CRecordVector CByteVector; +typedef CRecordVector CPointerVector; + +template +class CObjectVector: public CPointerVector +{ +public: + CObjectVector() {}; + ~CObjectVector() { Clear(); }; + CObjectVector(const CObjectVector &v) { *this = v; } + CObjectVector& operator=(const CObjectVector &v) + { + Clear(); + return (*this += v); + } + CObjectVector& operator+=(const CObjectVector &v) + { + int size = v.Size(); + Reserve(Size() + size); + for (int i = 0; i < size; i++) + Add(v[i]); + return *this; + } + const T& operator[](int index) const { return *((T *)CPointerVector::operator[](index)); } + T& operator[](int index) { return *((T *)CPointerVector::operator[](index)); } + T& Front() { return operator[](0); } + const T& Front() const { return operator[](0); } + T& Back() { return operator[](_size - 1); } + const T& Back() const { return operator[](_size - 1); } + int Add(const T& item) { return CPointerVector::Add(new T(item)); } + void Insert(int index, const T& item) { CPointerVector::Insert(index, new T(item)); } + virtual void Delete(int index, int num = 1) + { + TestIndexAndCorrectNum(index, num); + for (int i = 0; i < num; i++) + delete (T *)(((void **)_items)[index + i]); + CPointerVector::Delete(index, num); + } + int Find(const T& item) const + { + for (int i = 0; i < Size(); i++) + if (item == (*this)[i]) + return i; + return -1; + } + int FindInSorted(const T& item) const + { + int left = 0, right = Size(); + while (left != right) + { + int mid = (left + right) / 2; + const T& midValue = (*this)[mid]; + if (item == midValue) + return mid; + if (item < midValue) + right = mid; + else + left = mid + 1; + } + return -1; + } + int AddToSorted(const T& item) + { + int left = 0, right = Size(); + while (left != right) + { + int mid = (left + right) / 2; + const T& midValue = (*this)[mid]; + if (item == midValue) + { + right = mid + 1; + break; + } + if (item < midValue) + right = mid; + else + left = mid + 1; + } + Insert(right, item); + return right; + } + + void Sort(int (*compare)(void *const *, void *const *, void *), void *param) + { CPointerVector::Sort(compare, param); } + + static int CompareObjectItems(void *const *a1, void *const *a2, void * /* param */) + { return MyCompare(*(*((const T **)a1)), *(*((const T **)a2))); } + void Sort() { CPointerVector::Sort(CompareObjectItems, 0); } +}; + +#endif diff --git a/host_util/lzma/Common/MyWindows.h b/host_util/lzma/Common/MyWindows.h new file mode 100644 index 0000000..5af068e --- /dev/null +++ b/host_util/lzma/Common/MyWindows.h @@ -0,0 +1,217 @@ +// MyWindows.h + +#ifndef __MYWINDOWS_H +#define __MYWINDOWS_H + +#ifdef _WIN32 + +#include + +#define CHAR_PATH_SEPARATOR '\\' +#define WCHAR_PATH_SEPARATOR L'\\' +#define STRING_PATH_SEPARATOR "\\" +#define WSTRING_PATH_SEPARATOR L"\\" + +#else + +#define CHAR_PATH_SEPARATOR '/' +#define WCHAR_PATH_SEPARATOR L'/' +#define STRING_PATH_SEPARATOR "/" +#define WSTRING_PATH_SEPARATOR L"/" + +#include // for wchar_t +#include + +#include "MyGuidDef.h" + +typedef char CHAR; +typedef unsigned char UCHAR; + +#undef BYTE +typedef unsigned char BYTE; + +typedef short SHORT; +typedef unsigned short USHORT; + +#undef WORD +typedef unsigned short WORD; +typedef short VARIANT_BOOL; + +typedef int INT; +typedef Int32 INT32; +typedef unsigned int UINT; +typedef UInt32 UINT32; +typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit +typedef UINT32 ULONG; + +#undef DWORD +typedef UINT32 DWORD; + +typedef Int64 LONGLONG; +typedef UInt64 ULONGLONG; + +typedef struct LARGE_INTEGER { LONGLONG QuadPart; }LARGE_INTEGER; +typedef struct _ULARGE_INTEGER { ULONGLONG QuadPart;} ULARGE_INTEGER; + +typedef const CHAR *LPCSTR; +typedef CHAR TCHAR; +typedef const TCHAR *LPCTSTR; +typedef wchar_t WCHAR; +typedef WCHAR OLECHAR; +typedef const WCHAR *LPCWSTR; +typedef OLECHAR *BSTR; +typedef const OLECHAR *LPCOLESTR; +typedef OLECHAR *LPOLESTR; + +typedef struct _FILETIME +{ + DWORD dwLowDateTime; + DWORD dwHighDateTime; +}FILETIME; + +#define HRESULT LONG +#define FAILED(Status) ((HRESULT)(Status)<0) +typedef ULONG PROPID; +typedef LONG SCODE; + +#define S_OK ((HRESULT)0x00000000L) +#define S_FALSE ((HRESULT)0x00000001L) +#define E_NOTIMPL ((HRESULT)0x80004001L) +#define E_NOINTERFACE ((HRESULT)0x80004002L) +#define E_ABORT ((HRESULT)0x80004004L) +#define E_FAIL ((HRESULT)0x80004005L) +#define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L) +#define E_OUTOFMEMORY ((HRESULT)0x8007000EL) +#define E_INVALIDARG ((HRESULT)0x80070057L) + +#ifdef _MSC_VER +#define STDMETHODCALLTYPE __stdcall +#else +#define STDMETHODCALLTYPE +#endif + +#define STDMETHOD_(t, f) virtual t STDMETHODCALLTYPE f +#define STDMETHOD(f) STDMETHOD_(HRESULT, f) +#define STDMETHODIMP_(type) type STDMETHODCALLTYPE +#define STDMETHODIMP STDMETHODIMP_(HRESULT) + +#define PURE = 0 + +#define MIDL_INTERFACE(x) struct + +#ifdef __cplusplus + +#ifndef INITGUID +#define INITGUID +DEFINE_GUID(IID_IUnknown, +0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); +#endif +struct IUnknown +{ + STDMETHOD(QueryInterface) (REFIID iid, void **outObject) PURE; + STDMETHOD_(ULONG, AddRef)() PURE; + STDMETHOD_(ULONG, Release)() PURE; + #ifndef _WIN32 + virtual ~IUnknown() {} + #endif +}; + +typedef IUnknown *LPUNKNOWN; + +#endif + +#define VARIANT_TRUE ((VARIANT_BOOL)-1) +#define VARIANT_FALSE ((VARIANT_BOOL)0) + +enum VARENUM +{ + VT_EMPTY = 0, + VT_NULL = 1, + VT_I2 = 2, + VT_I4 = 3, + VT_R4 = 4, + VT_R8 = 5, + VT_CY = 6, + VT_DATE = 7, + VT_BSTR = 8, + VT_DISPATCH = 9, + VT_ERROR = 10, + VT_BOOL = 11, + VT_VARIANT = 12, + VT_UNKNOWN = 13, + VT_DECIMAL = 14, + VT_I1 = 16, + VT_UI1 = 17, + VT_UI2 = 18, + VT_UI4 = 19, + VT_I8 = 20, + VT_UI8 = 21, + VT_INT = 22, + VT_UINT = 23, + VT_VOID = 24, + VT_HRESULT = 25, + VT_FILETIME = 64 +}; + +typedef unsigned short VARTYPE; +typedef WORD PROPVAR_PAD1; +typedef WORD PROPVAR_PAD2; +typedef WORD PROPVAR_PAD3; + +#ifdef __cplusplus + +typedef struct tagPROPVARIANT +{ + VARTYPE vt; + PROPVAR_PAD1 wReserved1; + PROPVAR_PAD2 wReserved2; + PROPVAR_PAD3 wReserved3; + union + { + CHAR cVal; + UCHAR bVal; + SHORT iVal; + USHORT uiVal; + LONG lVal; + ULONG ulVal; + INT intVal; + UINT uintVal; + LARGE_INTEGER hVal; + ULARGE_INTEGER uhVal; + VARIANT_BOOL boolVal; + SCODE scode; + FILETIME filetime; + BSTR bstrVal; + }; +} PROPVARIANT; + +typedef PROPVARIANT tagVARIANT; +typedef tagVARIANT VARIANT; +typedef VARIANT VARIANTARG; + +MY_EXTERN_C HRESULT VariantClear(VARIANTARG *prop); +MY_EXTERN_C HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src); + +#endif + +MY_EXTERN_C BSTR SysAllocStringByteLen(LPCSTR psz, UINT len); +MY_EXTERN_C BSTR SysAllocString(const OLECHAR *sz); +MY_EXTERN_C void SysFreeString(BSTR bstr); +MY_EXTERN_C UINT SysStringByteLen(BSTR bstr); +MY_EXTERN_C UINT SysStringLen(BSTR bstr); + +MY_EXTERN_C DWORD GetLastError(); +MY_EXTERN_C LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2); + +#define CP_ACP 0 +#define CP_OEMCP 1 + +typedef enum tagSTREAM_SEEK +{ + STREAM_SEEK_SET = 0, + STREAM_SEEK_CUR = 1, + STREAM_SEEK_END = 2 +} STREAM_SEEK; + +#endif +#endif diff --git a/host_util/lzma/Common/NewHandler.cpp b/host_util/lzma/Common/NewHandler.cpp new file mode 100644 index 0000000..aad6e7d --- /dev/null +++ b/host_util/lzma/Common/NewHandler.cpp @@ -0,0 +1,116 @@ +// NewHandler.cpp + +#include "StdAfx.h" + +#include + +#include "NewHandler.h" + +// #define DEBUG_MEMORY_LEAK + +#ifndef DEBUG_MEMORY_LEAK + +#ifdef _WIN32 +void * +#ifdef _MSC_VER +__cdecl +#endif +operator new(size_t size) +{ + // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size); + void *p = ::malloc(size); + if (p == 0) + throw CNewException(); + return p; +} + +void +#ifdef _MSC_VER +__cdecl +#endif +operator delete(void *p) throw() +{ + /* + if (p == 0) + return; + ::HeapFree(::GetProcessHeap(), 0, p); + */ + ::free(p); +} +#endif + +#else + +#pragma init_seg(lib) +const int kDebugSize = 1000000; +static void *a[kDebugSize]; +static int index = 0; + +static int numAllocs = 0; +void * __cdecl operator new(size_t size) +{ + numAllocs++; + void *p = HeapAlloc(GetProcessHeap(), 0, size); + if (index == 40) + { + int t = 1; + } + if (index < kDebugSize) + { + a[index] = p; + index++; + } + if (p == 0) + throw CNewException(); + printf("Alloc %6d, size = %8d\n", numAllocs, size); + return p; +} + +class CC +{ +public: + CC() + { + for (int i = 0; i < kDebugSize; i++) + a[i] = 0; + } + ~CC() + { + for (int i = 0; i < kDebugSize; i++) + if (a[i] != 0) + return; + } +} g_CC; + + +void __cdecl operator delete(void *p) +{ + if (p == 0) + return; + /* + for (int i = 0; i < index; i++) + if (a[i] == p) + a[i] = 0; + */ + HeapFree(GetProcessHeap(), 0, p); + numAllocs--; + printf("Free %d\n", numAllocs); +} + +#endif + +/* +int MemErrorVC(size_t) +{ + throw CNewException(); + // return 1; +} +CNewHandlerSetter::CNewHandlerSetter() +{ + // MemErrorOldVCFunction = _set_new_handler(MemErrorVC); +} +CNewHandlerSetter::~CNewHandlerSetter() +{ + // _set_new_handler(MemErrorOldVCFunction); +} +*/ diff --git a/host_util/lzma/Common/NewHandler.h b/host_util/lzma/Common/NewHandler.h new file mode 100644 index 0000000..215ba05 --- /dev/null +++ b/host_util/lzma/Common/NewHandler.h @@ -0,0 +1,16 @@ +// Common/NewHandler.h + +#ifndef __COMMON_NEWHANDLER_H +#define __COMMON_NEWHANDLER_H + +class CNewException {}; + +#ifdef _WIN32 +void +#ifdef _MSC_VER +__cdecl +#endif +operator delete(void *p) throw(); +#endif + +#endif diff --git a/host_util/lzma/Common/StdAfx.h b/host_util/lzma/Common/StdAfx.h new file mode 100644 index 0000000..b8ba1d5 --- /dev/null +++ b/host_util/lzma/Common/StdAfx.h @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +// #include "MyWindows.h" +#include "NewHandler.h" + +#endif diff --git a/host_util/lzma/Common/StringConvert.cpp b/host_util/lzma/Common/StringConvert.cpp new file mode 100644 index 0000000..9bd47de --- /dev/null +++ b/host_util/lzma/Common/StringConvert.cpp @@ -0,0 +1,102 @@ +// Common/StringConvert.cpp + +#include "StdAfx.h" + +#include "StringConvert.h" + +#ifndef _WIN32 +#include +#endif + +#ifdef _WIN32 +UString MultiByteToUnicodeString(const AString &srcString, UINT codePage) +{ + UString resultString; + if (!srcString.IsEmpty()) + { + int numChars = MultiByteToWideChar(codePage, 0, srcString, + srcString.Length(), resultString.GetBuffer(srcString.Length()), + srcString.Length() + 1); + #ifndef _WIN32_WCE + if (numChars == 0) + throw 282228; + #endif + resultString.ReleaseBuffer(numChars); + } + return resultString; +} + +AString UnicodeStringToMultiByte(const UString &s, UINT codePage, char defaultChar, bool &defaultCharWasUsed) +{ + AString dest; + defaultCharWasUsed = false; + if (!s.IsEmpty()) + { + int numRequiredBytes = s.Length() * 2; + BOOL defUsed; + int numChars = WideCharToMultiByte(codePage, 0, s, s.Length(), + dest.GetBuffer(numRequiredBytes), numRequiredBytes + 1, + &defaultChar, &defUsed); + defaultCharWasUsed = (defUsed != FALSE); + #ifndef _WIN32_WCE + if (numChars == 0) + throw 282229; + #endif + dest.ReleaseBuffer(numChars); + } + return dest; +} + +AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) +{ + bool defaultCharWasUsed; + return UnicodeStringToMultiByte(srcString, codePage, '_', defaultCharWasUsed); +} + +#ifndef _WIN32_WCE +AString SystemStringToOemString(const CSysString &srcString) +{ + AString result; + CharToOem(srcString, result.GetBuffer(srcString.Length() * 2)); + result.ReleaseBuffer(); + return result; +} +#endif + +#else + +UString MultiByteToUnicodeString(const AString &srcString, UINT codePage) +{ + UString resultString; + for (int i = 0; i < srcString.Length(); i++) + resultString += wchar_t(srcString[i]); + /* + if (!srcString.IsEmpty()) + { + int numChars = mbstowcs(resultString.GetBuffer(srcString.Length()), srcString, srcString.Length() + 1); + if (numChars < 0) throw "Your environment does not support UNICODE"; + resultString.ReleaseBuffer(numChars); + } + */ + return resultString; +} + +AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) +{ + AString resultString; + for (int i = 0; i < srcString.Length(); i++) + resultString += char(srcString[i]); + /* + if (!srcString.IsEmpty()) + { + int numRequiredBytes = srcString.Length() * 6 + 1; + int numChars = wcstombs(resultString.GetBuffer(numRequiredBytes), srcString, numRequiredBytes); + if (numChars < 0) throw "Your environment does not support UNICODE"; + resultString.ReleaseBuffer(numChars); + } + */ + return resultString; +} + +#endif + diff --git a/host_util/lzma/Common/StringConvert.h b/host_util/lzma/Common/StringConvert.h new file mode 100644 index 0000000..0c37eb0 --- /dev/null +++ b/host_util/lzma/Common/StringConvert.h @@ -0,0 +1,73 @@ +// Common/StringConvert.h + +#ifndef __COMMON_STRINGCONVERT_H +#define __COMMON_STRINGCONVERT_H + +#include "MyWindows.h" +#include "MyString.h" +#include "Types.h" + +UString MultiByteToUnicodeString(const AString &srcString, UINT codePage = CP_ACP); +AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage, char defaultChar, bool &defaultCharWasUsed); +AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage = CP_ACP); + + +inline const wchar_t* GetUnicodeString(const wchar_t* unicodeString) + { return unicodeString; } +inline const UString& GetUnicodeString(const UString &unicodeString) + { return unicodeString; } +inline UString GetUnicodeString(const AString &ansiString) + { return MultiByteToUnicodeString(ansiString); } +inline UString GetUnicodeString(const AString &multiByteString, UINT codePage) + { return MultiByteToUnicodeString(multiByteString, codePage); } +inline const wchar_t* GetUnicodeString(const wchar_t* unicodeString, UINT) + { return unicodeString; } +inline const UString& GetUnicodeString(const UString &unicodeString, UINT) + { return unicodeString; } + +inline const char* GetAnsiString(const char* ansiString) + { return ansiString; } +inline const AString& GetAnsiString(const AString &ansiString) + { return ansiString; } +inline AString GetAnsiString(const UString &unicodeString) + { return UnicodeStringToMultiByte(unicodeString); } + +inline const char* GetOemString(const char* oemString) + { return oemString; } +inline const AString& GetOemString(const AString &oemString) + { return oemString; } +inline AString GetOemString(const UString &unicodeString) + { return UnicodeStringToMultiByte(unicodeString, CP_OEMCP); } + + +#ifdef _UNICODE + inline const wchar_t* GetSystemString(const wchar_t* unicodeString) + { return unicodeString;} + inline const UString& GetSystemString(const UString &unicodeString) + { return unicodeString;} + inline const wchar_t* GetSystemString(const wchar_t* unicodeString, UINT /* codePage */) + { return unicodeString;} + inline const UString& GetSystemString(const UString &unicodeString, UINT /* codePage */) + { return unicodeString;} + inline UString GetSystemString(const AString &multiByteString, UINT codePage) + { return MultiByteToUnicodeString(multiByteString, codePage);} + inline UString GetSystemString(const AString &multiByteString) + { return MultiByteToUnicodeString(multiByteString);} +#else + inline const char* GetSystemString(const char *ansiString) + { return ansiString; } + inline const AString& GetSystemString(const AString &multiByteString, UINT) + { return multiByteString; } + inline const char * GetSystemString(const char *multiByteString, UINT) + { return multiByteString; } + inline AString GetSystemString(const UString &unicodeString) + { return UnicodeStringToMultiByte(unicodeString); } + inline AString GetSystemString(const UString &unicodeString, UINT codePage) + { return UnicodeStringToMultiByte(unicodeString, codePage); } +#endif + +#ifndef _WIN32_WCE +AString SystemStringToOemString(const CSysString &srcString); +#endif + +#endif diff --git a/host_util/lzma/Common/StringToInt.cpp b/host_util/lzma/Common/StringToInt.cpp new file mode 100644 index 0000000..9473766 --- /dev/null +++ b/host_util/lzma/Common/StringToInt.cpp @@ -0,0 +1,90 @@ +// Common/StringToInt.cpp + +#include "StdAfx.h" + +#include "StringToInt.h" + +UInt64 ConvertStringToUInt64(const char *s, const char **end) +{ + UInt64 result = 0; + for (;;) + { + char c = *s; + if (c < '0' || c > '9') + { + if (end != NULL) + *end = s; + return result; + } + result *= 10; + result += (c - '0'); + s++; + } +} + +UInt64 ConvertOctStringToUInt64(const char *s, const char **end) +{ + UInt64 result = 0; + for (;;) + { + char c = *s; + if (c < '0' || c > '7') + { + if (end != NULL) + *end = s; + return result; + } + result <<= 3; + result += (c - '0'); + s++; + } +} + +UInt64 ConvertHexStringToUInt64(const char *s, const char **end) +{ + UInt64 result = 0; + for (;;) + { + char c = *s; + UInt32 v; + if (c >= '0' && c <= '9') v = (c - '0'); + else if (c >= 'A' && c <= 'F') v = 10 + (c - 'A'); + else if (c >= 'a' && c <= 'f') v = 10 + (c - 'a'); + else + { + if (end != NULL) + *end = s; + return result; + } + result <<= 4; + result |= v; + s++; + } +} + + +UInt64 ConvertStringToUInt64(const wchar_t *s, const wchar_t **end) +{ + UInt64 result = 0; + for (;;) + { + wchar_t c = *s; + if (c < '0' || c > '9') + { + if (end != NULL) + *end = s; + return result; + } + result *= 10; + result += (c - '0'); + s++; + } +} + + +Int64 ConvertStringToInt64(const char *s, const char **end) +{ + if (*s == '-') + return -(Int64)ConvertStringToUInt64(s + 1, end); + return ConvertStringToUInt64(s, end); +} diff --git a/host_util/lzma/Common/StringToInt.h b/host_util/lzma/Common/StringToInt.h new file mode 100644 index 0000000..c0d860e --- /dev/null +++ b/host_util/lzma/Common/StringToInt.h @@ -0,0 +1,18 @@ +// Common/StringToInt.h + +#ifndef __COMMON_STRINGTOINT_H +#define __COMMON_STRINGTOINT_H + +#include +#include "Types.h" + +UInt64 ConvertStringToUInt64(const char *s, const char **end); +UInt64 ConvertOctStringToUInt64(const char *s, const char **end); +UInt64 ConvertHexStringToUInt64(const char *s, const char **end); +UInt64 ConvertStringToUInt64(const wchar_t *s, const wchar_t **end); + +Int64 ConvertStringToInt64(const char *s, const char **end); + +#endif + + diff --git a/host_util/lzma/Common/Types.h b/host_util/lzma/Common/Types.h new file mode 100644 index 0000000..25bf5e6 --- /dev/null +++ b/host_util/lzma/Common/Types.h @@ -0,0 +1,14 @@ +// Common/Types.h + +#ifndef __COMMON_TYPES_H +#define __COMMON_TYPES_H + +extern "C" +{ +#include "../C/Types.h" +} + +typedef int HRes; + +#endif + diff --git a/host_util/lzma/Exception.h b/host_util/lzma/Exception.h new file mode 100644 index 0000000..6bae26f --- /dev/null +++ b/host_util/lzma/Exception.h @@ -0,0 +1,45 @@ +/* A couple of exceptions for lzmp. + * + * Copyright (C) 2005 Ville Koskinen + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _EXCEPTION_H_ +#define _EXCEPTION_H_ + +#include +using std::string; + +class Exception +{ +private: + string message; +public: + Exception(char *what): message(what) { } + Exception(string what): message(what) { } + + ~Exception() { } + + string what(void) { return message; } +}; + +class ArgumentException: public Exception +{ +public: + ArgumentException(char *what): Exception(what) { } + ArgumentException(string what): Exception(what) { } + + ~ArgumentException() { } +}; + +#endif + diff --git a/host_util/lzma/FileStreams.cpp b/host_util/lzma/FileStreams.cpp new file mode 100644 index 0000000..eb7ad3a --- /dev/null +++ b/host_util/lzma/FileStreams.cpp @@ -0,0 +1,261 @@ +// FileStreams.cpp + +#include "StdAfx.h" + +#ifndef _WIN32 +#include +#include +#include +#endif + +#include "FileStreams.h" + +static inline HRESULT ConvertBoolToHRESULT(bool result) +{ + #ifdef _WIN32 + if (result) + return S_OK; + DWORD lastError = ::GetLastError(); + if (lastError == 0) + return E_FAIL; + return HRESULT_FROM_WIN32(lastError); + #else + return result ? S_OK: E_FAIL; + #endif +} + +bool CInFileStream::Open(LPCTSTR fileName) +{ + return File.Open(fileName); +} + +#ifdef USE_WIN_FILE +#ifndef _UNICODE +bool CInFileStream::Open(LPCWSTR fileName) +{ + return File.Open(fileName); +} +#endif +#endif + +bool CInFileStream::OpenShared(LPCTSTR fileName, bool shareForWrite) +{ + return File.OpenShared(fileName, shareForWrite); +} + +#ifdef USE_WIN_FILE +#ifndef _UNICODE +bool CInFileStream::OpenShared(LPCWSTR fileName, bool shareForWrite) +{ + return File.OpenShared(fileName, shareForWrite); +} +#endif +#endif + +STDMETHODIMP CInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + #ifdef USE_WIN_FILE + + UInt32 realProcessedSize; + bool result = File.ReadPart(data, size, realProcessedSize); + if(processedSize != NULL) + *processedSize = realProcessedSize; + return ConvertBoolToHRESULT(result); + + #else + + if(processedSize != NULL) + *processedSize = 0; + ssize_t res = File.Read(data, (size_t)size); + if (res == -1) + return E_FAIL; + if(processedSize != NULL) + *processedSize = (UInt32)res; + return S_OK; + + #endif +} + +#ifndef _WIN32_WCE +STDMETHODIMP CStdInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + #ifdef _WIN32 + UInt32 realProcessedSize; + BOOL res = ::ReadFile(GetStdHandle(STD_INPUT_HANDLE), + data, size, (DWORD *)&realProcessedSize, NULL); + if(processedSize != NULL) + *processedSize = realProcessedSize; + if (res == FALSE && GetLastError() == ERROR_BROKEN_PIPE) + return S_OK; + return ConvertBoolToHRESULT(res != FALSE); + + #else + + if(processedSize != NULL) + *processedSize = 0; + ssize_t res; + do + { + res = read(0, data, (size_t)size); + } + while (res < 0 && (errno == EINTR)); + if (res == -1) + return E_FAIL; + if(processedSize != NULL) + *processedSize = (UInt32)res; + return S_OK; + + #endif +} + +#endif + +STDMETHODIMP CInFileStream::Seek(Int64 offset, UInt32 seekOrigin, + UInt64 *newPosition) +{ + if(seekOrigin >= 3) + return STG_E_INVALIDFUNCTION; + + #ifdef USE_WIN_FILE + + UInt64 realNewPosition; + bool result = File.Seek(offset, seekOrigin, realNewPosition); + if(newPosition != NULL) + *newPosition = realNewPosition; + return ConvertBoolToHRESULT(result); + + #else + + off_t res = File.Seek(offset, seekOrigin); + if (res == -1) + return E_FAIL; + if(newPosition != NULL) + *newPosition = (UInt64)res; + return S_OK; + + #endif +} + +STDMETHODIMP CInFileStream::GetSize(UInt64 *size) +{ + return ConvertBoolToHRESULT(File.GetLength(*size)); +} + + +////////////////////////// +// COutFileStream + +HRESULT COutFileStream::Close() +{ + return ConvertBoolToHRESULT(File.Close()); +} + +STDMETHODIMP COutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + #ifdef USE_WIN_FILE + + UInt32 realProcessedSize; + bool result = File.WritePart(data, size, realProcessedSize); + ProcessedSize += realProcessedSize; + if(processedSize != NULL) + *processedSize = realProcessedSize; + return ConvertBoolToHRESULT(result); + + #else + + if(processedSize != NULL) + *processedSize = 0; + ssize_t res = File.Write(data, (size_t)size); + if (res == -1) + return E_FAIL; + if(processedSize != NULL) + *processedSize = (UInt32)res; + ProcessedSize += res; + return S_OK; + + #endif +} + +STDMETHODIMP COutFileStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + if(seekOrigin >= 3) + return STG_E_INVALIDFUNCTION; + #ifdef USE_WIN_FILE + + UInt64 realNewPosition; + bool result = File.Seek(offset, seekOrigin, realNewPosition); + if(newPosition != NULL) + *newPosition = realNewPosition; + return ConvertBoolToHRESULT(result); + + #else + + off_t res = File.Seek(offset, seekOrigin); + if (res == -1) + return E_FAIL; + if(newPosition != NULL) + *newPosition = (UInt64)res; + return S_OK; + + #endif +} + +STDMETHODIMP COutFileStream::SetSize(Int64 newSize) +{ + #ifdef USE_WIN_FILE + UInt64 currentPos; + if(!File.Seek(0, FILE_CURRENT, currentPos)) + return E_FAIL; + bool result = File.SetLength(newSize); + UInt64 currentPos2; + result = result && File.Seek(currentPos, currentPos2); + return result ? S_OK : E_FAIL; + #else + return E_FAIL; + #endif +} + +#ifndef _WIN32_WCE +STDMETHODIMP CStdOutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if(processedSize != NULL) + *processedSize = 0; + + #ifdef _WIN32 + UInt32 realProcessedSize; + BOOL res = TRUE; + if (size > 0) + { + // Seems that Windows doesn't like big amounts writing to stdout. + // So we limit portions by 32KB. + UInt32 sizeTemp = (1 << 15); + if (sizeTemp > size) + sizeTemp = size; + res = ::WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), + data, sizeTemp, (DWORD *)&realProcessedSize, NULL); + size -= realProcessedSize; + data = (const void *)((const Byte *)data + realProcessedSize); + if(processedSize != NULL) + *processedSize += realProcessedSize; + } + return ConvertBoolToHRESULT(res != FALSE); + + #else + + ssize_t res; + do + { + res = write(1, data, (size_t)size); + } + while (res < 0 && (errno == EINTR)); + if (res == -1) + return E_FAIL; + if(processedSize != NULL) + *processedSize = (UInt32)res; + return S_OK; + + return S_OK; + #endif +} + +#endif diff --git a/host_util/lzma/FileStreams.h b/host_util/lzma/FileStreams.h new file mode 100644 index 0000000..6667c1e --- /dev/null +++ b/host_util/lzma/FileStreams.h @@ -0,0 +1,133 @@ +// FileStreams.h + +#ifndef __FILESTREAMS_H +#define __FILESTREAMS_H + +#include "Common/C_FileIO.h" + +#include "IStream.h" +#include "Common/MyCom.h" + +class CInFileStream: + public IInStream, + public IStreamGetSize, + public CMyUnknownImp +{ +public: + #ifdef USE_WIN_FILE + NWindows::NFile::NIO::CInFile File; + #else + NC::NFile::NIO::CInFile File; + #endif + CInFileStream() {} + virtual ~CInFileStream() {} + + bool Open(LPCTSTR fileName); + #ifdef USE_WIN_FILE + #ifndef _UNICODE + bool Open(LPCWSTR fileName); + #endif + #endif + + bool OpenShared(LPCTSTR fileName, bool shareForWrite); + #ifdef USE_WIN_FILE + #ifndef _UNICODE + bool OpenShared(LPCWSTR fileName, bool shareForWrite); + #endif + #endif + + MY_UNKNOWN_IMP2(IInStream, IStreamGetSize) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + + STDMETHOD(GetSize)(UInt64 *size); +}; + +#ifndef _WIN32_WCE +class CStdInFileStream: + public ISequentialInStream, + public CMyUnknownImp +{ +public: + // HANDLE File; + // CStdInFileStream() File(INVALID_HANDLE_VALUE): {} + // void Open() { File = GetStdHandle(STD_INPUT_HANDLE); }; + MY_UNKNOWN_IMP + + virtual ~CStdInFileStream() {} + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +}; +#endif + +class COutFileStream: + public IOutStream, + public CMyUnknownImp +{ +public: + #ifdef USE_WIN_FILE + NWindows::NFile::NIO::COutFile File; + #else + NC::NFile::NIO::COutFile File; + #endif +public: + virtual ~COutFileStream() {} + bool Create(LPCTSTR fileName, bool createAlways) + { + ProcessedSize = 0; + return File.Create(fileName, createAlways); + } + bool Open(LPCTSTR fileName, DWORD creationDisposition) + { + ProcessedSize = 0; + return File.Open(fileName, creationDisposition); + } + #ifdef USE_WIN_FILE + #ifndef _UNICODE + bool Create(LPCWSTR fileName, bool createAlways) + { + ProcessedSize = 0; + return File.Create(fileName, createAlways); + } + bool Open(LPCWSTR fileName, DWORD creationDisposition) + { + ProcessedSize = 0; + return File.Open(fileName, creationDisposition); + } + #endif + #endif + + HRESULT Close(); + + UInt64 ProcessedSize; + + #ifdef USE_WIN_FILE + bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime) + { + return File.SetTime(cTime, aTime, mTime); + } + bool SetMTime(const FILETIME *mTime) { return File.SetMTime(mTime); } + #endif + + + MY_UNKNOWN_IMP1(IOutStream) + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + STDMETHOD(SetSize)(Int64 newSize); +}; + +#ifndef _WIN32_WCE +class CStdOutFileStream: + public ISequentialOutStream, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP + + virtual ~CStdOutFileStream() {} + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; +#endif + +#endif diff --git a/host_util/lzma/ICoder.h b/host_util/lzma/ICoder.h new file mode 100644 index 0000000..262dfdb --- /dev/null +++ b/host_util/lzma/ICoder.h @@ -0,0 +1,186 @@ +// ICoder.h + +#ifndef __ICODER_H +#define __ICODER_H + +#include "IStream.h" + +#define CODER_INTERFACE(i, x) DECL_INTERFACE(i, 4, x) + +CODER_INTERFACE(ICompressProgressInfo, 0x04) +{ + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) PURE; +}; + +CODER_INTERFACE(ICompressCoder, 0x05) +{ + STDMETHOD(Code)(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 *inSize, + const UInt64 *outSize, + ICompressProgressInfo *progress) PURE; +}; + +CODER_INTERFACE(ICompressCoder2, 0x18) +{ + STDMETHOD(Code)(ISequentialInStream **inStreams, + const UInt64 **inSizes, + UInt32 numInStreams, + ISequentialOutStream **outStreams, + const UInt64 **outSizes, + UInt32 numOutStreams, + ICompressProgressInfo *progress) PURE; +}; + +namespace NCoderPropID +{ + enum EEnum + { + kDictionarySize = 0x400, + kUsedMemorySize, + kOrder, + kBlockSize, + kPosStateBits = 0x440, + kLitContextBits, + kLitPosBits, + kNumFastBytes = 0x450, + kMatchFinder, + kMatchFinderCycles, + kNumPasses = 0x460, + kAlgorithm = 0x470, + kMultiThread = 0x480, + kNumThreads, + kEndMarker = 0x490 + }; +} + +CODER_INTERFACE(ICompressSetCoderProperties, 0x20) +{ + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, + const PROPVARIANT *properties, UInt32 numProperties) PURE; +}; + +/* +CODER_INTERFACE(ICompressSetCoderProperties, 0x21) +{ + STDMETHOD(SetDecoderProperties)(ISequentialInStream *inStream) PURE; +}; +*/ + +CODER_INTERFACE(ICompressSetDecoderProperties2, 0x22) +{ + STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size) PURE; +}; + +CODER_INTERFACE(ICompressWriteCoderProperties, 0x23) +{ + STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStreams) PURE; +}; + +CODER_INTERFACE(ICompressGetInStreamProcessedSize, 0x24) +{ + STDMETHOD(GetInStreamProcessedSize)(UInt64 *value) PURE; +}; + +CODER_INTERFACE(ICompressSetCoderMt, 0x25) +{ + STDMETHOD(SetNumberOfThreads)(UInt32 numThreads) PURE; +}; + +CODER_INTERFACE(ICompressGetSubStreamSize, 0x30) +{ + STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value) PURE; +}; + +CODER_INTERFACE(ICompressSetInStream, 0x31) +{ + STDMETHOD(SetInStream)(ISequentialInStream *inStream) PURE; + STDMETHOD(ReleaseInStream)() PURE; +}; + +CODER_INTERFACE(ICompressSetOutStream, 0x32) +{ + STDMETHOD(SetOutStream)(ISequentialOutStream *outStream) PURE; + STDMETHOD(ReleaseOutStream)() PURE; +}; + +CODER_INTERFACE(ICompressSetInStreamSize, 0x33) +{ + STDMETHOD(SetInStreamSize)(const UInt64 *inSize) PURE; +}; + +CODER_INTERFACE(ICompressSetOutStreamSize, 0x34) +{ + STDMETHOD(SetOutStreamSize)(const UInt64 *outSize) PURE; +}; + +CODER_INTERFACE(ICompressFilter, 0x40) +{ + STDMETHOD(Init)() PURE; + STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) PURE; + // Filter return outSize (UInt32) + // if (outSize <= size): Filter have converted outSize bytes + // if (outSize > size): Filter have not converted anything. + // and it needs at least outSize bytes to convert one block + // (it's for crypto block algorithms). +}; + +CODER_INTERFACE(ICompressCodecsInfo, 0x60) +{ + STDMETHOD(GetNumberOfMethods)(UInt32 *numMethods) PURE; + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE; + STDMETHOD(CreateDecoder)(UInt32 index, const GUID *iid, void **coder) PURE; + STDMETHOD(CreateEncoder)(UInt32 index, const GUID *iid, void **coder) PURE; +}; +CODER_INTERFACE(ISetCompressCodecsInfo, 0x61) +{ + STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo) PURE; +}; + +CODER_INTERFACE(ICryptoProperties, 0x80) +{ + STDMETHOD(SetKey)(const Byte *data, UInt32 size) PURE; + STDMETHOD(SetInitVector)(const Byte *data, UInt32 size) PURE; +}; + +/* +CODER_INTERFACE(ICryptoResetSalt, 0x88) +{ + STDMETHOD(ResetSalt)() PURE; +}; +*/ + +CODER_INTERFACE(ICryptoResetInitVector, 0x8C) +{ + STDMETHOD(ResetInitVector)() PURE; +}; + +CODER_INTERFACE(ICryptoSetPassword, 0x90) +{ + STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size) PURE; +}; + +CODER_INTERFACE(ICryptoSetCRC, 0xA0) +{ + STDMETHOD(CryptoSetCRC)(UInt32 crc) PURE; +}; + +////////////////////// +// It's for DLL file +namespace NMethodPropID +{ + enum EEnum + { + kID, + kName, + kDecoder, + kEncoder, + kInStreams, + kOutStreams, + kDescription, + kDecoderIsAssigned, + kEncoderIsAssigned + }; +} + +#endif diff --git a/host_util/lzma/IDecl.h b/host_util/lzma/IDecl.h new file mode 100644 index 0000000..4c7e08d --- /dev/null +++ b/host_util/lzma/IDecl.h @@ -0,0 +1,15 @@ +// IDecl.h + +#ifndef __IDECL_H +#define __IDECL_H + +#include "Common/MyUnknown.h" + +#define DECL_INTERFACE_SUB(i, base, groupId, subId) \ +DEFINE_GUID(IID_ ## i, \ +0x23170F69, 0x40C1, 0x278A, 0, 0, 0, (groupId), 0, (subId), 0, 0); \ +struct i: public base + +#define DECL_INTERFACE(i, groupId, subId) DECL_INTERFACE_SUB(i, IUnknown, groupId, subId) + +#endif diff --git a/host_util/lzma/IStream.h b/host_util/lzma/IStream.h new file mode 100644 index 0000000..3398301 --- /dev/null +++ b/host_util/lzma/IStream.h @@ -0,0 +1,58 @@ +// IStream.h + +#ifndef __ISTREAM_H +#define __ISTREAM_H + +#include "Common/MyUnknown.h" +#include "Common/Types.h" + +#include "IDecl.h" + +#define STREAM_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 3, x) +#define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x) + +STREAM_INTERFACE(ISequentialInStream, 0x01) +{ + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE; + /* + Out: if size != 0, return_value = S_OK and (*processedSize == 0), + then there are no more bytes in stream. + if (size > 0) && there are bytes in stream, + this function must read at least 1 byte. + This function is allowed to read less than number of remaining bytes in stream. + You must call Read function in loop, if you need exact amount of data + */ +}; + +STREAM_INTERFACE(ISequentialOutStream, 0x02) +{ + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE; + /* + if (size > 0) this function must write at least 1 byte. + This function is allowed to write less than "size". + You must call Write function in loop, if you need to write exact amount of data + */ +}; + +STREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03) +{ + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE; +}; + +STREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04) +{ + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE; + STDMETHOD(SetSize)(Int64 newSize) PURE; +}; + +STREAM_INTERFACE(IStreamGetSize, 0x06) +{ + STDMETHOD(GetSize)(UInt64 *size) PURE; +}; + +STREAM_INTERFACE(IOutStreamFlush, 0x07) +{ + STDMETHOD(Flush)() PURE; +}; + +#endif diff --git a/host_util/lzma/InBuffer.cpp b/host_util/lzma/InBuffer.cpp new file mode 100644 index 0000000..5a09e2c --- /dev/null +++ b/host_util/lzma/InBuffer.cpp @@ -0,0 +1,83 @@ +// InBuffer.cpp + +#include "StdAfx.h" + +#include "InBuffer.h" + +extern "C" +{ + #include "C/Alloc.h" +} + +CInBuffer::CInBuffer(): + _buffer(0), + _bufferLimit(0), + _bufferBase(0), + _stream(0), + _bufferSize(0) +{} + +bool CInBuffer::Create(UInt32 bufferSize) +{ + const UInt32 kMinBlockSize = 1; + if (bufferSize < kMinBlockSize) + bufferSize = kMinBlockSize; + if (_bufferBase != 0 && _bufferSize == bufferSize) + return true; + Free(); + _bufferSize = bufferSize; + _bufferBase = (Byte *)::MidAlloc(bufferSize); + return (_bufferBase != 0); +} + +void CInBuffer::Free() +{ + ::MidFree(_bufferBase); + _bufferBase = 0; +} + +void CInBuffer::SetStream(ISequentialInStream *stream) +{ + _stream = stream; +} + +void CInBuffer::Init() +{ + _processedSize = 0; + _buffer = _bufferBase; + _bufferLimit = _buffer; + _wasFinished = false; + #ifdef _NO_EXCEPTIONS + ErrorCode = S_OK; + #endif +} + +bool CInBuffer::ReadBlock() +{ + #ifdef _NO_EXCEPTIONS + if (ErrorCode != S_OK) + return false; + #endif + if (_wasFinished) + return false; + _processedSize += (_buffer - _bufferBase); + UInt32 numProcessedBytes; + HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes); + #ifdef _NO_EXCEPTIONS + ErrorCode = result; + #else + if (result != S_OK) + throw CInBufferException(result); + #endif + _buffer = _bufferBase; + _bufferLimit = _buffer + numProcessedBytes; + _wasFinished = (numProcessedBytes == 0); + return (!_wasFinished); +} + +Byte CInBuffer::ReadBlock2() +{ + if(!ReadBlock()) + return 0xFF; + return *_buffer++; +} diff --git a/host_util/lzma/InBuffer.h b/host_util/lzma/InBuffer.h new file mode 100644 index 0000000..a1c16f2 --- /dev/null +++ b/host_util/lzma/InBuffer.h @@ -0,0 +1,81 @@ +// InBuffer.h + +#ifndef __INBUFFER_H +#define __INBUFFER_H + +#include "IStream.h" +#include "Common/MyCom.h" +#include "Common/MyException.h" + +#ifndef _NO_EXCEPTIONS +struct CInBufferException: public CSystemException +{ + CInBufferException(HRESULT errorCode): CSystemException(errorCode) {} +}; +#endif + +class CInBuffer +{ + Byte *_buffer; + Byte *_bufferLimit; + Byte *_bufferBase; + CMyComPtr _stream; + UInt64 _processedSize; + UInt32 _bufferSize; + bool _wasFinished; + + bool ReadBlock(); + Byte ReadBlock2(); + +public: + #ifdef _NO_EXCEPTIONS + HRESULT ErrorCode; + #endif + + CInBuffer(); + ~CInBuffer() { Free(); } + + bool Create(UInt32 bufferSize); + void Free(); + + void SetStream(ISequentialInStream *stream); + void Init(); + void ReleaseStream() { _stream.Release(); } + + bool ReadByte(Byte &b) + { + if (_buffer >= _bufferLimit) + if (!ReadBlock()) + return false; + b = *_buffer++; + return true; + } + Byte ReadByte() + { + if (_buffer >= _bufferLimit) + return ReadBlock2(); + return *_buffer++; + } + UInt32 ReadBytes(Byte *buf, UInt32 size) + { + if ((UInt32)(_bufferLimit - _buffer) >= size) + { + for (UInt32 i = 0; i < size; i++) + buf[i] = _buffer[i]; + _buffer += size; + return size; + } + for (UInt32 i = 0; i < size; i++) + { + if (_buffer >= _bufferLimit) + if (!ReadBlock()) + return i; + buf[i] = *_buffer++; + } + return size; + } + UInt64 GetProcessedSize() const { return _processedSize + (_buffer - _bufferBase); } + bool WasFinished() const { return _wasFinished; } +}; + +#endif diff --git a/host_util/lzma/LzmaDecoder.cpp b/host_util/lzma/LzmaDecoder.cpp new file mode 100644 index 0000000..258659a --- /dev/null +++ b/host_util/lzma/LzmaDecoder.cpp @@ -0,0 +1,190 @@ +// LzmaDecoder.cpp + +#include "StdAfx.h" + +extern "C" +{ +#include "C/Alloc.h" +} + +#include "StreamUtils.h" + +#include "LzmaDecoder.h" + +static HRESULT SResToHRESULT(SRes res) +{ + switch(res) + { + case SZ_OK: return S_OK; + case SZ_ERROR_MEM: return E_OUTOFMEMORY; + case SZ_ERROR_PARAM: return E_INVALIDARG; + case SZ_ERROR_UNSUPPORTED: return E_NOTIMPL; + // case SZ_ERROR_PROGRESS: return E_ABORT; + case SZ_ERROR_DATA: return S_FALSE; + } + return E_FAIL; +} + +namespace NCompress { +namespace NLzma { + +static const UInt32 kInBufSize = 1 << 20; + +CDecoder::CDecoder(): _inBuf(0), _outSizeDefined(false), FinishStream(false) +{ + LzmaDec_Construct(&_state); +} + +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 }; + +CDecoder::~CDecoder() +{ + LzmaDec_Free(&_state, &g_Alloc); + MyFree(_inBuf); +} + +STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *prop, UInt32 size) +{ + RINOK(SResToHRESULT(LzmaDec_Allocate(&_state, prop, size, &g_Alloc))); + + if (_inBuf == 0) + { + _inBuf = (Byte *)MyAlloc(kInBufSize); + if (_inBuf == 0) + return E_OUTOFMEMORY; + } + + return S_OK; +} + +STDMETHODIMP CDecoder::GetInStreamProcessedSize(UInt64 *value) { *value = _inSizeProcessed; return S_OK; } +STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream) { _inStream = inStream; return S_OK; } +STDMETHODIMP CDecoder::ReleaseInStream() { _inStream.Release(); return S_OK; } + +STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize) +{ + _outSizeDefined = (outSize != NULL); + if (_outSizeDefined) + _outSize = *outSize; + + LzmaDec_Init(&_state); + + _inPos = _inSize = 0; + _inSizeProcessed = _outSizeProcessed = 0; + return S_OK; +} + +STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress) +{ + if (_inBuf == 0) + return S_FALSE; + SetOutStreamSize(outSize); + + for (;;) + { + if (_inPos == _inSize) + { + _inPos = _inSize = 0; + RINOK(inStream->Read(_inBuf, kInBufSize, &_inSize)); + } + + SizeT dicPos = _state.dicPos; + SizeT curSize = _state.dicBufSize - dicPos; + const UInt32 kStepSize = ((UInt32)1 << 22); + if (curSize > kStepSize) + curSize = (SizeT)kStepSize; + + ELzmaFinishMode finishMode = LZMA_FINISH_ANY; + if (_outSizeDefined) + { + const UInt64 rem = _outSize - _outSizeProcessed; + if (rem < curSize) + { + curSize = (SizeT)rem; + if (FinishStream) + finishMode = LZMA_FINISH_END; + } + } + + SizeT inSizeProcessed = _inSize - _inPos; + ELzmaStatus status; + SRes res = LzmaDec_DecodeToDic(&_state, dicPos + curSize, _inBuf + _inPos, &inSizeProcessed, finishMode, &status); + + _inPos += (UInt32)inSizeProcessed; + _inSizeProcessed += inSizeProcessed; + SizeT outSizeProcessed = _state.dicPos - dicPos; + _outSizeProcessed += outSizeProcessed; + + bool finished = (inSizeProcessed == 0 && outSizeProcessed == 0); + bool stopDecoding = (_outSizeDefined && _outSizeProcessed >= _outSize); + + if (res != 0 || _state.dicPos == _state.dicBufSize || finished || stopDecoding) + { + HRESULT res2 = WriteStream(outStream, _state.dic, _state.dicPos); + if (res != 0) + return S_FALSE; + RINOK(res2); + if (stopDecoding) + return S_OK; + if (finished) + return (status == LZMA_STATUS_FINISHED_WITH_MARK ? S_OK : S_FALSE); + } + if (_state.dicPos == _state.dicBufSize) + _state.dicPos = 0; + + if (progress != NULL) + { + RINOK(progress->SetRatioInfo(&_inSizeProcessed, &_outSizeProcessed)); + } + } +} + +#ifndef NO_READ_FROM_CODER + +STDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + do + { + if (_inPos == _inSize) + { + _inPos = _inSize = 0; + RINOK(_inStream->Read(_inBuf, kInBufSize, &_inSize)); + } + { + SizeT inProcessed = _inSize - _inPos; + + if (_outSizeDefined) + { + const UInt64 rem = _outSize - _outSizeProcessed; + if (rem < size) + size = (UInt32)rem; + } + + SizeT outProcessed = size; + ELzmaStatus status; + SRes res = LzmaDec_DecodeToBuf(&_state, (Byte *)data, &outProcessed, + _inBuf + _inPos, &inProcessed, LZMA_FINISH_ANY, &status); + _inPos += (UInt32)inProcessed; + _inSizeProcessed += inProcessed; + _outSizeProcessed += outProcessed; + size -= (UInt32)outProcessed; + data = (Byte *)data + outProcessed; + if (processedSize) + *processedSize += (UInt32)outProcessed; + RINOK(SResToHRESULT(res)); + if (inProcessed == 0 && outProcessed == 0) + return S_OK; + } + } + while (size != 0); + return S_OK; +} + +#endif + +}} diff --git a/host_util/lzma/LzmaDecoder.h b/host_util/lzma/LzmaDecoder.h new file mode 100644 index 0000000..c79a258 --- /dev/null +++ b/host_util/lzma/LzmaDecoder.h @@ -0,0 +1,73 @@ +// LzmaDecoder.h + +#ifndef __LZMA_DECODER_H +#define __LZMA_DECODER_H + +extern "C" +{ +#include "C/LzmaDec.h" +} + +#include "Common/MyCom.h" +#include "ICoder.h" + +namespace NCompress { +namespace NLzma { + +class CDecoder: + public ICompressCoder, + public ICompressSetDecoderProperties2, + public ICompressGetInStreamProcessedSize, + #ifndef NO_READ_FROM_CODER + public ICompressSetInStream, + public ICompressSetOutStreamSize, + public ISequentialInStream, + #endif + public CMyUnknownImp +{ + CMyComPtr _inStream; + Byte *_inBuf; + UInt32 _inPos; + UInt32 _inSize; + CLzmaDec _state; + bool _outSizeDefined; + UInt64 _outSize; + UInt64 _inSizeProcessed; + UInt64 _outSizeProcessed; +public: + + #ifndef NO_READ_FROM_CODER + MY_UNKNOWN_IMP5( + ICompressSetDecoderProperties2, + ICompressGetInStreamProcessedSize, + ICompressSetInStream, + ICompressSetOutStreamSize, + ISequentialInStream) + #else + MY_UNKNOWN_IMP2( + ICompressSetDecoderProperties2, + ICompressGetInStreamProcessedSize) + #endif + + STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); + STDMETHOD(GetInStreamProcessedSize)(UInt64 *value); + STDMETHOD(SetInStream)(ISequentialInStream *inStream); + STDMETHOD(ReleaseInStream)(); + STDMETHOD(SetOutStreamSize)(const UInt64 *outSize); + + #ifndef NO_READ_FROM_CODER + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + #endif + + bool FinishStream; + + CDecoder(); + virtual ~CDecoder(); + +}; + +}} + +#endif diff --git a/host_util/lzma/LzmaEncoder.cpp b/host_util/lzma/LzmaEncoder.cpp new file mode 100644 index 0000000..ca6ef6b --- /dev/null +++ b/host_util/lzma/LzmaEncoder.cpp @@ -0,0 +1,211 @@ +// LzmaEncoder.cpp + +#include "StdAfx.h" + +extern "C" +{ +#include "C/Alloc.h" +} + +#include "StreamUtils.h" + +#include "LzmaEncoder.h" + +static HRESULT SResToHRESULT(SRes res) +{ + switch(res) + { + case SZ_OK: return S_OK; + case SZ_ERROR_MEM: return E_OUTOFMEMORY; + case SZ_ERROR_PARAM: return E_INVALIDARG; + // case SZ_ERROR_THREAD: return E_FAIL; + } + return E_FAIL; +} + +namespace NCompress { +namespace NLzma { + +static const UInt32 kStreamStepSize = (UInt32)1 << 31; + +static SRes MyRead(void *object, void *data, size_t *size) +{ + UInt32 curSize = ((*size < kStreamStepSize) ? (UInt32)*size : kStreamStepSize); + HRESULT res = ((CSeqInStream *)object)->RealStream->Read(data, curSize, &curSize); + *size = curSize; + return (SRes)res; +} + +static size_t MyWrite(void *object, const void *data, size_t size) +{ + CSeqOutStream *p = (CSeqOutStream *)object; + p->Res = WriteStream(p->RealStream, data, size); + if (p->Res != 0) + return 0; + return size; +} + +static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); } +static void SzBigFree(void *, void *address) { BigFree(address); } +static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree }; + +static void *SzAlloc(void *, size_t size) { return MyAlloc(size); } +static void SzFree(void *, void *address) { MyFree(address); } +static ISzAlloc g_Alloc = { SzAlloc, SzFree }; + +CEncoder::CEncoder() +{ + _seqInStream.SeqInStream.Read = MyRead; + _seqOutStream.SeqOutStream.Write = MyWrite; + _encoder = 0; + _encoder = LzmaEnc_Create(&g_Alloc); + if (_encoder == 0) + throw 1; +} + +CEncoder::~CEncoder() +{ + if (_encoder != 0) + LzmaEnc_Destroy(_encoder, &g_Alloc, &g_BigAlloc); +} + +inline wchar_t GetUpperChar(wchar_t c) +{ + if (c >= 'a' && c <= 'z') + c -= 0x20; + return c; +} + +static int ParseMatchFinder(const wchar_t *s, int *btMode, int *numHashBytes) +{ + wchar_t c = GetUpperChar(*s++); + if (c == L'H') + { + if (GetUpperChar(*s++) != L'C') + return 0; + int numHashBytesLoc = (int)(*s++ - L'0'); + if (numHashBytesLoc < 4 || numHashBytesLoc > 4) + return 0; + if (*s++ != 0) + return 0; + *btMode = 0; + *numHashBytes = numHashBytesLoc; + return 1; + } + if (c != L'B') + return 0; + + if (GetUpperChar(*s++) != L'T') + return 0; + int numHashBytesLoc = (int)(*s++ - L'0'); + if (numHashBytesLoc < 2 || numHashBytesLoc > 4) + return 0; + c = GetUpperChar(*s++); + if (c != L'\0') + return 0; + *btMode = 1; + *numHashBytes = numHashBytesLoc; + return 1; +} + +STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, + const PROPVARIANT *coderProps, UInt32 numProps) +{ + CLzmaEncProps props; + LzmaEncProps_Init(&props); + + for (UInt32 i = 0; i < numProps; i++) + { + const PROPVARIANT &prop = coderProps[i]; + switch (propIDs[i]) + { + case NCoderPropID::kNumFastBytes: + if (prop.vt != VT_UI4) return E_INVALIDARG; props.fb = prop.ulVal; break; + case NCoderPropID::kMatchFinderCycles: + if (prop.vt != VT_UI4) return E_INVALIDARG; props.mc = prop.ulVal; break; + case NCoderPropID::kAlgorithm: + if (prop.vt != VT_UI4) return E_INVALIDARG; props.algo = prop.ulVal; break; + case NCoderPropID::kDictionarySize: + if (prop.vt != VT_UI4) return E_INVALIDARG; props.dictSize = prop.ulVal; break; + case NCoderPropID::kPosStateBits: + if (prop.vt != VT_UI4) return E_INVALIDARG; props.pb = prop.ulVal; break; + case NCoderPropID::kLitPosBits: + if (prop.vt != VT_UI4) return E_INVALIDARG; props.lp = prop.ulVal; break; + case NCoderPropID::kLitContextBits: + if (prop.vt != VT_UI4) return E_INVALIDARG; props.lc = prop.ulVal; break; + case NCoderPropID::kNumThreads: + if (prop.vt != VT_UI4) return E_INVALIDARG; props.numThreads = prop.ulVal; break; + case NCoderPropID::kMultiThread: + if (prop.vt != VT_BOOL) return E_INVALIDARG; props.numThreads = ((prop.boolVal == VARIANT_TRUE) ? 2 : 1); break; + case NCoderPropID::kEndMarker: + if (prop.vt != VT_BOOL) return E_INVALIDARG; props.writeEndMark = (prop.boolVal == VARIANT_TRUE); break; + case NCoderPropID::kMatchFinder: + if (prop.vt != VT_BSTR) return E_INVALIDARG; + if (!ParseMatchFinder(prop.bstrVal, &props.btMode, &props.numHashBytes /* , &_matchFinderBase.skipModeBits */)) + return E_INVALIDARG; break; + default: + return E_INVALIDARG; + } + } + return SResToHRESULT(LzmaEnc_SetProps(_encoder, &props)); +} + +STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) +{ + Byte props[LZMA_PROPS_SIZE]; + size_t size = LZMA_PROPS_SIZE; + RINOK(LzmaEnc_WriteProperties(_encoder, props, &size)); + return WriteStream(outStream, props, size); +} + +STDMETHODIMP CEncoder::SetOutStream(ISequentialOutStream *outStream) +{ + _seqOutStream.RealStream = outStream; + _seqOutStream.Res = S_OK; + return S_OK; +} + +STDMETHODIMP CEncoder::ReleaseOutStream() +{ + _seqOutStream.RealStream.Release(); + return S_OK; +} + +typedef struct _CCompressProgressImp +{ + ICompressProgress p; + ICompressProgressInfo *Progress; + HRESULT Res; +} CCompressProgressImp; + +#define PROGRESS_UNKNOWN_VALUE ((UInt64)(Int64)-1) + +#define CONVERT_PR_VAL(x) (x == PROGRESS_UNKNOWN_VALUE ? NULL : &x) + +SRes CompressProgress(void *pp, UInt64 inSize, UInt64 outSize) +{ + CCompressProgressImp *p = (CCompressProgressImp *)pp; + p->Res = p->Progress->SetRatioInfo(CONVERT_PR_VAL(inSize), CONVERT_PR_VAL(outSize)); + return (SRes)p->Res; +} + +STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress) +{ + CCompressProgressImp progressImp; + progressImp.p.Progress = CompressProgress; + progressImp.Progress = progress; + progressImp.Res = SZ_OK; + + _seqInStream.RealStream = inStream; + SetOutStream(outStream); + SRes res = LzmaEnc_Encode(_encoder, &_seqOutStream.SeqOutStream, &_seqInStream.SeqInStream, progress ? &progressImp.p : NULL, &g_Alloc, &g_BigAlloc); + ReleaseOutStream(); + if (res == SZ_ERROR_WRITE && _seqOutStream.Res != S_OK) + return _seqOutStream.Res; + if (res == SZ_ERROR_PROGRESS && progressImp.Res != S_OK) + return progressImp.Res; + return SResToHRESULT(res); +} + +}} diff --git a/host_util/lzma/LzmaEncoder.h b/host_util/lzma/LzmaEncoder.h new file mode 100644 index 0000000..0de2413 --- /dev/null +++ b/host_util/lzma/LzmaEncoder.h @@ -0,0 +1,64 @@ +// LzmaEncoder.h + +#ifndef __LZMA_ENCODER_H +#define __LZMA_ENCODER_H + +extern "C" +{ +#include "C/LzmaEnc.h" +} + +#include "Common/MyCom.h" + +#include "ICoder.h" + +namespace NCompress { +namespace NLzma { + +struct CSeqInStream +{ + ISeqInStream SeqInStream; + ISequentialInStream *RealStream; +}; + +struct CSeqOutStream +{ + ISeqOutStream SeqOutStream; + CMyComPtr RealStream; + HRESULT Res; +}; + +class CEncoder : + public ICompressCoder, + public ICompressSetOutStream, + public ICompressSetCoderProperties, + public ICompressWriteCoderProperties, + public CMyUnknownImp +{ + CLzmaEncHandle _encoder; + + CSeqInStream _seqInStream; + CSeqOutStream _seqOutStream; + +public: + CEncoder(); + + MY_UNKNOWN_IMP3( + ICompressSetOutStream, + ICompressSetCoderProperties, + ICompressWriteCoderProperties + ) + + STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps); + STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); + STDMETHOD(SetOutStream)(ISequentialOutStream *outStream); + STDMETHOD(ReleaseOutStream)(); + + virtual ~CEncoder(); +}; + +}} + +#endif diff --git a/host_util/lzma/OutBuffer.cpp b/host_util/lzma/OutBuffer.cpp new file mode 100644 index 0000000..d7fbcb9 --- /dev/null +++ b/host_util/lzma/OutBuffer.cpp @@ -0,0 +1,119 @@ +// OutByte.cpp + +#include "StdAfx.h" + +#include "OutBuffer.h" + +extern "C" +{ + #include "C/Alloc.h" +} + +bool COutBuffer::Create(UInt32 bufferSize) +{ + const UInt32 kMinBlockSize = 1; + if (bufferSize < kMinBlockSize) + bufferSize = kMinBlockSize; + if (_buffer != 0 && _bufferSize == bufferSize) + return true; + Free(); + _bufferSize = bufferSize; + _buffer = (Byte *)::MidAlloc(bufferSize); + return (_buffer != 0); +} + +void COutBuffer::Free() +{ + ::MidFree(_buffer); + _buffer = 0; +} + +void COutBuffer::SetStream(ISequentialOutStream *stream) +{ + _stream = stream; +} + +void COutBuffer::Init() +{ + _streamPos = 0; + _limitPos = _bufferSize; + _pos = 0; + _processedSize = 0; + _overDict = false; + #ifdef _NO_EXCEPTIONS + ErrorCode = S_OK; + #endif +} + +UInt64 COutBuffer::GetProcessedSize() const +{ + UInt64 res = _processedSize + _pos - _streamPos; + if (_streamPos > _pos) + res += _bufferSize; + return res; +} + + +HRESULT COutBuffer::FlushPart() +{ + // _streamPos < _bufferSize + UInt32 size = (_streamPos >= _pos) ? (_bufferSize - _streamPos) : (_pos - _streamPos); + HRESULT result = S_OK; + #ifdef _NO_EXCEPTIONS + result = ErrorCode; + #endif + if (_buffer2 != 0) + { + memmove(_buffer2, _buffer + _streamPos, size); + _buffer2 += size; + } + + if (_stream != 0 + #ifdef _NO_EXCEPTIONS + && (ErrorCode == S_OK) + #endif + ) + { + UInt32 processedSize = 0; + result = _stream->Write(_buffer + _streamPos, size, &processedSize); + size = processedSize; + } + _streamPos += size; + if (_streamPos == _bufferSize) + _streamPos = 0; + if (_pos == _bufferSize) + { + _overDict = true; + _pos = 0; + } + _limitPos = (_streamPos > _pos) ? _streamPos : _bufferSize; + _processedSize += size; + return result; +} + +HRESULT COutBuffer::Flush() +{ + #ifdef _NO_EXCEPTIONS + if (ErrorCode != S_OK) + return ErrorCode; + #endif + + while(_streamPos != _pos) + { + HRESULT result = FlushPart(); + if (result != S_OK) + return result; + } + return S_OK; +} + +void COutBuffer::FlushWithCheck() +{ + HRESULT result = Flush(); + #ifdef _NO_EXCEPTIONS + ErrorCode = result; + #else + if (result != S_OK) + throw COutBufferException(result); + #endif +} diff --git a/host_util/lzma/OutBuffer.h b/host_util/lzma/OutBuffer.h new file mode 100644 index 0000000..2783659 --- /dev/null +++ b/host_util/lzma/OutBuffer.h @@ -0,0 +1,64 @@ +// OutBuffer.h + +#ifndef __OUTBUFFER_H +#define __OUTBUFFER_H + +#include "IStream.h" +#include "Common/MyCom.h" +#include "Common/MyException.h" + +#ifndef _NO_EXCEPTIONS +struct COutBufferException: public CSystemException +{ + COutBufferException(HRESULT errorCode): CSystemException(errorCode) {} +}; +#endif + +class COutBuffer +{ +protected: + Byte *_buffer; + UInt32 _pos; + UInt32 _limitPos; + UInt32 _streamPos; + UInt32 _bufferSize; + CMyComPtr _stream; + UInt64 _processedSize; + Byte *_buffer2; + bool _overDict; + + HRESULT FlushPart(); +public: + #ifdef _NO_EXCEPTIONS + HRESULT ErrorCode; + #endif + + COutBuffer(): _buffer(0), _pos(0), _stream(0), _buffer2(0) {} + ~COutBuffer() { Free(); } + + bool Create(UInt32 bufferSize); + void Free(); + + void SetMemStream(Byte *buffer) { _buffer2 = buffer; } + void SetStream(ISequentialOutStream *stream); + void Init(); + HRESULT Flush(); + void FlushWithCheck(); + void ReleaseStream() { _stream.Release(); } + + void WriteByte(Byte b) + { + _buffer[_pos++] = b; + if(_pos == _limitPos) + FlushWithCheck(); + } + void WriteBytes(const void *data, size_t size) + { + for (size_t i = 0; i < size; i++) + WriteByte(((const Byte *)data)[i]); + } + + UInt64 GetProcessedSize() const; +}; + +#endif diff --git a/host_util/lzma/StdAfx.h b/host_util/lzma/StdAfx.h new file mode 100644 index 0000000..efa8af8 --- /dev/null +++ b/host_util/lzma/StdAfx.h @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "Common/MyWindows.h" +#include "Common/NewHandler.h" + +#endif diff --git a/host_util/lzma/StreamUtils.cpp b/host_util/lzma/StreamUtils.cpp new file mode 100644 index 0000000..049e4aa --- /dev/null +++ b/host_util/lzma/StreamUtils.cpp @@ -0,0 +1,56 @@ +// StreamUtils.cpp + +#include "StdAfx.h" + +#include "StreamUtils.h" + +static const UInt32 kBlockSize = ((UInt32)1 << 31); + +HRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *processedSize) +{ + size_t size = *processedSize; + *processedSize = 0; + while (size != 0) + { + UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize; + UInt32 processedSizeLoc; + HRESULT res = stream->Read(data, curSize, &processedSizeLoc); + *processedSize += processedSizeLoc; + data = (void *)((Byte *)data + processedSizeLoc); + size -= processedSizeLoc; + RINOK(res); + if (processedSizeLoc == 0) + return S_OK; + } + return S_OK; +} + +HRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size) +{ + size_t processedSize = size; + RINOK(ReadStream(stream, data, &processedSize)); + return (size == processedSize) ? S_OK : S_FALSE; +} + +HRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size) +{ + size_t processedSize = size; + RINOK(ReadStream(stream, data, &processedSize)); + return (size == processedSize) ? S_OK : E_FAIL; +} + +HRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size) +{ + while (size != 0) + { + UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize; + UInt32 processedSizeLoc; + HRESULT res = stream->Write(data, curSize, &processedSizeLoc); + data = (const void *)((const Byte *)data + processedSizeLoc); + size -= processedSizeLoc; + RINOK(res); + if (processedSizeLoc == 0) + return E_FAIL; + } + return S_OK; +} diff --git a/host_util/lzma/StreamUtils.h b/host_util/lzma/StreamUtils.h new file mode 100644 index 0000000..dde2a60 --- /dev/null +++ b/host_util/lzma/StreamUtils.h @@ -0,0 +1,13 @@ +// StreamUtils.h + +#ifndef __STREAMUTILS_H +#define __STREAMUTILS_H + +#include "IStream.h" + +HRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *size); +HRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size); +HRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size); +HRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size); + +#endif diff --git a/host_util/lzma/history.txt b/host_util/lzma/history.txt new file mode 100755 index 0000000..0141867 --- /dev/null +++ b/host_util/lzma/history.txt @@ -0,0 +1,236 @@ +HISTORY of the LZMA SDK +----------------------- + +4.65 2009-02-03 +------------------------- +- Some minor fixes + + +4.63 2008-12-31 +------------------------- +- Some minor fixes + + +4.61 beta 2008-11-23 +------------------------- +- The bug in ANSI-C LZMA Decoder was fixed: + If encoded stream was corrupted, decoder could access memory + outside of allocated range. +- Some changes in ANSI-C 7z Decoder interfaces. +- LZMA SDK is placed in the public domain. + + +4.60 beta 2008-08-19 +------------------------- +- Some minor fixes. + + +4.59 beta 2008-08-13 +------------------------- +- The bug was fixed: + LZMA Encoder in fast compression mode could access memory outside of + allocated range in some rare cases. + + +4.58 beta 2008-05-05 +------------------------- +- ANSI-C LZMA Decoder was rewritten for speed optimizations. +- ANSI-C LZMA Encoder was included to LZMA SDK. +- C++ LZMA code now is just wrapper over ANSI-C code. + + +4.57 2007-12-12 +------------------------- +- Speed optimizations in Ñ++ LZMA Decoder. +- Small changes for more compatibility with some C/C++ compilers. + + +4.49 beta 2007-07-05 +------------------------- +- .7z ANSI-C Decoder: + - now it supports BCJ and BCJ2 filters + - now it supports files larger than 4 GB. + - now it supports "Last Write Time" field for files. +- C++ code for .7z archives compressing/decompressing from 7-zip + was included to LZMA SDK. + + +4.43 2006-06-04 +------------------------- +- Small changes for more compatibility with some C/C++ compilers. + + +4.42 2006-05-15 +------------------------- +- Small changes in .h files in ANSI-C version. + + +4.39 beta 2006-04-14 +------------------------- +- The bug in versions 4.33b:4.38b was fixed: + C++ version of LZMA encoder could not correctly compress + files larger than 2 GB with HC4 match finder (-mfhc4). + + +4.37 beta 2005-04-06 +------------------------- +- Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined. + + +4.35 beta 2005-03-02 +------------------------- +- The bug was fixed in C++ version of LZMA Decoder: + If encoded stream was corrupted, decoder could access memory + outside of allocated range. + + +4.34 beta 2006-02-27 +------------------------- +- Compressing speed and memory requirements for compressing were increased +- LZMA now can use only these match finders: HC4, BT2, BT3, BT4 + + +4.32 2005-12-09 +------------------------- +- Java version of LZMA SDK was included + + +4.30 2005-11-20 +------------------------- +- Compression ratio was improved in -a2 mode +- Speed optimizations for compressing in -a2 mode +- -fb switch now supports values up to 273 +- The bug in 7z_C (7zIn.c) was fixed: + It used Alloc/Free functions from different memory pools. + So if program used two memory pools, it worked incorrectly. +- 7z_C: .7z format supporting was improved +- LZMA# SDK (C#.NET version) was included + + +4.27 (Updated) 2005-09-21 +------------------------- +- Some GUIDs/interfaces in C++ were changed. + IStream.h: + ISequentialInStream::Read now works as old ReadPart + ISequentialOutStream::Write now works as old WritePart + + +4.27 2005-08-07 +------------------------- +- The bug in LzmaDecodeSize.c was fixed: + if _LZMA_IN_CB and _LZMA_OUT_READ were defined, + decompressing worked incorrectly. + + +4.26 2005-08-05 +------------------------- +- Fixes in 7z_C code and LzmaTest.c: + previous versions could work incorrectly, + if malloc(0) returns 0 + + +4.23 2005-06-29 +------------------------- +- Small fixes in C++ code + + +4.22 2005-06-10 +------------------------- +- Small fixes + + +4.21 2005-06-08 +------------------------- +- Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed +- New additional version of ANSI-C LZMA Decoder with zlib-like interface: + - LzmaStateDecode.h + - LzmaStateDecode.c + - LzmaStateTest.c +- ANSI-C LZMA Decoder now can decompress files larger than 4 GB + + +4.17 2005-04-18 +------------------------- +- New example for RAM->RAM compressing/decompressing: + LZMA + BCJ (filter for x86 code): + - LzmaRam.h + - LzmaRam.cpp + - LzmaRamDecode.h + - LzmaRamDecode.c + - -f86 switch for lzma.exe + + +4.16 2005-03-29 +------------------------- +- The bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder): + If _LZMA_OUT_READ was defined, and if encoded stream was corrupted, + decoder could access memory outside of allocated range. +- Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster). + Old version of LZMA Decoder now is in file LzmaDecodeSize.c. + LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c +- Small speed optimization in LZMA C++ code +- filter for SPARC's code was added +- Simplified version of .7z ANSI-C Decoder was included + + +4.06 2004-09-05 +------------------------- +- The bug in v4.05 was fixed: + LZMA-Encoder didn't release output stream in some cases. + + +4.05 2004-08-25 +------------------------- +- Source code of filters for x86, IA-64, ARM, ARM-Thumb + and PowerPC code was included to SDK +- Some internal minor changes + + +4.04 2004-07-28 +------------------------- +- More compatibility with some C++ compilers + + +4.03 2004-06-18 +------------------------- +- "Benchmark" command was added. It measures compressing + and decompressing speed and shows rating values. + Also it checks hardware errors. + + +4.02 2004-06-10 +------------------------- +- C++ LZMA Encoder/Decoder code now is more portable + and it can be compiled by GCC on Linux. + + +4.01 2004-02-15 +------------------------- +- Some detection of data corruption was enabled. + LzmaDecode.c / RangeDecoderReadByte + ..... + { + rd->ExtraBytes = 1; + return 0xFF; + } + + +4.00 2004-02-13 +------------------------- +- Original version of LZMA SDK + + + +HISTORY of the LZMA +------------------- + 2001-2008: Improvements to LZMA compressing/decompressing code, + keeping compatibility with original LZMA format + 1996-2001: Development of LZMA compression format + + Some milestones: + + 2001-08-30: LZMA compression was added to 7-Zip + 1999-01-02: First version of 7-Zip was released + + +End of document diff --git a/host_util/lzma/lzma.txt b/host_util/lzma/lzma.txt new file mode 100755 index 0000000..715792d --- /dev/null +++ b/host_util/lzma/lzma.txt @@ -0,0 +1,594 @@ +LZMA SDK 4.65 +------------- + +LZMA SDK provides the documentation, samples, header files, libraries, +and tools you need to develop applications that use LZMA compression. + +LZMA is default and general compression method of 7z format +in 7-Zip compression program (www.7-zip.org). LZMA provides high +compression ratio and very fast decompression. + +LZMA is an improved version of famous LZ77 compression algorithm. +It was improved in way of maximum increasing of compression ratio, +keeping high decompression speed and low memory requirements for +decompressing. + + + +LICENSE +------- + +LZMA SDK is written and placed in the public domain by Igor Pavlov. + + +LZMA SDK Contents +----------------- + +LZMA SDK includes: + + - ANSI-C/C++/C#/Java source code for LZMA compressing and decompressing + - Compiled file->file LZMA compressing/decompressing program for Windows system + + +UNIX/Linux version +------------------ +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, you can use +LIB = -lm -static + + +Files +--------------------- +lzma.txt - LZMA SDK description (this file) +7zFormat.txt - 7z Format description +7zC.txt - 7z ANSI-C Decoder description +methods.txt - Compression method IDs for .7z +lzma.exe - Compiled file->file LZMA encoder/decoder for Windows +history.txt - history of the LZMA SDK + + +Source code structure +--------------------- + +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. + + LzmaLib - LZMA Library (.DLL for Windows) + + LzmaUtil - LZMA Utility (file->file LZMA encoder/decoder). + + Archive - files related to archiving + 7z - 7z ANSI-C Decoder + +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 + + 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 + + Common - common files for archive handling + 7z - 7z C++ Encoder/Decoder + + Bundles - Modules that are bundles of other modules + + Alone7z - 7zr.exe: Standalone version of 7z.exe that supports only 7z/LZMA/BCJ/BCJ2 + Format7zR - 7zr.dll: Reduced version of 7za.dll: extracting/compressing to 7z/LZMA/BCJ/BCJ2 + Format7zExtractR - 7zxr.dll: Reduced version of 7zxa.dll: extracting from 7z/LZMA/BCJ/BCJ2. + + UI - User Interface files + + Client7z - Test application for 7za.dll, 7zr.dll, 7zxr.dll + Common - Common UI files + Console - Code for console archiver + + + +CS/ - C# files + 7zip + Common - some common files for 7-Zip + Compress - files related to compression/decompression + LZ - files related to LZ (Lempel-Ziv) compression algorithm + LZMA - LZMA compression/decompression + LzmaAlone - file->file LZMA compression/decompression + RangeCoder - Range Coder (special code of compression/decompression) + +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. +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 2 MB/s on 2 GHz CPU + - Estimated decompressing speed: + - 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 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 + +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. + + +How To Use +---------- + +Using LZMA encoder/decoder executable +-------------------------------------- + +Usage: LZMA inputFile outputFile [...] + + e: encode file + + d: decode file + + 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 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 parameter. + Also you can change the number of iterations. Example for 30 iterations: + LZMA b 30 + Default number of iterations is 10. + + + + + -a{N}: set compression mode 0 = fast, 1 = normal + default: 1 (normal) + + d{N}: Sets Dictionary size - [0, 30], default: 23 (8MB) + The maximum value for dictionary size is 1 GB = 2^30 bytes. + Dictionary size is calculated as DictionarySize = 2^N bytes. + For decompressing file compressed by LZMA method with dictionary + size D = 2^N you need about D bytes of memory (RAM). + + -fb{N}: set number of fast bytes - [5, 273], default: 128 + Usually big number gives a little bit better compression ratio + and slower compression process. + + -lc{N}: set number of literal context bits - [0, 8], default: 3 + Sometimes lc=4 gives gain for big files. + + -lp{N}: set number of literal pos bits - [0, 4], default: 0 + lp switch is intended for periodical data when period is + equal 2^N. For example, for 32-bit (4 bytes) + periodical data you can use lp=2. Often it's better to set lc0, + if you change lp switch. + + -pb{N}: set number of pos bits - [0, 4], default: 2 + pb switch is intended for periodical data + when period is equal 2^N. + + -mf{MF_ID}: set Match Finder. Default: bt4. + Algorithms from hc* group doesn't provide good compression + ratio, but they often works pretty fast in combination with + fast mode (-a0). + + Memory requirements depend from dictionary size + (parameter "d" in table below). + + MF_ID Memory Description + + bt2 d * 9.5 + 4MB Binary Tree with 2 bytes hashing. + bt3 d * 11.5 + 4MB Binary Tree with 3 bytes hashing. + bt4 d * 11.5 + 4MB Binary Tree with 4 bytes hashing. + hc4 d * 7.5 + 4MB Hash Chain with 4 bytes hashing. + + -eos: write End Of Stream marker. By default LZMA doesn't write + eos marker, since LZMA decoder knows uncompressed size + stored in .lzma file header. + + -si: Read data from stdin (it will write End Of Stream marker). + -so: Write data to stdout + + +Examples: + +1) LZMA e file.bin file.lzma -d16 -lc0 + +compresses file.bin to file.lzma with 64 KB dictionary (2^16=64K) +and 0 literal context bits. -lc0 allows to reduce memory requirements +for decompression. + + +2) LZMA e file.bin file.lzma -lc0 -lp2 + +compresses file.bin to file.lzma with settings suitable +for 32-bit periodical data (for example, ARM or MIPS code). + +3) LZMA d file.lzma file.bin + +decompresses file.lzma to file.bin. + + +Compression ratio hints +----------------------- + +Recommendations +--------------- + +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, ...). + + +Filters +------- +You can increase the compression ratio for some data types, using +special filters before compressing. For example, it's possible to +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 source code of such filters in C/Bra*.* files + +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=arm -m1=lzma + +It works in such manner: +Compressing = Filter_encoding + LZMA_encoding +Decompressing = LZMA_decoding + Filter_decoding + +Compressing and decompressing speed of such filters is very high, +so it will not increase decompressing time too much. +Moreover, it reduces decompression time for LZMA_decoding, +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. + +For some ISAs (for example, for MIPS) it's impossible to get gain from such filter. + + +LZMA compressed file format +--------------------------- +Offset Size Description + 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 + + +ANSI-C LZMA Decoder +~~~~~~~~~~~~~~~~~~~ + +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 +------------------------------------- + +Stack usage of LZMA decoding function for local variables is not +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 2 interfaces: +1) Single-call Decompressing +2) Multi-call State Decompressing (zlib-like interface) + +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 }; + +You can use p = p; operator to disable compiler warnings. + + +Single-call Decompressing +------------------------- +When to use: RAM->RAM decompressing +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: state_size (16 KB for default settings) + +Interface: + 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. */ + + +Multi-call State Decompressing (zlib-like interface) +---------------------------------------------------- + +When to use: file->file decompressing +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: state_size (16 KB for default settings) + - LZMA dictionary (dictionary size is encoded in LZMA properties header) + +1) read LZMA properties (5 bytes) and uncompressed size (8 bytes, little-endian) to header: + unsigned char header[LZMA_PROPS_SIZE + 8]; + ReadFile(inFile, header, sizeof(header) + +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 (;;) + { + ... + int res = LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode); + ... + } + + +4) Free all allocated structures + LzmaDec_Free(&state, &g_Alloc); + +For full code example, look at C/LzmaUtil/LzmaUtil.c code. + + +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. + + +Single-call Compression with callbacks +-------------------------------------- + +Check C/LzmaUtil/LzmaUtil.c as example, + +When to use: file->file decompressing + +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_SIZE_OPT - Enable some optimizations in LZMA Decoder to get smaller executable code. + +_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_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. + + +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 diff --git a/host_util/lzma/lzma_version.h b/host_util/lzma/lzma_version.h new file mode 100644 index 0000000..5b432cd --- /dev/null +++ b/host_util/lzma/lzma_version.h @@ -0,0 +1,31 @@ +#ifndef LZMA_VERSION_H +#define LZMA_VERSION_H + +/* + Version and copyright information used by LZMA utils. +*/ + +static const char *LZMA_SDK_VERSION_STRING = "4.43"; + +static const char *LZMA_SDK_COPYRIGHT_STRING = + "Copyright (C) 1999-2006 Igor Pavlov"; + +static const char *LZMA_SDK_COPYRIGHT_INFO = + " See http://7-zip.org/sdk.html or the documentation of LZMA SDK for\n" + " the license. For reference, the version 4.43 is free software\n" + " licensed under the GNU LGPL."; + + +static const char *LZMA_UTILS_VERSION_STRING = PACKAGE_VERSION; + +static const char *LZMA_UTILS_COPYRIGHT_STRING = + "Copyright (C) 2006 Lasse Collin"; + +static const char *LZMA_UTILS_COPYRIGHT_INFO = + "This program comes with ABSOLUTELY NO WARRANTY.\n" + "You may redistribute copies of this program\n" + "under the terms of the GNU General Public License.\n" + "For more information about these matters, see the file " + "named COPYING.\n"; + +#endif /* ifndef LZMA_VERSION_H */ diff --git a/host_util/lzma/lzmp.cpp b/host_util/lzma/lzmp.cpp new file mode 100644 index 0000000..095b994 --- /dev/null +++ b/host_util/lzma/lzmp.cpp @@ -0,0 +1,893 @@ +/* + * LZMA command line tool similar to gzip to encode and decode LZMA files. + * + * Copyright (C) 2005 Ville Koskinen + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + */ + +#include "Common/MyInitGuid.h" + +#include +using std::cout; +using std::cerr; +using std::endl; + +#include +#include +#include + +#include +using std::string; +#include +using std::vector; +typedef vector stringVector; + +#include +#include +#include + +#include +#include +#include +#include // futimes() + +// For Solaris +#ifndef HAVE_FUTIMES +//#define futimes(fd, tv) futimesat(fd, NULL, tv) +#endif + +#if defined(_WIN32) || defined(OS2) || defined(MSDOS) +#include +#include +#define MY_SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY) +#else +#define MY_SET_BINARY_MODE(file) +#endif + +#include "FileStreams.h" + +#include "Common/Types.h" + +#include "LzmaDecoder.h" +#include "LzmaEncoder.h" + +#include "Exception.h" + +#include "lzma_version.h" + +namespace lzma { + +const char *PROGRAM_VERSION = PACKAGE_VERSION; +const char *PROGRAM_COPYRIGHT = "Copyright (C) 2006 Ville Koskinen"; + +/* LZMA_Alone switches: + -a{N}: set compression mode - [0, 2], default: 2 (max) + -d{N}: set dictionary - [0,28], default: 23 (8MB) + -fb{N}: set number of fast bytes - [5, 255], default: 128 + -lc{N}: set number of literal context bits - [0, 8], default: 3 + -lp{N}: set number of literal pos bits - [0, 4], default: 0 + -pb{N}: set number of pos bits - [0, 4], default: 2 + -mf{MF_ID}: set Match Finder: [bt2, bt3, bt4, bt4b, pat2r, pat2, + pat2h, pat3h, pat4h, hc3, hc4], default: bt4 +*/ + +struct lzma_option { + short compression_mode; // -a + short dictionary; // -d + short fast_bytes; // -fb + wchar_t *match_finder; // -mf + short literal_context_bits; // -lc + short literal_pos_bits; // -lp + short pos_bits; // -pb +}; + +/* The following is a mapping from gzip/bzip2 style -1 .. -9 compression modes + * to the corresponding LZMA compression modes. Thanks, Larhzu, for coining + * these. */ +const lzma_option option_mapping[] = { + { 0, 0, 0, NULL, 0, 0, 0}, // -0 (needed for indexing) + { 0, 16, 64, L"hc4", 3, 0, 2}, // -1 + { 0, 20, 64, L"hc4", 3, 0, 2}, // -2 + { 1, 19, 64, L"bt4", 3, 0, 2}, // -3 + { 2, 20, 64, L"bt4", 3, 0, 2}, // -4 + { 2, 21, 128, L"bt4", 3, 0, 2}, // -5 + { 2, 22, 128, L"bt4", 3, 0, 2}, // -6 + { 2, 23, 128, L"bt4", 3, 0, 2}, // -7 + { 2, 24, 255, L"bt4", 3, 0, 2}, // -8 + { 2, 25, 255, L"bt4", 3, 0, 2}, // -9 +}; + +struct extension_pair { + char *from; + char *to; +}; + +const extension_pair known_extensions[] = { + { ".lzma", "" }, + { ".tlz", ".tar" }, + { NULL, NULL } +}; + +/* Sorry, I just happen to like enumerations. */ +enum PROGRAM_MODE { + PM_COMPRESS = 0, + PM_DECOMPRESS, + PM_TEST, + PM_HELP, + PM_LICENSE, + PM_VERSION +}; + +enum { + STATUS_OK = 0, + STATUS_ERROR = 1, + STATUS_WARNING = 2 +}; + +/* getopt options. */ +/* struct option { name, has_arg, flag, val } */ +const struct option long_options[] = { + { "stdout", 0, 0, 'c' }, + { "decompress", 0, 0, 'd' }, + { "compress", 0, 0, 'z' }, + { "keep", 0, 0, 'k' }, + { "force", 0, 0, 'f' }, + { "test", 0, 0, 't' }, + { "suffix", 1, 0, 'S' }, + { "quiet", 0, 0, 'q' }, + { "verbose", 0, 0, 'v' }, + { "help", 0, 0, 'h' }, + { "license", 0, 0, 'L' }, + { "version", 0, 0, 'V' }, + { "fast", 0, 0, '1' }, + { "best", 0, 0, '9' }, + { 0, 0, 0, 0 } +}; + +/* getopt option string (for the above options). */ +const char option_string[] = "cdzkftS:qvhLV123456789A:D:F:"; + +/* Defaults. */ +PROGRAM_MODE program_mode = PM_COMPRESS; +int verbosity = 0; +bool stdinput = false; +bool stdoutput = false; +bool keep = false; +bool force = false; +int compression_mode = 7; +//char *suffix = strdup(".lzma"); +char *suffix = strdup(known_extensions[0].from); +lzma_option advanced_options = { -1, -1, -1, NULL, -1, -1, -1 }; + +void print_help(const char *const argv0) +{ + // Help goes to stdout while other messages go to stderr. + cout << "\nlzma " << PROGRAM_VERSION + << " " << PROGRAM_COPYRIGHT << "\n" + "Based on LZMA SDK " << LZMA_SDK_VERSION_STRING << " " + << LZMA_SDK_COPYRIGHT_STRING + << "\n\nUsage: " << argv0 + << " [flags and input files in any order]\n" +" -c --stdout output to standard output\n" +" -d --decompress force decompression\n" +" -z --compress force compression\n" +" -k --keep keep (don't delete) input files\n" +" -f --force force overwrite of output file and compress links\n" +" -t --test test compressed file integrity\n" +" -S .suf --suffix .suf use suffix .suf on compressed files\n" +" -q --quiet suppress error messages\n" +" -v --verbose be verbose\n" +" -h --help print this message\n" +" -L --license display the license information\n" +" -V --version display version numbers of LZMA SDK and lzma\n" +" -1 .. -2 fast compression\n" +" -3 .. -9 good to excellent compression. -7 is the default.\n" +" --fast alias for -1\n" +" --best alias for -9 (usually *not* what you want)\n\n" +" Memory usage depends a lot on the chosen compression mode -1 .. -9.\n" +" See the man page lzma(1) for details.\n\n"; +} + +void print_license(void) +{ + cout << "\n LZMA command line tool " << PROGRAM_VERSION << " - " + << PROGRAM_COPYRIGHT + << "\n LZMA SDK " << LZMA_SDK_VERSION_STRING << " - " + << LZMA_SDK_COPYRIGHT_STRING + << "\n This program is a part of the LZMA utils package.\n" + " http://tukaani.org/lzma/\n\n" +" This program is free software; you can redistribute it and/or\n" +" modify it under the terms of the GNU General Public License\n" +" as published by the Free Software Foundation; either version 2\n" +" of the License, or (at your option) any later version.\n" +"\n" +" This program is distributed in the hope that it will be useful,\n" +" but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +" GNU General Public License for more details.\n" +"\n"; +} + +void print_version(void) +{ + cout << "LZMA command line tool " << PROGRAM_VERSION << "\n" + << "LZMA SDK " << LZMA_SDK_VERSION_STRING << "\n"; +} + +short str2int (const char *str, const int &min, const int &max) +{ + int value = -1; + char *endptr = NULL; + if (str == NULL || str[0] == '\0') + throw ArgumentException("Invalid integer option"); + value = strtol (str, &endptr, 10); + if (*endptr != '\0' || value < min || value > max) + throw ArgumentException("Invalid integer option"); + return value; +} + +void parse_options(int argc, char **argv, stringVector &filenames) +{ + /* Snatched from getopt(3). */ + int c; + + /* Check how we were called */ + { + char *p = strrchr (argv[0], '/'); // Remove path prefix, if any + if (p++ == NULL) + p = argv[0]; + if (strstr (p, "un") != NULL) { + program_mode = PM_DECOMPRESS; + } else if (strstr (p, "cat") != NULL) { + program_mode = PM_DECOMPRESS; + stdoutput = true; + } + } + + while (-1 != (c = getopt_long(argc, argv, option_string, + long_options, NULL))) { + switch (c) { + // stdout + case 'c': + stdoutput = true; + break; + + // decompress + case 'd': + program_mode = PM_DECOMPRESS; + break; + + // compress + case 'z': + program_mode = PM_COMPRESS; + break; + + // keep + case 'k': + keep = true; + break; + + // force + case 'f': + force = true; + break; + + // test + case 't': + program_mode = PM_TEST; + break; + + // suffix + case 'S': + if (optarg) { + free(suffix); + suffix = strdup(optarg); + } + break; + + // quiet + case 'q': + verbosity = 0; + break; + + // verbose + case 'v': + verbosity++; + break; + + // help + case 'h': + program_mode = PM_HELP; + break; + + // license + case 'L': + program_mode = PM_LICENSE; + break; + + // version + case 'V': + program_mode = PM_VERSION; + break; + + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': + compression_mode = c - '0'; + break; + + // Advanced options // + // Compression mode + case 'A': + advanced_options.compression_mode = + str2int (optarg, 0, 2); + break; + + // Dictionary size + case 'D': + advanced_options.dictionary = + str2int (optarg, 0, 28); + break; + + // Fast bytes + case 'F': + advanced_options.fast_bytes = + str2int (optarg, 0, 273); + break; + + default: + throw ArgumentException(""); + break; + } // switch(c) + } // while(1) + + for (int i = optind; i < argc; i++) { + if (strcmp("-", argv[i]) == 0) + continue; + filenames.push_back(argv[i]); + } +} // parse_options + +void set_encoder_properties(NCompress::NLzma::CEncoder *encoder, + lzma_option &opt) +{ + /* Almost verbatim from LzmaAlone.cpp. */ + PROPID propIDs[] = + { + NCoderPropID::kDictionarySize, + NCoderPropID::kPosStateBits, + NCoderPropID::kLitContextBits, + NCoderPropID::kLitPosBits, + NCoderPropID::kAlgorithm, + NCoderPropID::kNumFastBytes, + NCoderPropID::kMatchFinder, + NCoderPropID::kEndMarker + }; + const int kNumProps = sizeof(propIDs) / sizeof(propIDs[0]); +#define VALUE(x) (advanced_options.x >= 0 ? advanced_options.x : opt.x) + PROPVARIANT properties[kNumProps]; + for (int p = 0; p < 6; p++) + properties[p].vt = VT_UI4; + properties[0].ulVal = UInt32(1 << VALUE (dictionary)); + properties[1].ulVal = UInt32(VALUE (pos_bits)); + properties[2].ulVal = UInt32(VALUE (literal_context_bits)); + properties[3].ulVal = UInt32(VALUE (literal_pos_bits)); + properties[4].ulVal = UInt32(VALUE (compression_mode)); + properties[5].ulVal = UInt32(VALUE (fast_bytes)); +#undef VALUE + + properties[6].vt = VT_BSTR; + properties[6].bstrVal = (BSTR)opt.match_finder; + + properties[7].vt = VT_BOOL; + properties[7].boolVal = stdinput ? VARIANT_TRUE : VARIANT_FALSE; + + if (encoder->SetCoderProperties(propIDs, properties, kNumProps) != S_OK) + throw Exception("SetCoderProperties() error"); +} + +void encode(NCompress::NLzma::CEncoder *encoderSpec, + CMyComPtr inStream, + CMyComPtr outStream, + lzma_option encoder_options, + UInt64 fileSize) +{ + set_encoder_properties(encoderSpec, encoder_options); + + encoderSpec->WriteCoderProperties(outStream); + + for (int i = 0; i < 8; i++) + { + Byte b = Byte(fileSize >> (8 * i)); + if (outStream->Write(&b, sizeof(b), 0) != S_OK) + throw Exception("Write error while encoding"); + } + + HRESULT result = encoderSpec->Code(inStream, outStream, 0, 0, 0); + + if (result == E_OUTOFMEMORY) + throw Exception("Cannot allocate memory"); + else if (result != S_OK) { + char buffer[33]; + snprintf(buffer, 33, "%d", (unsigned int)result); + throw Exception(string("Encoder error: ") + buffer); + } +} + +void decode(NCompress::NLzma::CDecoder *decoderSpec, + CMyComPtr inStream, + CMyComPtr outStream) +{ + const UInt32 kPropertiesSize = 5; + Byte properties[kPropertiesSize]; + UInt32 processedSize; + UInt64 fileSize = 0; + + if (inStream->Read(properties, kPropertiesSize, &processedSize) != S_OK) + throw Exception("Read error"); + if (processedSize != kPropertiesSize) + throw Exception("Read error"); + if (decoderSpec->SetDecoderProperties2(properties, kPropertiesSize) != S_OK) + throw Exception("SetDecoderProperties() error"); + + for (int i = 0; i < 8; i++) + { + Byte b; + + if (inStream->Read(&b, sizeof(b), &processedSize) != S_OK) + throw Exception("Read error"); + if (processedSize != 1) + throw Exception("Read error"); + + fileSize |= ((UInt64)b) << (8 * i); + } + + if (decoderSpec->Code(inStream, outStream, 0, &fileSize, 0) != S_OK) + throw Exception("Decoder error"); +} + +int open_instream(const string infile, + CMyComPtr &inStream, + UInt64 &fileSize) +{ + CInFileStream *inStreamSpec = new CInFileStream; + inStream = inStreamSpec; + if (!inStreamSpec->Open(infile.c_str())) + throw Exception("Cannot open input file " + infile); + + inStreamSpec->File.GetLength(fileSize); + + return inStreamSpec->File.GetHandle(); +} + +int open_outstream(const string outfile, + CMyComPtr &outStream) +{ + COutFileStream *outStreamSpec = new COutFileStream; + outStream = outStreamSpec; + + bool open_by_force = (program_mode == PM_TEST) | force; + + if (!outStreamSpec->Create(outfile.c_str(), open_by_force)) + throw Exception("Cannot open output file " + outfile); + + return outStreamSpec->File.GetHandle(); +} + +double get_ratio(int inhandle, int outhandle) +{ + struct stat in_stats, out_stats; + fstat(inhandle, &in_stats); + fstat(outhandle, &out_stats); + + return (double)out_stats.st_size / (double)in_stats.st_size; +} + +mode_t get_file_mode(string filename) +{ + struct stat in_stat; + lstat(filename.c_str(), &in_stat); + + return in_stat.st_mode; +} + +bool string_ends_with(string str, string ending) +{ + return equal(ending.rbegin(), ending.rend(), str.rbegin()); +} + +bool extension_is_known(string filename) +{ + bool known_format = false; + extension_pair extension; int i = 1; + + extension = known_extensions[0]; + while (extension.from != NULL) { + if (string_ends_with(filename, extension.from)) { + known_format = true; + break; + } + extension = known_extensions[i]; + i++; + } + + if (!known_format) { + if (!string_ends_with(filename, suffix)) { + return false; + } + } + + return true; +} + +string replace_extension(string filename) +{ + int suffix_starts_at = filename.length() - strlen (suffix); + string from_suffix = filename.substr(suffix_starts_at, strlen (suffix)); + string ret = filename.substr(0, suffix_starts_at); + extension_pair extension; int i = 1; + + extension = known_extensions[0]; + while (extension.from != NULL) { + if (from_suffix.compare(extension.from) == 0) { + ret += extension.to; + break; + } + + extension = known_extensions[i]; + i++; + } + + return ret; +} + +string pretty_print_status(string filename, string output_filename, + string ratio) +{ + string ret = ""; + + ret += filename; + ret += ":\t "; + + if (program_mode == PM_TEST) { + ret += "decoded succesfully"; + + return ret; + } + + if (!stdinput && !stdoutput) { + ret += ratio; + ret += " -- "; + } + + if (program_mode == PM_COMPRESS) { + if (keep) { + ret += "encoded succesfully"; + + return ret; + } + + ret += "replaced with "; + ret += output_filename; + + return ret; + } + + if (program_mode == PM_DECOMPRESS) { + if (keep) { + ret += "decoded succesfully"; + + return ret; + } + + ret += "replaced with "; + ret += output_filename; + + return ret; + } + + return ret; +} + +static string archive_name; // I know, it is crude, but I haven't found any other + // way then making a global variable to transfer filename to handler + +void signal_handler (int signum) +{ + unlink (archive_name.c_str()); // deleting + signal (signum, SIG_DFL); // we return the default function to used signal + kill (getpid(), signum); // and then send this signal to the process again +} + +} // namespace lzma + + +int main(int argc, char **argv) +{ + using namespace lzma; + using std::cerr; + + stringVector filenames; + + signal (SIGTERM,signal_handler); + signal (SIGHUP,signal_handler); + signal (SIGINT,signal_handler); + + try { + parse_options(argc, argv, filenames); + } + catch (...) { + return STATUS_ERROR; + } + + if (program_mode == PM_HELP) { + print_help(argv[0]); + return STATUS_OK; + } + else if (program_mode == PM_LICENSE) { + print_license(); + return STATUS_OK; + } + else if (program_mode == PM_VERSION) { + print_version(); + return STATUS_OK; + } + + if (filenames.empty()) { + stdinput = true; + stdoutput = true; + + /* FIXME: get rid of this */ + filenames.push_back("-"); + } + + /* Protection: always create new files with 0600 in order to prevent + * outsiders from reading incomplete data. */ + umask(0077); + + bool warning = false; + + for (int i = 0; i < (int)filenames.size(); i++) { + CMyComPtr inStream; + CMyComPtr outStream; + UInt64 fileSize = 0; + int inhandle = 0, outhandle = 0; + string output_filename; + + if (stdinput) { + inStream = new CStdInFileStream; + MY_SET_BINARY_MODE(stdin); + fileSize = (UInt64)(Int64)-1; + + inhandle = STDIN_FILENO; + + outStream = new CStdOutFileStream; + MY_SET_BINARY_MODE(stdout); + + outhandle = STDOUT_FILENO; + } + else { + mode_t infile_mode = get_file_mode(filenames[i]); + if (!S_ISREG(infile_mode)) { + if (S_ISDIR(infile_mode)) { + warning = true; + cerr << argv[0] << ": " << filenames[i] << ": " + << "cowardly refusing to work on directory" + << endl; + + continue; + } + else if (S_ISLNK(infile_mode)) { + if (!stdoutput && !force) { + warning = true; + + cerr << argv[0] << ": " << filenames[i] << ": " + << "cowardly refusing to work on symbolic link " + << "(use --force to force encoding or decoding)" + << endl; + + continue; + } + } + else { + warning = true; + + cerr << argv[0] << ": " << filenames[i] << ": " + << "doesn't exist or is not a regular file" + << endl; + + continue; + } + } + + // Test if the file already ends with *suffix. + if (program_mode == PM_COMPRESS && !force + && string_ends_with(filenames[i], + suffix)) { + warning = true; + + cerr << filenames[i] << " already has " + << suffix << " suffix -- unchanged\n"; + + continue; + } + + // Test if the file extension is known. + if (program_mode == PM_DECOMPRESS + && !extension_is_known(filenames[i])) { + warning = true; + + cerr << filenames[i] << ": " + << " unknown suffix -- unchanged" + << endl; + + continue; + } + + try { + inhandle = open_instream(filenames[i], inStream, fileSize); + } + catch (Exception e) { + cerr << argv[0] << ": " << e.what() << endl; + return STATUS_ERROR; + } + + if (stdoutput) { + outStream = new CStdOutFileStream; + MY_SET_BINARY_MODE(stdout); + + outhandle = STDOUT_FILENO; + } + else { + /* Testing mode is nothing else but decoding + * and throwing away the result. */ + if (program_mode == PM_TEST) + output_filename = "/dev/null"; + else if (program_mode == PM_DECOMPRESS) + output_filename = replace_extension(filenames[i]); + else + output_filename = filenames[i] + + suffix; + archive_name = output_filename; + + try { + outhandle = open_outstream(output_filename, outStream); + } + catch (Exception e) { + cerr << argv[0] << ": " << e.what() << endl; + return STATUS_ERROR; + } + } + + } + + // Unless --force is specified, do not read/write compressed + // data from/to a terminal. + if (!force) { + if (program_mode == PM_COMPRESS && isatty(outhandle)) { + cerr << argv[0] << ": compressed data not " + "written to a terminal. Use " + "-f to force compression.\n" + << argv[0] << ": For help, type: " + << argv[0] << " -h\n"; + return STATUS_ERROR; + } else if (program_mode == PM_DECOMPRESS + && isatty(inhandle)) { + cerr << argv[0] << ": compressed data not " + "read from a terminal. Use " + "-f to force decompression.\n" + << argv[0] << ": For help, type: " + << argv[0] << " -h\n"; + return STATUS_ERROR; + } + } + + if (program_mode == PM_COMPRESS) { + NCompress::NLzma::CEncoder *encoderSpec = + new NCompress::NLzma::CEncoder; + + lzma_option options = option_mapping[compression_mode]; + + try { + encode(encoderSpec, inStream, outStream, options, fileSize); + } + catch (Exception e) { + cerr << argv[0] << ": " << e.what() << endl; + unlink(output_filename.c_str()); + delete(encoderSpec); + + return STATUS_ERROR; + } + + delete(encoderSpec); + } + else { // PM_DECOMPRESS | PM_TEST + NCompress::NLzma::CDecoder *decoderSpec = + new NCompress::NLzma::CDecoder; + + try { + decode(decoderSpec, inStream, outStream); + } + catch (Exception e) { + cerr << argv[0] << ": " << e.what() << endl; + unlink(output_filename.c_str()); + delete(decoderSpec); + + return STATUS_ERROR; + } + + delete(decoderSpec); + } + + /* Set permissions and owners. */ + if ( (program_mode == PM_COMPRESS || program_mode == PM_DECOMPRESS ) + && (!stdinput && !stdoutput) ) { + + int ret = 0; + struct stat file_stats; + ret = fstat(inhandle, &file_stats); + + ret = fchmod(outhandle, file_stats.st_mode); + ret = fchown(outhandle, file_stats.st_uid, file_stats.st_gid); + // We need to call fchmod() again, since otherwise the SUID bits + // are lost. + ret = fchmod(outhandle, file_stats.st_mode); + + struct timeval file_times[2]; + // Access time + file_times[0].tv_sec = file_stats.st_atime; + file_times[0].tv_usec = 0; + // Modification time + file_times[1].tv_sec = file_stats.st_mtime; + file_times[1].tv_usec = 0; + + ret = futimes(outhandle, file_times); + + if (!keep) + unlink(filenames[i].c_str()); + } + + if (verbosity > 0) { + if (stdoutput) { + cerr << filenames[i] << ":\t "; + cerr << "decoded succesfully" + << endl; + } + + else { + char buf[10] = { 0 }; + + if (program_mode == PM_DECOMPRESS) + snprintf(buf, 10, "%.2f%%", + (1 - get_ratio(outhandle, inhandle)) * 100); + if (program_mode == PM_COMPRESS) + snprintf(buf, 10, "%.2f%%", + (1 - get_ratio(inhandle, outhandle)) * 100); + + string ratio = buf; + cerr << pretty_print_status(filenames[i], output_filename, + ratio) + << endl; + } + } + } + + if (warning) + return STATUS_WARNING; + + return STATUS_OK; +} + diff --git a/host_util/lzma/makefile.gcc b/host_util/lzma/makefile.gcc new file mode 100644 index 0000000..e1c0077 --- /dev/null +++ b/host_util/lzma/makefile.gcc @@ -0,0 +1,80 @@ +PROG = lzma +CXX = g++ -O2 -Wall -Wno-write-strings -Wno-unused-variable -Wno-unused-but-set-variable +CXX_C = gcc -O2 -Wall -Wno-write-strings -Wno-unused-variable -Wno-unused-but-set-variable +LIB = -lm +RM = rm -f +CFLAGS = -c -I ../../ -D_FILE_OFFSET_BITS=64 -DPACKAGE_VERSION="\"4.32.0beta3\"" + +OBJS = \ + C_FileIO.o \ + CRC.o \ + Alloc.o \ + FileStreams.o \ + StreamUtils.o \ + InBuffer.o \ + OutBuffer.o \ + LzmaDecoder.o \ + StringConvert.o \ + StringToInt.o \ + LzmaEncoder.o \ + LzmaDec.o \ + LzmaEnc.o \ + LzFind.o \ + 7zCrc.o \ + lzmp.o + +all: $(PROG) + +$(PROG): $(OBJS) + $(CXX) -o $(PROG) $(LDFLAGS) $(OBJS) $(LIB) + +lzmp.o: lzmp.cpp + $(CXX) $(CFLAGS) lzmp.cpp + +LzmaDecoder.o: LzmaDecoder.cpp + $(CXX) $(CFLAGS) LzmaDecoder.cpp + +LzmaEncoder.o: LzmaEncoder.cpp + $(CXX) $(CFLAGS) LzmaEncoder.cpp + +InBuffer.o: InBuffer.cpp + $(CXX) $(CFLAGS) InBuffer.cpp + +OutBuffer.o: OutBuffer.cpp + $(CXX) $(CFLAGS) OutBuffer.cpp + +FileStreams.o: FileStreams.cpp + $(CXX) $(CFLAGS) FileStreams.cpp + +StreamUtils.o: StreamUtils.cpp + $(CXX) $(CFLAGS) StreamUtils.cpp + +C_FileIO.o: Common/C_FileIO.cpp + $(CXX) $(CFLAGS) Common/C_FileIO.cpp + +CRC.o: Common/CRC.cpp + $(CXX) $(CFLAGS) Common/CRC.cpp + +StringConvert.o: Common/StringConvert.cpp + $(CXX) $(CFLAGS) Common/StringConvert.cpp + +StringToInt.o: Common/StringToInt.cpp + $(CXX) $(CFLAGS) Common/StringToInt.cpp + +7zCrc.o: C/7zCrc.c + $(CXX_C) $(CFLAGS) C/7zCrc.c + +Alloc.o: C/Alloc.c + $(CXX_C) $(CFLAGS) C/Alloc.c + +LzFind.o: C/LzFind.c + $(CXX_C) $(CFLAGS) C/LzFind.c + +LzmaDec.o: C/LzmaDec.c + $(CXX_C) $(CFLAGS) C/LzmaDec.c + +LzmaEnc.o: C/LzmaEnc.c + $(CXX_C) $(CFLAGS) C/LzmaEnc.c + +clean: + -$(RM) $(PROG) $(OBJS) diff --git a/u-boot/Makefile b/u-boot/Makefile index be5a485..f25fdfb 100644 --- a/u-boot/Makefile +++ b/u-boot/Makefile @@ -16,7 +16,7 @@ VERSION_FILE = include/version_autogenerated.h MKCONFIG = $(BUILD_TOPDIR)/u-boot/mkconfig MKIMAGE = $(BUILD_TOPDIR)/u-boot/tools/mkimage -LZMA = $(BUILD_TOPDIR)/host_util/$(HOSTOS)-$(HOSTARCH)/lzma +LZMA = $(BUILD_TOPDIR)/host_util/lzma/lzma # Show in version string if we are not building from clean repository ifeq ($(ISREPODIRTY),1) @@ -304,7 +304,7 @@ tuboot.bin: System.map bootstrap.bin u-boot.lzimg @cat u-boot.lzimg >> $@ $(call echo_size, Total image size,$@) -u-boot.lzimg: $(obj)u-boot.bin System.map +u-boot.lzimg: lzma_host $(obj)u-boot.bin System.map @echo @rm -rf u-boot.bin.lzma @$(call echo_green,Compressing U-Boot image $<...) @@ -331,6 +331,11 @@ bootstrap: depend version $(SUBDIRS) $(OBJS_BOOTSTRAP) $(LIBS_BOOTSTRAP) $(LIBS_ $(LIBS_BOOTSTRAP): $(MAKE) -C `dirname $@` + +lzma_host: + @echo + $(call echo_green,Building lzma host utility...) + $(MAKE) -C $(BUILD_TOPDIR)/host_util/lzma -f makefile.gcc all endif # ifdef COMPRESSED_UBOOT version: @@ -551,7 +556,11 @@ clean: @rm -f lib_bootstrap/*.a @rm -f bootstrap bootstrap.bin tuboot.bin u-boot.lzimg u-boot.bin.lzma bootstrap.map -clobber: clean +lzma_host_clean: + @$(call echo_green,Removing lzma host utility...) + @$(MAKE) -C $(BUILD_TOPDIR)/host_util/lzma -f makefile.gcc clean + +clobber: lzma_host_clean clean @$(call echo_green,Making $@...) @find . -type f \( -name .depend \ -o -name '*.srec' -o -name '*.bin' -o -name u-boot.img \) \ -- 2.25.1