seven-zip 1.4.2 → 1.7.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (887) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +49 -0
  3. data/.github/workflows/release.yml +21 -0
  4. data/README.md +13 -2
  5. data/Rakefile +2 -0
  6. data/ext/p7zip/C/7zBuf.h +4 -8
  7. data/ext/p7zip/C/7zBuf2.c +9 -3
  8. data/ext/p7zip/C/7zCrc.c +84 -32
  9. data/ext/p7zip/C/7zCrc.h +2 -2
  10. data/ext/p7zip/C/7zCrcOpt.c +89 -8
  11. data/ext/p7zip/C/7zStream.c +4 -2
  12. data/ext/p7zip/C/{Types.h → 7zTypes.h} +8 -6
  13. data/ext/p7zip/C/7zVersion.h +21 -6
  14. data/ext/p7zip/C/Aes.c +28 -15
  15. data/ext/p7zip/C/Aes.h +2 -2
  16. data/ext/p7zip/C/Alloc.c +60 -12
  17. data/ext/p7zip/C/Alloc.h +6 -7
  18. data/ext/p7zip/C/Bcj2.c +256 -0
  19. data/ext/p7zip/C/Bcj2.h +146 -0
  20. data/ext/p7zip/C/Bcj2Enc.c +312 -0
  21. data/ext/p7zip/C/Blake2.h +48 -0
  22. data/ext/p7zip/C/Blake2s.c +244 -0
  23. data/ext/p7zip/C/Bra.c +2 -0
  24. data/ext/p7zip/C/Bra.h +4 -8
  25. data/ext/p7zip/C/Bra86.c +48 -51
  26. data/ext/p7zip/C/BraIA64.c +3 -1
  27. data/ext/p7zip/C/BwtSort.c +3 -4
  28. data/ext/p7zip/C/BwtSort.h +4 -8
  29. data/ext/p7zip/C/Compiler.h +32 -0
  30. data/ext/p7zip/C/CpuArch.c +50 -7
  31. data/ext/p7zip/C/CpuArch.h +112 -41
  32. data/ext/p7zip/C/Delta.c +2 -0
  33. data/ext/p7zip/C/Delta.h +4 -8
  34. data/ext/p7zip/C/HuffEnc.c +8 -6
  35. data/ext/p7zip/C/HuffEnc.h +4 -8
  36. data/ext/p7zip/C/LzFind.c +391 -108
  37. data/ext/p7zip/C/LzFind.h +20 -18
  38. data/ext/p7zip/C/LzFindMt.c +100 -90
  39. data/ext/p7zip/C/LzFindMt.h +4 -8
  40. data/ext/p7zip/C/LzHash.h +23 -20
  41. data/ext/p7zip/C/Lzma2Dec.c +48 -26
  42. data/ext/p7zip/C/Lzma2Dec.h +4 -8
  43. data/ext/p7zip/C/Lzma2Enc.c +58 -15
  44. data/ext/p7zip/C/Lzma2Enc.h +3 -7
  45. data/ext/p7zip/C/{LzmaUtil/Lzma86Enc.h → Lzma86.h} +47 -14
  46. data/ext/p7zip/C/{LzmaUtil/Lzma86Dec.c → Lzma86Dec.c} +6 -13
  47. data/ext/p7zip/C/{LzmaUtil/Lzma86Enc.c → Lzma86Enc.c} +8 -15
  48. data/ext/p7zip/C/LzmaDec.c +180 -79
  49. data/ext/p7zip/C/LzmaDec.h +4 -8
  50. data/ext/p7zip/C/LzmaEnc.c +230 -147
  51. data/ext/p7zip/C/LzmaEnc.h +6 -8
  52. data/ext/p7zip/C/MtCoder.c +3 -3
  53. data/ext/p7zip/C/Ppmd.h +5 -5
  54. data/ext/p7zip/C/Ppmd7.c +9 -7
  55. data/ext/p7zip/C/Ppmd7.h +3 -3
  56. data/ext/p7zip/C/Ppmd7Dec.c +2 -0
  57. data/ext/p7zip/C/Ppmd7Enc.c +4 -2
  58. data/ext/p7zip/C/Ppmd8.c +34 -31
  59. data/ext/p7zip/C/Ppmd8.h +5 -1
  60. data/ext/p7zip/C/Ppmd8Dec.c +2 -0
  61. data/ext/p7zip/C/Ppmd8Enc.c +2 -0
  62. data/ext/p7zip/C/Precomp.h +10 -0
  63. data/ext/p7zip/C/RotateDefs.h +11 -1
  64. data/ext/p7zip/C/Sha1.c +340 -0
  65. data/ext/p7zip/C/Sha1.h +38 -0
  66. data/ext/p7zip/C/Sha256.c +107 -63
  67. data/ext/p7zip/C/Sha256.h +2 -2
  68. data/ext/p7zip/C/Sort.c +59 -11
  69. data/ext/p7zip/C/Sort.h +8 -10
  70. data/ext/p7zip/C/Threads.h +1 -1
  71. data/ext/p7zip/C/Xz.c +7 -5
  72. data/ext/p7zip/C/Xz.h +40 -17
  73. data/ext/p7zip/C/XzCrc64.c +69 -16
  74. data/ext/p7zip/C/XzCrc64.h +2 -2
  75. data/ext/p7zip/C/XzCrc64Opt.c +69 -0
  76. data/ext/p7zip/C/XzDec.c +93 -55
  77. data/ext/p7zip/C/XzEnc.c +206 -165
  78. data/ext/p7zip/C/XzEnc.h +23 -9
  79. data/ext/p7zip/C/XzIn.c +50 -43
  80. data/ext/p7zip/CPP/7zip/Archive/7z/7zCompressionMode.h +37 -13
  81. data/ext/p7zip/CPP/7zip/Archive/7z/7zDecode.cpp +392 -181
  82. data/ext/p7zip/CPP/7zip/Archive/7z/7zDecode.h +29 -29
  83. data/ext/p7zip/CPP/7zip/Archive/7z/7zEncode.cpp +424 -212
  84. data/ext/p7zip/CPP/7zip/Archive/7z/7zEncode.h +53 -16
  85. data/ext/p7zip/CPP/7zip/Archive/7z/7zExtract.cpp +312 -174
  86. data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderInStream.cpp +74 -61
  87. data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderInStream.h +22 -19
  88. data/ext/p7zip/CPP/7zip/Archive/7z/7zHandler.cpp +505 -232
  89. data/ext/p7zip/CPP/7zip/Archive/7z/7zHandler.h +70 -16
  90. data/ext/p7zip/CPP/7zip/Archive/7z/7zHandlerOut.cpp +602 -172
  91. data/ext/p7zip/CPP/7zip/Archive/7z/7zHeader.cpp +5 -0
  92. data/ext/p7zip/CPP/7zip/Archive/7z/7zHeader.h +54 -3
  93. data/ext/p7zip/CPP/7zip/Archive/7z/7zIn.cpp +981 -616
  94. data/ext/p7zip/CPP/7zip/Archive/7z/7zIn.h +275 -89
  95. data/ext/p7zip/CPP/7zip/Archive/7z/7zItem.h +77 -162
  96. data/ext/p7zip/CPP/7zip/Archive/7z/7zOut.cpp +288 -238
  97. data/ext/p7zip/CPP/7zip/Archive/7z/7zOut.h +189 -20
  98. data/ext/p7zip/CPP/7zip/Archive/7z/7zProperties.cpp +59 -49
  99. data/ext/p7zip/CPP/7zip/Archive/7z/7zRegister.cpp +12 -9
  100. data/ext/p7zip/CPP/7zip/Archive/7z/7zSpecStream.cpp +4 -6
  101. data/ext/p7zip/CPP/7zip/Archive/7z/7zSpecStream.h +5 -5
  102. data/ext/p7zip/CPP/7zip/Archive/7z/7zUpdate.cpp +1743 -447
  103. data/ext/p7zip/CPP/7zip/Archive/7z/7zUpdate.h +61 -10
  104. data/ext/p7zip/CPP/7zip/Archive/ApmHandler.cpp +84 -120
  105. data/ext/p7zip/CPP/7zip/Archive/ArHandler.cpp +854 -0
  106. data/ext/p7zip/CPP/7zip/Archive/ArchiveExports.cpp +48 -32
  107. data/ext/p7zip/CPP/7zip/Archive/ArjHandler.cpp +519 -340
  108. data/ext/p7zip/CPP/7zip/Archive/Bz2Handler.cpp +223 -203
  109. data/ext/p7zip/CPP/7zip/Archive/Cab/CabBlockInStream.cpp +50 -139
  110. data/ext/p7zip/CPP/7zip/Archive/Cab/CabBlockInStream.h +17 -18
  111. data/ext/p7zip/CPP/7zip/Archive/Cab/CabHandler.cpp +566 -234
  112. data/ext/p7zip/CPP/7zip/Archive/Cab/CabHandler.h +10 -1
  113. data/ext/p7zip/CPP/7zip/Archive/Cab/CabHeader.cpp +2 -2
  114. data/ext/p7zip/CPP/7zip/Archive/Cab/CabHeader.h +12 -15
  115. data/ext/p7zip/CPP/7zip/Archive/Cab/CabIn.cpp +341 -122
  116. data/ext/p7zip/CPP/7zip/Archive/Cab/CabIn.h +81 -66
  117. data/ext/p7zip/CPP/7zip/Archive/Cab/CabItem.h +17 -14
  118. data/ext/p7zip/CPP/7zip/Archive/Cab/CabRegister.cpp +10 -4
  119. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHandler.cpp +190 -83
  120. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHandler.h +7 -1
  121. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmIn.cpp +292 -174
  122. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmIn.h +73 -47
  123. data/ext/p7zip/CPP/7zip/Archive/ComHandler.cpp +886 -0
  124. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2.cpp +994 -71
  125. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2.h +364 -101
  126. data/ext/p7zip/CPP/7zip/Archive/Common/DummyOutStream.cpp +7 -12
  127. data/ext/p7zip/CPP/7zip/Archive/Common/DummyOutStream.h +4 -3
  128. data/ext/p7zip/CPP/7zip/Archive/Common/FindSignature.cpp +6 -6
  129. data/ext/p7zip/CPP/7zip/Archive/Common/FindSignature.h +2 -2
  130. data/ext/p7zip/CPP/7zip/Archive/Common/HandlerOut.cpp +77 -543
  131. data/ext/p7zip/CPP/7zip/Archive/Common/HandlerOut.h +31 -51
  132. data/ext/p7zip/CPP/7zip/Archive/Common/InStreamWithCRC.cpp +18 -14
  133. data/ext/p7zip/CPP/7zip/Archive/Common/ItemNameUtils.cpp +34 -7
  134. data/ext/p7zip/CPP/7zip/Archive/Common/ItemNameUtils.h +5 -2
  135. data/ext/p7zip/CPP/7zip/Archive/Common/MultiStream.cpp +25 -24
  136. data/ext/p7zip/CPP/7zip/Archive/Common/MultiStream.h +8 -3
  137. data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithCRC.h +1 -0
  138. data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp +2 -2
  139. data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithSha1.h +5 -5
  140. data/ext/p7zip/CPP/7zip/Archive/Common/ParseProperties.cpp +0 -174
  141. data/ext/p7zip/CPP/7zip/Archive/Common/ParseProperties.h +2 -14
  142. data/ext/p7zip/CPP/7zip/Archive/CpioHandler.cpp +506 -335
  143. data/ext/p7zip/CPP/7zip/Archive/CramfsHandler.cpp +227 -84
  144. data/ext/p7zip/CPP/7zip/Archive/DeflateProps.cpp +0 -115
  145. data/ext/p7zip/CPP/7zip/Archive/DeflateProps.h +0 -29
  146. data/ext/p7zip/CPP/7zip/Archive/DllExports2.cpp +63 -17
  147. data/ext/p7zip/CPP/7zip/Archive/DmgHandler.cpp +1007 -339
  148. data/ext/p7zip/CPP/7zip/Archive/ElfHandler.cpp +618 -177
  149. data/ext/p7zip/CPP/7zip/Archive/ExtHandler.cpp +2867 -0
  150. data/ext/p7zip/CPP/7zip/Archive/FatHandler.cpp +136 -76
  151. data/ext/p7zip/CPP/7zip/Archive/FlvHandler.cpp +132 -150
  152. data/ext/p7zip/CPP/7zip/Archive/GptHandler.cpp +405 -0
  153. data/ext/p7zip/CPP/7zip/Archive/GzHandler.cpp +560 -214
  154. data/ext/p7zip/CPP/7zip/Archive/HandlerCont.cpp +288 -0
  155. data/ext/p7zip/CPP/7zip/Archive/HandlerCont.h +116 -0
  156. data/ext/p7zip/CPP/7zip/Archive/HfsHandler.cpp +1880 -0
  157. data/ext/p7zip/CPP/7zip/Archive/IArchive.h +415 -51
  158. data/ext/p7zip/CPP/7zip/Archive/IhexHandler.cpp +497 -0
  159. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHandler.cpp +158 -71
  160. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHandler.h +2 -1
  161. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHeader.cpp +0 -9
  162. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHeader.h +8 -5
  163. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoIn.cpp +311 -91
  164. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoIn.h +101 -83
  165. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoItem.h +48 -39
  166. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoRegister.cpp +12 -4
  167. data/ext/p7zip/CPP/7zip/Archive/LzhHandler.cpp +127 -114
  168. data/ext/p7zip/CPP/7zip/Archive/LzmaHandler.cpp +264 -121
  169. data/ext/p7zip/CPP/7zip/Archive/MachoHandler.cpp +402 -242
  170. data/ext/p7zip/CPP/7zip/Archive/MbrHandler.cpp +56 -114
  171. data/ext/p7zip/CPP/7zip/Archive/MslzHandler.cpp +230 -90
  172. data/ext/p7zip/CPP/7zip/Archive/MubHandler.cpp +129 -153
  173. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisDecode.cpp +179 -58
  174. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisDecode.h +36 -7
  175. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisHandler.cpp +407 -237
  176. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisHandler.h +9 -16
  177. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisIn.cpp +5535 -1098
  178. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisIn.h +345 -81
  179. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisRegister.cpp +11 -4
  180. data/ext/p7zip/CPP/7zip/Archive/NtfsHandler.cpp +1424 -434
  181. data/ext/p7zip/CPP/7zip/Archive/PeHandler.cpp +1831 -521
  182. data/ext/p7zip/CPP/7zip/Archive/PpmdHandler.cpp +50 -35
  183. data/ext/p7zip/CPP/7zip/Archive/QcowHandler.cpp +615 -0
  184. data/ext/p7zip/CPP/7zip/Archive/Rar/Rar5Handler.cpp +2746 -0
  185. data/ext/p7zip/CPP/7zip/Archive/Rar/Rar5Handler.h +411 -0
  186. data/ext/p7zip/CPP/7zip/Archive/Rar/RarHandler.cpp +1241 -355
  187. data/ext/p7zip/CPP/7zip/Archive/Rar/RarHandler.h +70 -20
  188. data/ext/p7zip/CPP/7zip/Archive/Rar/RarHeader.h +38 -34
  189. data/ext/p7zip/CPP/7zip/Archive/Rar/RarItem.h +34 -16
  190. data/ext/p7zip/CPP/7zip/Archive/Rar/RarVol.h +129 -0
  191. data/ext/p7zip/CPP/7zip/Archive/RpmHandler.cpp +641 -194
  192. data/ext/p7zip/CPP/7zip/Archive/SplitHandler.cpp +174 -181
  193. data/ext/p7zip/CPP/7zip/Archive/SquashfsHandler.cpp +237 -174
  194. data/ext/p7zip/CPP/7zip/Archive/SwfHandler.cpp +471 -192
  195. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandler.cpp +350 -59
  196. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandler.h +24 -7
  197. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandlerOut.cpp +79 -27
  198. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHeader.cpp +5 -7
  199. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHeader.h +20 -44
  200. data/ext/p7zip/CPP/7zip/Archive/Tar/TarIn.cpp +279 -64
  201. data/ext/p7zip/CPP/7zip/Archive/Tar/TarIn.h +10 -1
  202. data/ext/p7zip/CPP/7zip/Archive/Tar/TarItem.h +34 -8
  203. data/ext/p7zip/CPP/7zip/Archive/Tar/TarOut.cpp +145 -87
  204. data/ext/p7zip/CPP/7zip/Archive/Tar/TarOut.h +13 -5
  205. data/ext/p7zip/CPP/7zip/Archive/Tar/TarRegister.cpp +14 -9
  206. data/ext/p7zip/CPP/7zip/Archive/Tar/TarUpdate.cpp +154 -27
  207. data/ext/p7zip/CPP/7zip/Archive/Tar/TarUpdate.h +10 -6
  208. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfHandler.cpp +53 -128
  209. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfHandler.h +6 -5
  210. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfIn.cpp +384 -119
  211. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfIn.h +40 -21
  212. data/ext/p7zip/CPP/7zip/Archive/UefiHandler.cpp +1618 -0
  213. data/ext/p7zip/CPP/7zip/Archive/VdiHandler.cpp +362 -0
  214. data/ext/p7zip/CPP/7zip/Archive/VhdHandler.cpp +438 -247
  215. data/ext/p7zip/CPP/7zip/Archive/VmdkHandler.cpp +1518 -0
  216. data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandler.cpp +837 -249
  217. data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandler.h +73 -47
  218. data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandlerOut.cpp +1614 -351
  219. data/ext/p7zip/CPP/7zip/Archive/Wim/WimIn.cpp +1519 -513
  220. data/ext/p7zip/CPP/7zip/Archive/Wim/WimIn.h +498 -139
  221. data/ext/p7zip/CPP/7zip/Archive/Wim/WimRegister.cpp +13 -9
  222. data/ext/p7zip/CPP/7zip/Archive/XarHandler.cpp +272 -128
  223. data/ext/p7zip/CPP/7zip/Archive/XzHandler.cpp +502 -253
  224. data/ext/p7zip/CPP/7zip/Archive/XzHandler.h +65 -0
  225. data/ext/p7zip/CPP/7zip/Archive/ZHandler.cpp +114 -39
  226. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipAddCommon.cpp +118 -134
  227. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipAddCommon.h +6 -0
  228. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipCompressionMode.h +40 -20
  229. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandler.cpp +541 -274
  230. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandler.h +13 -40
  231. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp +165 -254
  232. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHeader.h +70 -178
  233. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipIn.cpp +1934 -550
  234. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipIn.h +294 -63
  235. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItem.cpp +160 -86
  236. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItem.h +139 -110
  237. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipOut.cpp +177 -154
  238. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipOut.h +50 -18
  239. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipRegister.cpp +18 -9
  240. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipUpdate.cpp +367 -201
  241. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipUpdate.h +11 -10
  242. data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile +2 -319
  243. data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile.depend +0 -4962
  244. data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile.list +1004 -259
  245. data/ext/p7zip/CPP/7zip/Common/CWrappers.cpp +26 -22
  246. data/ext/p7zip/CPP/7zip/Common/CWrappers.h +19 -14
  247. data/ext/p7zip/CPP/7zip/Common/CreateCoder.cpp +298 -130
  248. data/ext/p7zip/CPP/7zip/Common/CreateCoder.h +118 -34
  249. data/ext/p7zip/CPP/7zip/Common/FilePathAutoRename.cpp +24 -28
  250. data/ext/p7zip/CPP/7zip/Common/FilePathAutoRename.h +5 -5
  251. data/ext/p7zip/CPP/7zip/Common/FileStreams.cpp +268 -65
  252. data/ext/p7zip/CPP/7zip/Common/FileStreams.h +70 -33
  253. data/ext/p7zip/CPP/7zip/Common/FilterCoder.cpp +302 -131
  254. data/ext/p7zip/CPP/7zip/Common/FilterCoder.h +141 -43
  255. data/ext/p7zip/CPP/7zip/Common/InBuffer.cpp +87 -35
  256. data/ext/p7zip/CPP/7zip/Common/InBuffer.h +54 -45
  257. data/ext/p7zip/CPP/7zip/Common/InOutTempBuffer.cpp +22 -17
  258. data/ext/p7zip/CPP/7zip/Common/InOutTempBuffer.h +5 -5
  259. data/ext/p7zip/CPP/7zip/Common/LimitedStreams.cpp +256 -43
  260. data/ext/p7zip/CPP/7zip/Common/LimitedStreams.h +135 -8
  261. data/ext/p7zip/CPP/7zip/Common/MemBlocks.cpp +5 -5
  262. data/ext/p7zip/CPP/7zip/Common/MemBlocks.h +3 -3
  263. data/ext/p7zip/CPP/7zip/Common/MethodId.cpp +0 -24
  264. data/ext/p7zip/CPP/7zip/Common/MethodId.h +1 -1
  265. data/ext/p7zip/CPP/7zip/Common/MethodProps.cpp +430 -71
  266. data/ext/p7zip/CPP/7zip/Common/MethodProps.h +170 -17
  267. data/ext/p7zip/CPP/7zip/Common/OffsetStream.cpp +8 -4
  268. data/ext/p7zip/CPP/7zip/Common/OffsetStream.h +4 -3
  269. data/ext/p7zip/CPP/7zip/Common/OutBuffer.cpp +26 -31
  270. data/ext/p7zip/CPP/7zip/Common/OutBuffer.h +17 -18
  271. data/ext/p7zip/CPP/7zip/Common/OutMemStream.cpp +5 -5
  272. data/ext/p7zip/CPP/7zip/Common/OutMemStream.h +5 -4
  273. data/ext/p7zip/CPP/7zip/Common/ProgressUtils.cpp +22 -13
  274. data/ext/p7zip/CPP/7zip/Common/ProgressUtils.h +4 -3
  275. data/ext/p7zip/CPP/7zip/Common/PropId.cpp +108 -0
  276. data/ext/p7zip/CPP/7zip/Common/RegisterArc.h +63 -17
  277. data/ext/p7zip/CPP/7zip/Common/RegisterCodec.h +79 -6
  278. data/ext/p7zip/CPP/7zip/Common/StreamBinder.cpp +95 -90
  279. data/ext/p7zip/CPP/7zip/Common/StreamBinder.h +46 -23
  280. data/ext/p7zip/CPP/7zip/Common/StreamObjects.cpp +88 -24
  281. data/ext/p7zip/CPP/7zip/Common/StreamObjects.h +36 -14
  282. data/ext/p7zip/CPP/7zip/Common/StreamUtils.cpp +4 -4
  283. data/ext/p7zip/CPP/7zip/Common/StreamUtils.h +6 -6
  284. data/ext/p7zip/CPP/7zip/Common/UniqBlocks.cpp +57 -0
  285. data/ext/p7zip/CPP/7zip/Common/UniqBlocks.h +26 -0
  286. data/ext/p7zip/CPP/7zip/Common/VirtThread.cpp +8 -6
  287. data/ext/p7zip/CPP/7zip/Common/VirtThread.h +6 -5
  288. data/ext/p7zip/CPP/7zip/Compress/BZip2Const.h +13 -12
  289. data/ext/p7zip/CPP/7zip/Compress/BZip2Crc.h +1 -1
  290. data/ext/p7zip/CPP/7zip/Compress/BZip2Decoder.cpp +198 -147
  291. data/ext/p7zip/CPP/7zip/Compress/BZip2Decoder.h +60 -27
  292. data/ext/p7zip/CPP/7zip/Compress/BZip2Encoder.cpp +111 -116
  293. data/ext/p7zip/CPP/7zip/Compress/BZip2Encoder.h +53 -59
  294. data/ext/p7zip/CPP/7zip/Compress/BZip2Register.cpp +12 -7
  295. data/ext/p7zip/CPP/7zip/Compress/Bcj2Coder.cpp +554 -282
  296. data/ext/p7zip/CPP/7zip/Compress/Bcj2Coder.h +73 -71
  297. data/ext/p7zip/CPP/7zip/Compress/Bcj2Register.cpp +10 -5
  298. data/ext/p7zip/CPP/7zip/Compress/BcjCoder.cpp +13 -4
  299. data/ext/p7zip/CPP/7zip/Compress/BcjCoder.h +17 -5
  300. data/ext/p7zip/CPP/7zip/Compress/BcjRegister.cpp +7 -9
  301. data/ext/p7zip/CPP/7zip/Compress/BitlDecoder.cpp +2 -2
  302. data/ext/p7zip/CPP/7zip/Compress/BitlDecoder.h +58 -61
  303. data/ext/p7zip/CPP/7zip/Compress/BitlEncoder.h +24 -25
  304. data/ext/p7zip/CPP/7zip/Compress/BitmDecoder.h +46 -17
  305. data/ext/p7zip/CPP/7zip/Compress/BitmEncoder.h +18 -19
  306. data/ext/p7zip/CPP/7zip/Compress/BranchMisc.cpp +14 -28
  307. data/ext/p7zip/CPP/7zip/Compress/BranchMisc.h +27 -6
  308. data/ext/p7zip/CPP/7zip/Compress/BranchRegister.cpp +26 -15
  309. data/ext/p7zip/CPP/7zip/Compress/ByteSwap.cpp +45 -26
  310. data/ext/p7zip/CPP/7zip/Compress/CodecExports.cpp +254 -70
  311. data/ext/p7zip/CPP/7zip/Compress/CopyCoder.cpp +65 -17
  312. data/ext/p7zip/CPP/7zip/Compress/CopyCoder.h +15 -3
  313. data/ext/p7zip/CPP/7zip/Compress/CopyRegister.cpp +5 -4
  314. data/ext/p7zip/CPP/7zip/Compress/Deflate64Register.cpp +12 -6
  315. data/ext/p7zip/CPP/7zip/Compress/DeflateConst.h +43 -46
  316. data/ext/p7zip/CPP/7zip/Compress/DeflateDecoder.cpp +145 -81
  317. data/ext/p7zip/CPP/7zip/Compress/DeflateDecoder.h +31 -33
  318. data/ext/p7zip/CPP/7zip/Compress/DeflateEncoder.cpp +179 -162
  319. data/ext/p7zip/CPP/7zip/Compress/DeflateEncoder.h +35 -30
  320. data/ext/p7zip/CPP/7zip/Compress/DeflateRegister.cpp +11 -7
  321. data/ext/p7zip/CPP/7zip/Compress/DeltaFilter.cpp +55 -39
  322. data/ext/p7zip/CPP/7zip/Compress/{DllExports2.cpp → DllExports2Compress.cpp} +8 -8
  323. data/ext/p7zip/CPP/7zip/Compress/DllExportsCompress.cpp +48 -0
  324. data/ext/p7zip/CPP/7zip/Compress/HuffmanDecoder.h +220 -49
  325. data/ext/p7zip/CPP/7zip/Compress/ImplodeDecoder.cpp +14 -9
  326. data/ext/p7zip/CPP/7zip/Compress/ImplodeDecoder.h +2 -3
  327. data/ext/p7zip/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp +7 -7
  328. data/ext/p7zip/CPP/7zip/Compress/ImplodeHuffmanDecoder.h +1 -1
  329. data/ext/p7zip/CPP/7zip/Compress/LzOutWindow.cpp +1 -1
  330. data/ext/p7zip/CPP/7zip/Compress/LzOutWindow.h +21 -18
  331. data/ext/p7zip/CPP/7zip/Compress/LzhDecoder.cpp +171 -141
  332. data/ext/p7zip/CPP/7zip/Compress/LzhDecoder.h +32 -64
  333. data/ext/p7zip/CPP/7zip/Compress/Lzham/LICENSE +22 -0
  334. data/ext/p7zip/CPP/7zip/Compress/Lzham/LzhamRegister.cpp +783 -0
  335. data/ext/p7zip/CPP/7zip/Compress/Lzham/README.md +211 -0
  336. data/ext/p7zip/CPP/7zip/Compress/Lzham/include/lzham.h +803 -0
  337. data/ext/p7zip/CPP/7zip/Compress/Lzham/include/lzham_dynamic_lib.h +156 -0
  338. data/ext/p7zip/CPP/7zip/Compress/Lzham/include/lzham_exports.inc +31 -0
  339. data/ext/p7zip/CPP/7zip/Compress/Lzham/include/lzham_static_lib.h +59 -0
  340. data/ext/p7zip/CPP/7zip/Compress/Lzham/include/zlib.h +2 -0
  341. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/CMakeLists.txt +69 -0
  342. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_comp.h +38 -0
  343. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_lzbase.cpp +244 -0
  344. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_lzbase.h +46 -0
  345. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_lzcomp.cpp +750 -0
  346. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_lzcomp_internal.cpp +2240 -0
  347. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_lzcomp_internal.h +503 -0
  348. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_lzcomp_state.cpp +1684 -0
  349. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_match_accel.cpp +947 -0
  350. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_match_accel.h +164 -0
  351. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_null_threading.h +98 -0
  352. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_pthreads_threading.cpp +214 -0
  353. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_pthreads_threading.h +535 -0
  354. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_threading.h +12 -0
  355. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_win32_threading.cpp +232 -0
  356. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_win32_threading.h +387 -0
  357. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzhamcomp.vcxproj +208 -0
  358. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/CMakeLists.txt +86 -0
  359. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_assert.cpp +80 -0
  360. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_assert.h +58 -0
  361. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_checksum.cpp +73 -0
  362. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_checksum.h +13 -0
  363. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_config.h +25 -0
  364. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_core.h +303 -0
  365. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_decomp.h +37 -0
  366. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_helpers.h +54 -0
  367. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_huffman_codes.cpp +286 -0
  368. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_huffman_codes.h +32 -0
  369. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_lzdecomp.cpp +1586 -0
  370. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_lzdecompbase.cpp +131 -0
  371. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_lzdecompbase.h +89 -0
  372. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_math.h +142 -0
  373. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_mem.cpp +463 -0
  374. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_mem.h +115 -0
  375. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_platform.cpp +159 -0
  376. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_platform.h +284 -0
  377. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_prefix_coding.cpp +431 -0
  378. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_prefix_coding.h +157 -0
  379. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_symbol_codec.cpp +1527 -0
  380. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_symbol_codec.h +494 -0
  381. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_timer.cpp +147 -0
  382. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_timer.h +99 -0
  383. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_traits.h +141 -0
  384. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_types.h +72 -0
  385. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_utils.h +58 -0
  386. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_vector.cpp +83 -0
  387. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_vector.h +628 -0
  388. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzhamdecomp.vcxproj +224 -0
  389. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamlib/lzham_lib.cpp +179 -0
  390. data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamlib/lzhamlib.vcxproj +187 -0
  391. data/ext/p7zip/CPP/7zip/Compress/Lzham/makefile +10 -0
  392. data/ext/p7zip/CPP/7zip/Compress/Lzham/makefile.depend +0 -0
  393. data/ext/p7zip/CPP/7zip/Compress/Lzham/makefile.list +129 -0
  394. data/ext/p7zip/CPP/7zip/Compress/Lzma2Decoder.cpp +123 -46
  395. data/ext/p7zip/CPP/7zip/Compress/Lzma2Decoder.h +29 -14
  396. data/ext/p7zip/CPP/7zip/Compress/Lzma2Encoder.cpp +14 -9
  397. data/ext/p7zip/CPP/7zip/Compress/Lzma2Encoder.h +1 -1
  398. data/ext/p7zip/CPP/7zip/Compress/Lzma2Register.cpp +9 -7
  399. data/ext/p7zip/CPP/7zip/Compress/LzmaDecoder.cpp +24 -8
  400. data/ext/p7zip/CPP/7zip/Compress/LzmaDecoder.h +8 -1
  401. data/ext/p7zip/CPP/7zip/Compress/LzmaEncoder.cpp +30 -27
  402. data/ext/p7zip/CPP/7zip/Compress/LzmaEncoder.h +3 -1
  403. data/ext/p7zip/CPP/7zip/Compress/LzmaRegister.cpp +9 -7
  404. data/ext/p7zip/CPP/7zip/Compress/LzmsDecoder.cpp +576 -0
  405. data/ext/p7zip/CPP/7zip/Compress/LzmsDecoder.h +271 -0
  406. data/ext/p7zip/CPP/7zip/Compress/Lzx.h +32 -36
  407. data/ext/p7zip/CPP/7zip/Compress/LzxDecoder.cpp +380 -238
  408. data/ext/p7zip/CPP/7zip/Compress/LzxDecoder.h +170 -83
  409. data/ext/p7zip/CPP/7zip/Compress/Mtf8.h +7 -9
  410. data/ext/p7zip/CPP/7zip/Compress/PpmdDecoder.cpp +1 -5
  411. data/ext/p7zip/CPP/7zip/Compress/PpmdEncoder.cpp +51 -18
  412. data/ext/p7zip/CPP/7zip/Compress/PpmdEncoder.h +18 -8
  413. data/ext/p7zip/CPP/7zip/Compress/PpmdRegister.cpp +9 -8
  414. data/ext/p7zip/CPP/7zip/Compress/PpmdZip.cpp +61 -25
  415. data/ext/p7zip/CPP/7zip/Compress/PpmdZip.h +21 -6
  416. data/ext/p7zip/CPP/7zip/Compress/QuantumDecoder.cpp +122 -102
  417. data/ext/p7zip/CPP/7zip/Compress/QuantumDecoder.h +68 -157
  418. data/ext/p7zip/CPP/7zip/Compress/Rar/makefile +33 -18
  419. data/ext/p7zip/CPP/7zip/Compress/Rar/makefile.depend +0 -158
  420. data/ext/p7zip/CPP/7zip/Compress/Rar/makefile.list +105 -56
  421. data/ext/p7zip/CPP/7zip/Compress/Rar1Decoder.cpp +34 -21
  422. data/ext/p7zip/CPP/7zip/Compress/Rar1Decoder.h +2 -0
  423. data/ext/p7zip/CPP/7zip/Compress/Rar2Decoder.cpp +77 -67
  424. data/ext/p7zip/CPP/7zip/Compress/Rar2Decoder.h +12 -10
  425. data/ext/p7zip/CPP/7zip/Compress/Rar3Decoder.cpp +139 -118
  426. data/ext/p7zip/CPP/7zip/Compress/Rar3Decoder.h +48 -33
  427. data/ext/p7zip/CPP/7zip/Compress/Rar3Vm.cpp +148 -113
  428. data/ext/p7zip/CPP/7zip/Compress/Rar3Vm.h +35 -19
  429. data/ext/p7zip/CPP/7zip/Compress/Rar5Decoder.cpp +961 -0
  430. data/ext/p7zip/CPP/7zip/Compress/Rar5Decoder.h +335 -0
  431. data/ext/p7zip/CPP/7zip/Compress/RarCodecsRegister.cpp +13 -6
  432. data/ext/p7zip/CPP/7zip/Compress/ShrinkDecoder.cpp +91 -71
  433. data/ext/p7zip/CPP/7zip/Compress/ShrinkDecoder.h +2 -4
  434. data/ext/p7zip/CPP/7zip/Compress/XpressDecoder.cpp +129 -0
  435. data/ext/p7zip/CPP/7zip/Compress/XpressDecoder.h +13 -0
  436. data/ext/p7zip/CPP/7zip/Compress/ZDecoder.cpp +98 -20
  437. data/ext/p7zip/CPP/7zip/Compress/ZDecoder.h +19 -7
  438. data/ext/p7zip/CPP/7zip/Compress/ZlibDecoder.cpp +14 -11
  439. data/ext/p7zip/CPP/7zip/Compress/ZlibDecoder.h +32 -1
  440. data/ext/p7zip/CPP/7zip/Crypto/7zAes.cpp +137 -101
  441. data/ext/p7zip/CPP/7zip/Crypto/7zAes.h +31 -30
  442. data/ext/p7zip/CPP/7zip/Crypto/7zAesRegister.cpp +8 -9
  443. data/ext/p7zip/CPP/7zip/Crypto/HmacSha1.cpp +39 -28
  444. data/ext/p7zip/CPP/7zip/Crypto/HmacSha1.h +3 -3
  445. data/ext/p7zip/CPP/7zip/Crypto/HmacSha256.cpp +62 -0
  446. data/ext/p7zip/CPP/7zip/Crypto/HmacSha256.h +27 -0
  447. data/ext/p7zip/CPP/7zip/Crypto/MyAes.cpp +73 -7
  448. data/ext/p7zip/CPP/7zip/Crypto/MyAes.h +25 -8
  449. data/ext/p7zip/CPP/7zip/Crypto/MyAesReg.cpp +16 -0
  450. data/ext/p7zip/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp +29 -15
  451. data/ext/p7zip/CPP/7zip/Crypto/Pbkdf2HmacSha1.h +2 -1
  452. data/ext/p7zip/CPP/7zip/Crypto/RandGen.cpp +49 -34
  453. data/ext/p7zip/CPP/7zip/Crypto/RandGen.h +2 -2
  454. data/ext/p7zip/CPP/7zip/Crypto/Rar20Crypto.cpp +36 -39
  455. data/ext/p7zip/CPP/7zip/Crypto/Rar20Crypto.h +15 -17
  456. data/ext/p7zip/CPP/7zip/Crypto/Rar5Aes.cpp +257 -0
  457. data/ext/p7zip/CPP/7zip/Crypto/Rar5Aes.h +84 -0
  458. data/ext/p7zip/CPP/7zip/Crypto/RarAes.cpp +70 -71
  459. data/ext/p7zip/CPP/7zip/Crypto/RarAes.h +24 -19
  460. data/ext/p7zip/CPP/7zip/Crypto/Sha1Cls.h +51 -0
  461. data/ext/p7zip/CPP/7zip/Crypto/WzAes.cpp +68 -54
  462. data/ext/p7zip/CPP/7zip/Crypto/WzAes.h +37 -27
  463. data/ext/p7zip/CPP/7zip/Crypto/ZipCrypto.cpp +60 -34
  464. data/ext/p7zip/CPP/7zip/Crypto/ZipCrypto.h +28 -11
  465. data/ext/p7zip/CPP/7zip/Crypto/ZipStrong.cpp +90 -28
  466. data/ext/p7zip/CPP/7zip/Crypto/ZipStrong.h +13 -2
  467. data/ext/p7zip/CPP/7zip/Guid.txt +57 -11
  468. data/ext/p7zip/CPP/7zip/ICoder.h +202 -17
  469. data/ext/p7zip/CPP/7zip/IDecl.h +16 -3
  470. data/ext/p7zip/CPP/7zip/IPassword.h +1 -2
  471. data/ext/p7zip/CPP/7zip/IProgress.h +2 -16
  472. data/ext/p7zip/CPP/7zip/IStream.h +82 -13
  473. data/ext/p7zip/CPP/7zip/MyVersion.h +2 -11
  474. data/ext/p7zip/CPP/7zip/PropID.h +60 -9
  475. data/ext/p7zip/CPP/Common/C_FileIO.cpp +5 -1
  476. data/ext/p7zip/CPP/Common/C_FileIO.h +7 -1
  477. data/ext/p7zip/CPP/Common/CommandLineParser.cpp +122 -148
  478. data/ext/p7zip/CPP/Common/CommandLineParser.h +20 -29
  479. data/ext/p7zip/CPP/Common/Common.h +13 -0
  480. data/ext/p7zip/CPP/Common/CrcReg.cpp +98 -0
  481. data/ext/p7zip/CPP/Common/Defs.h +5 -10
  482. data/ext/p7zip/CPP/Common/DynLimBuf.cpp +93 -0
  483. data/ext/p7zip/CPP/Common/DynLimBuf.h +40 -0
  484. data/ext/p7zip/CPP/Common/DynamicBuffer.h +45 -31
  485. data/ext/p7zip/CPP/Common/IntToString.cpp +109 -40
  486. data/ext/p7zip/CPP/Common/IntToString.h +14 -9
  487. data/ext/p7zip/CPP/Common/Lang.cpp +120 -87
  488. data/ext/p7zip/CPP/Common/Lang.h +10 -15
  489. data/ext/p7zip/CPP/Common/ListFileUtils.cpp +82 -40
  490. data/ext/p7zip/CPP/Common/ListFileUtils.h +7 -4
  491. data/ext/p7zip/CPP/Common/MyBuffer.h +244 -0
  492. data/ext/p7zip/CPP/Common/MyCom.h +65 -28
  493. data/ext/p7zip/CPP/Common/MyGuidDef.h +1 -1
  494. data/ext/p7zip/CPP/Common/MyInitGuid.h +23 -0
  495. data/ext/p7zip/CPP/Common/MyLinux.h +42 -0
  496. data/ext/p7zip/CPP/Common/MyMap.cpp +8 -8
  497. data/ext/p7zip/CPP/Common/MyMap.h +2 -2
  498. data/ext/p7zip/CPP/Common/MyString.cpp +1643 -117
  499. data/ext/p7zip/CPP/Common/MyString.h +677 -486
  500. data/ext/p7zip/CPP/Common/MyTypes.h +38 -0
  501. data/ext/p7zip/CPP/Common/MyUnknown.h +4 -0
  502. data/ext/p7zip/CPP/Common/MyVector.cpp +0 -84
  503. data/ext/p7zip/CPP/Common/MyVector.h +472 -112
  504. data/ext/p7zip/CPP/Common/MyWindows.cpp +18 -1
  505. data/ext/p7zip/CPP/Common/MyWindows.h +8 -0
  506. data/ext/p7zip/CPP/Common/MyXml.cpp +169 -118
  507. data/ext/p7zip/CPP/Common/MyXml.h +14 -11
  508. data/ext/p7zip/CPP/Common/NewHandler.cpp +39 -0
  509. data/ext/p7zip/CPP/Common/NewHandler.h +55 -2
  510. data/ext/p7zip/CPP/Common/Random.h +14 -0
  511. data/ext/p7zip/CPP/Common/Sha1Reg.cpp +40 -0
  512. data/ext/p7zip/CPP/Common/Sha256Reg.cpp +40 -0
  513. data/ext/p7zip/CPP/Common/StdInStream.cpp +46 -27
  514. data/ext/p7zip/CPP/Common/StdInStream.h +11 -10
  515. data/ext/p7zip/CPP/Common/StdOutStream.cpp +48 -35
  516. data/ext/p7zip/CPP/Common/StdOutStream.h +44 -17
  517. data/ext/p7zip/CPP/Common/StringConvert.cpp +56 -17
  518. data/ext/p7zip/CPP/Common/StringConvert.h +7 -3
  519. data/ext/p7zip/CPP/Common/StringToInt.cpp +102 -48
  520. data/ext/p7zip/CPP/Common/StringToInt.h +13 -10
  521. data/ext/p7zip/CPP/Common/TextConfig.cpp +33 -47
  522. data/ext/p7zip/CPP/Common/TextConfig.h +3 -6
  523. data/ext/p7zip/CPP/Common/UTFConvert.cpp +218 -75
  524. data/ext/p7zip/CPP/Common/UTFConvert.h +4 -3
  525. data/ext/p7zip/CPP/Common/Wildcard.cpp +345 -125
  526. data/ext/p7zip/CPP/Common/Wildcard.h +82 -13
  527. data/ext/p7zip/CPP/Common/XzCrc64Reg.cpp +42 -0
  528. data/ext/p7zip/CPP/Windows/FileDir.cpp +427 -475
  529. data/ext/p7zip/CPP/Windows/FileDir.h +94 -72
  530. data/ext/p7zip/CPP/Windows/FileFind.cpp +235 -244
  531. data/ext/p7zip/CPP/Windows/FileFind.h +63 -59
  532. data/ext/p7zip/CPP/Windows/FileIO.cpp +29 -46
  533. data/ext/p7zip/CPP/Windows/FileIO.h +40 -42
  534. data/ext/p7zip/CPP/Windows/FileName.cpp +696 -17
  535. data/ext/p7zip/CPP/Windows/FileName.h +11 -3
  536. data/ext/p7zip/CPP/Windows/NtCheck.h +2 -0
  537. data/ext/p7zip/CPP/Windows/PropVariant.cpp +134 -30
  538. data/ext/p7zip/CPP/Windows/PropVariant.h +80 -24
  539. data/ext/p7zip/CPP/Windows/PropVariantUtils.cpp +89 -18
  540. data/ext/p7zip/CPP/Windows/PropVariantUtils.h +12 -7
  541. data/ext/p7zip/CPP/Windows/System.cpp +20 -15
  542. data/ext/p7zip/CPP/Windows/System.h +3 -2
  543. data/ext/p7zip/CPP/Windows/TimeUtils.cpp +203 -0
  544. data/ext/p7zip/CPP/Windows/TimeUtils.h +24 -0
  545. data/ext/p7zip/CPP/include_windows/basetyps.h +4 -4
  546. data/ext/p7zip/CPP/include_windows/windows.h +17 -11
  547. data/ext/p7zip/CPP/myWindows/StdAfx.h +97 -5
  548. data/ext/p7zip/CPP/myWindows/config.h +20 -5
  549. data/ext/p7zip/CPP/myWindows/myPrivate.h +8 -0
  550. data/ext/p7zip/CPP/myWindows/wine_date_and_time.cpp +34 -0
  551. data/ext/p7zip/ChangeLog +283 -35
  552. data/ext/p7zip/{DOCS → DOC}/7zC.txt +6 -13
  553. data/ext/p7zip/{DOCS → DOC}/License.txt +3 -2
  554. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/add.htm +93 -87
  555. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/bench.htm +88 -79
  556. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/delete.htm +62 -59
  557. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/extract.htm +96 -91
  558. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/extract_full.htm +73 -68
  559. data/ext/p7zip/DOC/MANUAL/cmdline/commands/hash.htm +65 -0
  560. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/index.htm +36 -33
  561. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/list.htm +78 -77
  562. data/ext/p7zip/DOC/MANUAL/cmdline/commands/rename.htm +51 -0
  563. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/style.css +232 -232
  564. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/test.htm +47 -46
  565. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/update.htm +71 -66
  566. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/exit_codes.htm +27 -27
  567. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/index.htm +29 -29
  568. data/ext/p7zip/{DOCS/MANUAL/switches → DOC/MANUAL/cmdline}/style.css +232 -232
  569. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/ar_exclude.htm +56 -56
  570. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/ar_include.htm +80 -83
  571. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/ar_no.htm +52 -52
  572. data/ext/p7zip/DOC/MANUAL/cmdline/switches/bb.htm +61 -0
  573. data/ext/p7zip/DOC/MANUAL/cmdline/switches/bs.htm +67 -0
  574. data/ext/p7zip/DOC/MANUAL/cmdline/switches/charset.htm +61 -0
  575. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/exclude.htm +71 -60
  576. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/include.htm +89 -87
  577. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/index.htm +95 -64
  578. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/large_pages.htm +59 -50
  579. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/list_tech.htm +36 -36
  580. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/method.htm +738 -625
  581. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/output_dir.htm +53 -53
  582. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/overwrite.htm +56 -56
  583. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/password.htm +55 -54
  584. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/recurse.htm +85 -83
  585. data/ext/p7zip/DOC/MANUAL/cmdline/switches/sa.htm +58 -0
  586. data/ext/p7zip/DOC/MANUAL/cmdline/switches/scc.htm +42 -0
  587. data/ext/p7zip/DOC/MANUAL/cmdline/switches/scrc.htm +53 -0
  588. data/ext/p7zip/DOC/MANUAL/cmdline/switches/sdel.htm +39 -0
  589. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/sfx.htm +153 -156
  590. data/ext/p7zip/DOC/MANUAL/cmdline/switches/shared.htm +40 -0
  591. data/ext/p7zip/DOC/MANUAL/cmdline/switches/sni.htm +56 -0
  592. data/ext/p7zip/DOC/MANUAL/cmdline/switches/sns.htm +77 -0
  593. data/ext/p7zip/DOC/MANUAL/cmdline/switches/spf.htm +80 -0
  594. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/ssc.htm +50 -50
  595. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/stdin.htm +56 -55
  596. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/stdout.htm +54 -50
  597. data/ext/p7zip/DOC/MANUAL/cmdline/switches/stl.htm +39 -0
  598. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/stop_switch.htm +31 -31
  599. data/ext/p7zip/DOC/MANUAL/cmdline/switches/stx.htm +50 -0
  600. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline/switches}/style.css +232 -232
  601. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/type.htm +121 -83
  602. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/update.htm +177 -176
  603. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/volume.htm +49 -49
  604. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/working_dir.htm +56 -55
  605. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/yes.htm +48 -48
  606. data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/syntax.htm +120 -120
  607. data/ext/p7zip/DOC/MANUAL/fm/about.htm +21 -0
  608. data/ext/p7zip/DOC/MANUAL/fm/benchmark.htm +56 -0
  609. data/ext/p7zip/DOC/MANUAL/fm/index.htm +54 -0
  610. data/ext/p7zip/DOC/MANUAL/fm/menu.htm +154 -0
  611. data/ext/p7zip/DOC/MANUAL/fm/options.htm +152 -0
  612. data/ext/p7zip/DOC/MANUAL/fm/plugins/7-zip/add.htm +311 -0
  613. data/ext/p7zip/DOC/MANUAL/fm/plugins/7-zip/extract.htm +78 -0
  614. data/ext/p7zip/DOC/MANUAL/fm/plugins/7-zip/index.htm +63 -0
  615. data/ext/p7zip/DOC/MANUAL/fm/plugins/7-zip/style.css +232 -0
  616. data/ext/p7zip/DOC/MANUAL/fm/plugins/index.htm +22 -0
  617. data/ext/p7zip/DOC/MANUAL/fm/plugins/style.css +232 -0
  618. data/ext/p7zip/DOC/MANUAL/fm/style.css +232 -0
  619. data/ext/p7zip/DOC/MANUAL/general/7z.htm +117 -0
  620. data/ext/p7zip/DOC/MANUAL/general/faq.htm +125 -0
  621. data/ext/p7zip/DOC/MANUAL/general/formats.htm +100 -0
  622. data/ext/p7zip/DOC/MANUAL/general/index.htm +27 -0
  623. data/ext/p7zip/DOC/MANUAL/general/license.htm +30 -0
  624. data/ext/p7zip/DOC/MANUAL/general/performance.htm +98 -0
  625. data/ext/p7zip/DOC/MANUAL/general/style.css +232 -0
  626. data/ext/p7zip/DOC/MANUAL/general/thanks.htm +43 -0
  627. data/ext/p7zip/DOC/MANUAL/start.htm +37 -0
  628. data/ext/p7zip/DOC/MANUAL/style.css +232 -0
  629. data/ext/p7zip/DOC/Methods.txt +158 -0
  630. data/ext/p7zip/{DOCS → DOC}/copying.txt +9 -11
  631. data/ext/p7zip/DOC/lzma.txt +328 -0
  632. data/ext/p7zip/{DOCS → DOC}/readme.txt +42 -65
  633. data/ext/p7zip/{DOCS/history.txt → DOC/src-history.txt} +88 -2
  634. data/ext/p7zip/README +117 -91
  635. data/ext/p7zip/TODO +0 -2
  636. data/ext/p7zip/install.sh +31 -29
  637. data/ext/p7zip/last_error +1 -0
  638. data/ext/p7zip/makefile +29 -125
  639. data/ext/p7zip/makefile.afl +23 -0
  640. data/ext/p7zip/makefile.aix_gcc +5 -4
  641. data/ext/p7zip/makefile.android_arm +49 -0
  642. data/ext/p7zip/makefile.beos +5 -4
  643. data/ext/p7zip/makefile.common +150 -0
  644. data/ext/p7zip/makefile.crc32 +3 -3
  645. data/ext/p7zip/makefile.cygwin +5 -4
  646. data/ext/p7zip/makefile.cygwin64 +21 -0
  647. data/ext/p7zip/makefile.cygwin64_asm +22 -0
  648. data/ext/p7zip/makefile.cygwin_asm +6 -4
  649. data/ext/p7zip/makefile.cygwin_clang +21 -0
  650. data/ext/p7zip/makefile.cygwin_clang_asm +23 -0
  651. data/ext/p7zip/{makefile.djgpp_old → makefile.djgpp} +5 -4
  652. data/ext/p7zip/makefile.djgpp_watt +7 -5
  653. data/ext/p7zip/makefile.freebsd5 +5 -4
  654. data/ext/p7zip/{makefile.freebsd6 → makefile.freebsd6+} +6 -5
  655. data/ext/p7zip/makefile.glb +27 -18
  656. data/ext/p7zip/makefile.gprof +3 -2
  657. data/ext/p7zip/makefile.haiku +19 -0
  658. data/ext/p7zip/makefile.hpux-acc +3 -2
  659. data/ext/p7zip/makefile.hpux-acc_64 +3 -2
  660. data/ext/p7zip/makefile.hpux-gcc +5 -4
  661. data/ext/p7zip/makefile.linux_amd64 +5 -4
  662. data/ext/p7zip/makefile.linux_amd64_asm +12 -5
  663. data/ext/p7zip/makefile.linux_amd64_asm_icc +5 -3
  664. data/ext/p7zip/makefile.linux_amd64_sanitizer +26 -0
  665. data/ext/p7zip/makefile.linux_any_cpu +5 -4
  666. data/ext/p7zip/makefile.linux_any_cpu_gcc_4.X +7 -4
  667. data/ext/p7zip/makefile.linux_clang_amd64_asm +25 -0
  668. data/ext/p7zip/makefile.linux_clang_amd64_asm_sanitize +27 -0
  669. data/ext/p7zip/makefile.linux_cross_aarch64 +25 -0
  670. data/ext/p7zip/makefile.linux_cross_arm +7 -4
  671. data/ext/p7zip/makefile.linux_cross_djgpp +27 -0
  672. data/ext/p7zip/makefile.linux_cross_m68k +26 -0
  673. data/ext/p7zip/makefile.linux_cross_mipsel +27 -0
  674. data/ext/p7zip/makefile.linux_cross_ppc +25 -0
  675. data/ext/p7zip/makefile.linux_cross_ppc64 +25 -0
  676. data/ext/p7zip/makefile.linux_cross_ppc64le +25 -0
  677. data/ext/p7zip/makefile.linux_cross_s390x +25 -0
  678. data/ext/p7zip/makefile.linux_cross_sparc64 +25 -0
  679. data/ext/p7zip/makefile.linux_gcc6_sanitize +23 -0
  680. data/ext/p7zip/makefile.linux_gcc_2.95_no_need_for_libstdc +6 -4
  681. data/ext/p7zip/makefile.linux_other +6 -5
  682. data/ext/p7zip/makefile.linux_s390x +5 -4
  683. data/ext/p7zip/{makefile.machine_base → makefile.linux_scan-build} +5 -4
  684. data/ext/p7zip/makefile.linux_valgrind +25 -0
  685. data/ext/p7zip/{makefile.linux_clang_amd64 → makefile.linux_x32} +6 -5
  686. data/ext/p7zip/makefile.linux_x86_asm_gcc_4.X +10 -5
  687. data/ext/p7zip/makefile.linux_x86_asm_gcc_4.X_fltk +8 -4
  688. data/ext/p7zip/makefile.linux_x86_asm_gcc_mudflap_4.X +4 -2
  689. data/ext/p7zip/makefile.linux_x86_asm_icc +4 -2
  690. data/ext/p7zip/makefile.linux_x86_icc +3 -2
  691. data/ext/p7zip/makefile.macosx_arm64 +17 -0
  692. data/ext/p7zip/{makefile.macosx_32bits → makefile.macosx_gcc_32bits} +3 -2
  693. data/ext/p7zip/{makefile.macosx_32bits_asm → makefile.macosx_gcc_32bits_asm} +5 -3
  694. data/ext/p7zip/{makefile.macosx_32bits_ppc → makefile.macosx_gcc_32bits_ppc} +3 -2
  695. data/ext/p7zip/{makefile.macosx_64bits → makefile.macosx_gcc_64bits} +3 -2
  696. data/ext/p7zip/makefile.macosx_llvm_64bits +9 -3
  697. data/ext/p7zip/makefile.netbsd +5 -4
  698. data/ext/p7zip/makefile.netware_asm_gcc_3.X +6 -4
  699. data/ext/p7zip/makefile.oldmake +41 -130
  700. data/ext/p7zip/makefile.openbsd +7 -3
  701. data/ext/p7zip/makefile.openbsd_no_port +9 -5
  702. data/ext/p7zip/makefile.qnx_shared.bin +5 -4
  703. data/ext/p7zip/makefile.qnx_static +5 -4
  704. data/ext/p7zip/makefile.solaris_sparc_CC_32 +5 -4
  705. data/ext/p7zip/makefile.solaris_sparc_CC_64 +6 -4
  706. data/ext/p7zip/makefile.solaris_sparc_gcc +7 -6
  707. data/ext/p7zip/makefile.solaris_x86 +5 -4
  708. data/ext/p7zip/makefile.tru64 +5 -4
  709. data/ext/seven_zip_ruby/extconf.rb +92 -6
  710. data/ext/seven_zip_ruby/seven_zip_archive.cpp +40 -17
  711. data/ext/seven_zip_ruby/seven_zip_archive.h +1 -1
  712. data/ext/seven_zip_ruby/utils.cpp +267 -124
  713. data/ext/seven_zip_ruby/utils.h +2 -0
  714. data/lib/seven_zip_ruby/7z.dll +0 -0
  715. data/lib/seven_zip_ruby/7z.sfx +0 -0
  716. data/lib/seven_zip_ruby/7z64.dll +0 -0
  717. data/lib/seven_zip_ruby/7zCon.sfx +0 -0
  718. data/lib/seven_zip_ruby/seven_zip_reader.rb +16 -1
  719. data/lib/seven_zip_ruby/version.rb +1 -1
  720. data/p7zip/.gitignore +7 -0
  721. data/p7zip/README.txt +29 -0
  722. data/p7zip/extract.sh +134 -0
  723. data/spec/seven_zip_ruby_spec.rb +22 -13
  724. data/test/res/The Flying Spaghetti Monster.txt +3 -0
  725. data/test/res/The Three Little Pigs.txt +5 -0
  726. data/test/res/UTF_content.txt +3 -0
  727. data/test/res/test_reader_data.7z +0 -0
  728. data/test/res/test_reader_filename_cp932.7z +0 -0
  729. data/test/res/test_reader_files.7z +0 -0
  730. data/test/test_seven_zip_reader.rb +187 -0
  731. data/test/test_seven_zip_writer.rb +184 -0
  732. metadata +267 -219
  733. data/.github/workflows/test-and-release.yml +0 -43
  734. data/ext/C/Types.h +0 -254
  735. data/ext/CPP/7zip/Archive/IArchive.h +0 -234
  736. data/ext/CPP/7zip/IDecl.h +0 -15
  737. data/ext/CPP/7zip/IPassword.h +0 -24
  738. data/ext/CPP/7zip/IProgress.h +0 -33
  739. data/ext/CPP/7zip/IStream.h +0 -58
  740. data/ext/CPP/7zip/PropID.h +0 -76
  741. data/ext/CPP/Common/MyCom.h +0 -225
  742. data/ext/CPP/Common/MyGuidDef.h +0 -54
  743. data/ext/CPP/Common/MyInitGuid.h +0 -22
  744. data/ext/CPP/Common/MyUnknown.h +0 -13
  745. data/ext/CPP/Common/MyWindows.h +0 -204
  746. data/ext/CPP/Common/Types.h +0 -11
  747. data/ext/CPP/Windows/PropVariant.h +0 -56
  748. data/ext/CPP/include_windows/basetyps.h +0 -19
  749. data/ext/CPP/include_windows/tchar.h +0 -89
  750. data/ext/CPP/include_windows/windows.h +0 -194
  751. data/ext/p7zip/Asm/x64/7zCrcT8U.asm +0 -103
  752. data/ext/p7zip/Asm/x86/7zCrcT8U.asm +0 -101
  753. data/ext/p7zip/C/7zCrcT8.c +0 -43
  754. data/ext/p7zip/C/Alloc.back3 +0 -238
  755. data/ext/p7zip/C/Alloc.c.back +0 -243
  756. data/ext/p7zip/C/Alloc.c.back2 +0 -222
  757. data/ext/p7zip/C/LzmaUtil/Lzma86Dec.h +0 -51
  758. data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderOutStream.cpp +0 -149
  759. data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderOutStream.h +0 -58
  760. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHeader.cpp +0 -24
  761. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHeader.h +0 -28
  762. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmRegister.cpp +0 -13
  763. data/ext/p7zip/CPP/7zip/Archive/Com/ComHandler.cpp +0 -239
  764. data/ext/p7zip/CPP/7zip/Archive/Com/ComHandler.h +0 -28
  765. data/ext/p7zip/CPP/7zip/Archive/Com/ComIn.cpp +0 -389
  766. data/ext/p7zip/CPP/7zip/Archive/Com/ComIn.h +0 -119
  767. data/ext/p7zip/CPP/7zip/Archive/Com/ComRegister.cpp +0 -13
  768. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2MT.cpp +0 -240
  769. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2MT.h +0 -80
  770. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2ST.cpp +0 -239
  771. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2ST.h +0 -88
  772. data/ext/p7zip/CPP/7zip/Archive/Common/CrossThreadProgress.cpp +0 -15
  773. data/ext/p7zip/CPP/7zip/Archive/Common/CrossThreadProgress.h +0 -37
  774. data/ext/p7zip/CPP/7zip/Archive/DebHandler.cpp +0 -413
  775. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsHandler.cpp +0 -243
  776. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsHandler.h +0 -26
  777. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsIn.cpp +0 -480
  778. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsIn.h +0 -154
  779. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsRegister.cpp +0 -13
  780. data/ext/p7zip/CPP/7zip/Archive/Rar/RarHeader.cpp +0 -21
  781. data/ext/p7zip/CPP/7zip/Archive/Rar/RarIn.cpp +0 -478
  782. data/ext/p7zip/CPP/7zip/Archive/Rar/RarIn.h +0 -123
  783. data/ext/p7zip/CPP/7zip/Archive/Rar/RarItem.cpp +0 -55
  784. data/ext/p7zip/CPP/7zip/Archive/Rar/RarRegister.cpp +0 -13
  785. data/ext/p7zip/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp +0 -78
  786. data/ext/p7zip/CPP/7zip/Archive/Rar/RarVolumeInStream.h +0 -49
  787. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfRegister.cpp +0 -13
  788. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHeader.cpp +0 -36
  789. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItemEx.h +0 -34
  790. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7zFM.txt +0 -163
  791. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7zG.txt +0 -131
  792. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7za.txt +0 -253
  793. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_ALL.txt +0 -32
  794. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_Format7zFree.txt +0 -290
  795. data/ext/p7zip/CPP/7zip/CMAKE/generate.sh +0 -37
  796. data/ext/p7zip/CPP/7zip/CMAKE/generate_xcode.sh +0 -32
  797. data/ext/p7zip/CPP/7zip/Common/LockedStream.cpp +0 -23
  798. data/ext/p7zip/CPP/7zip/Common/LockedStream.h +0 -38
  799. data/ext/p7zip/CPP/7zip/Compress/ArjDecoder1.cpp +0 -309
  800. data/ext/p7zip/CPP/7zip/Compress/ArjDecoder1.h +0 -98
  801. data/ext/p7zip/CPP/7zip/Compress/ArjDecoder2.cpp +0 -90
  802. data/ext/p7zip/CPP/7zip/Compress/ArjDecoder2.h +0 -59
  803. data/ext/p7zip/CPP/7zip/Compress/BranchCoder.cpp +0 -19
  804. data/ext/p7zip/CPP/7zip/Compress/BranchCoder.h +0 -44
  805. data/ext/p7zip/CPP/7zip/Compress/DllExports.cpp +0 -39
  806. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp +0 -531
  807. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp +0 -1018
  808. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBench.h +0 -48
  809. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp +0 -311
  810. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.h +0 -20
  811. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/makefile +0 -173
  812. data/ext/p7zip/CPP/7zip/Compress/Lzx86Converter.cpp +0 -90
  813. data/ext/p7zip/CPP/7zip/Compress/Lzx86Converter.h +0 -46
  814. data/ext/p7zip/CPP/7zip/Compress/RangeCoder.h +0 -205
  815. data/ext/p7zip/CPP/7zip/Compress/RangeCoderBit.h +0 -114
  816. data/ext/p7zip/CPP/7zip/Crypto/Sha1.cpp +0 -229
  817. data/ext/p7zip/CPP/7zip/Crypto/Sha1.h +0 -68
  818. data/ext/p7zip/CPP/7zip/PREMAKE/generate.sh +0 -18
  819. data/ext/p7zip/CPP/7zip/PREMAKE/premake4.lua +0 -263
  820. data/ext/p7zip/CPP/7zip/QMAKE/7ZA/7ZA.pro +0 -228
  821. data/ext/p7zip/CPP/7zip/QMAKE/7ZA/7ZA_osx.pro +0 -228
  822. data/ext/p7zip/CPP/7zip/QMAKE/test_emul/test_emul.pro +0 -26
  823. data/ext/p7zip/CPP/7zip/TEST/TestUI/TestUI.cpp +0 -560
  824. data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile +0 -33
  825. data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile.depend +0 -577
  826. data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile.list +0 -16
  827. data/ext/p7zip/CPP/Common/Buffer.h +0 -77
  828. data/ext/p7zip/CPP/Common/Types.h +0 -11
  829. data/ext/p7zip/CPP/Windows/COM.cpp +0 -37
  830. data/ext/p7zip/CPP/Windows/COM.h +0 -69
  831. data/ext/p7zip/CPP/Windows/Clipboard.cpp +0 -160
  832. data/ext/p7zip/CPP/Windows/Clipboard.h +0 -28
  833. data/ext/p7zip/CPP/Windows/CommonDialog.h +0 -19
  834. data/ext/p7zip/CPP/Windows/Control/ComboBox.h +0 -82
  835. data/ext/p7zip/CPP/Windows/Control/Controls.cpp +0 -515
  836. data/ext/p7zip/CPP/Windows/Control/Dialog.cpp +0 -560
  837. data/ext/p7zip/CPP/Windows/Control/Dialog.h +0 -179
  838. data/ext/p7zip/CPP/Windows/Control/DialogImpl.h +0 -73
  839. data/ext/p7zip/CPP/Windows/Control/Edit.h +0 -24
  840. data/ext/p7zip/CPP/Windows/Control/ListView.h +0 -164
  841. data/ext/p7zip/CPP/Windows/Control/ProgressBar.h +0 -34
  842. data/ext/p7zip/CPP/Windows/Control/Static.h +0 -23
  843. data/ext/p7zip/CPP/Windows/Control/StatusBar.h +0 -56
  844. data/ext/p7zip/CPP/Windows/Control/Window2.cpp +0 -211
  845. data/ext/p7zip/CPP/Windows/Control/Window2.h +0 -111
  846. data/ext/p7zip/CPP/Windows/DLL.cpp +0 -193
  847. data/ext/p7zip/CPP/Windows/DLL.h +0 -48
  848. data/ext/p7zip/CPP/Windows/Error.cpp +0 -58
  849. data/ext/p7zip/CPP/Windows/Error.h +0 -33
  850. data/ext/p7zip/CPP/Windows/Menu.h +0 -4
  851. data/ext/p7zip/CPP/Windows/PropVariantConversions.cpp +0 -142
  852. data/ext/p7zip/CPP/Windows/PropVariantConversions.h +0 -14
  853. data/ext/p7zip/CPP/Windows/Registry.cpp +0 -313
  854. data/ext/p7zip/CPP/Windows/Registry.h +0 -113
  855. data/ext/p7zip/CPP/Windows/ResourceString.h +0 -22
  856. data/ext/p7zip/CPP/Windows/Shell.h +0 -21
  857. data/ext/p7zip/CPP/Windows/Time.cpp +0 -88
  858. data/ext/p7zip/CPP/Windows/Time.h +0 -21
  859. data/ext/p7zip/CPP/Windows/Window.cpp +0 -101
  860. data/ext/p7zip/CPP/Windows/Window.h +0 -43
  861. data/ext/p7zip/CPP/myWindows/initguid.h +0 -4
  862. data/ext/p7zip/CPP/myWindows/makefile +0 -21
  863. data/ext/p7zip/CPP/myWindows/makefile.depend +0 -32
  864. data/ext/p7zip/CPP/myWindows/makefile.list +0 -28
  865. data/ext/p7zip/CPP/myWindows/myAddExeFlag.cpp +0 -20
  866. data/ext/p7zip/CPP/myWindows/myGetTickCount.cpp +0 -8
  867. data/ext/p7zip/CPP/myWindows/mySplitCommandLine.cpp +0 -82
  868. data/ext/p7zip/CPP/myWindows/test_emul.cpp +0 -745
  869. data/ext/p7zip/CPP/myWindows/wine_GetXXXDefaultLangID.cpp +0 -741
  870. data/ext/p7zip/DOCS/MANUAL/switches/charset.htm +0 -49
  871. data/ext/p7zip/DOCS/Methods.txt +0 -152
  872. data/ext/p7zip/DOCS/lzma.txt +0 -598
  873. data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/ChangeLog +0 -41
  874. data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/readme +0 -21
  875. data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/readme.u7z +0 -30
  876. data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/u7z +0 -133
  877. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/README +0 -21
  878. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/check/check.sh +0 -117
  879. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/check/files.tar +0 -0
  880. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/man1/p7zip.1 +0 -33
  881. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/p7zip +0 -144
  882. data/ext/p7zip/contrib/qnx630sp3/qnx630sp3-shared +0 -14
  883. data/ext/p7zip/contrib/qnx630sp3/qnx630sp3-static +0 -10
  884. data/ext/p7zip/integration_context_menu.txt +0 -51
  885. data/ext/p7zip/makefile.rules +0 -661
  886. /data/ext/p7zip/{DOCS → DOC}/7zFormat.txt +0 -0
  887. /data/ext/p7zip/{DOCS → DOC}/unRarLicense.txt +0 -0
@@ -0,0 +1,1684 @@
1
+ // File: lzham_lzcomp_state.cpp
2
+ // See Copyright Notice and license at the end of include/lzham.h
3
+ #include "lzham_core.h"
4
+ #include "lzham_lzcomp_internal.h"
5
+
6
+ namespace lzham
7
+ {
8
+ static uint get_huge_match_code_len(uint len)
9
+ {
10
+ LZHAM_ASSERT((len > CLZBase::cMaxMatchLen) && (len <= CLZBase::cMaxHugeMatchLen));
11
+ len -= (CLZBase::cMaxMatchLen + 1);
12
+
13
+ if (len < 256)
14
+ return 1 + 8;
15
+ else if (len < (256 + 1024))
16
+ return 2 + 10;
17
+ else if (len < (256 + 1024 + 4096))
18
+ return 3 + 12;
19
+ else
20
+ return 3 + 16;
21
+ }
22
+
23
+ static uint get_huge_match_code_bits(uint len)
24
+ {
25
+ LZHAM_ASSERT((len > CLZBase::cMaxMatchLen) && (len <= CLZBase::cMaxHugeMatchLen));
26
+ len -= (CLZBase::cMaxMatchLen + 1);
27
+
28
+ uint c;
29
+ if (len < 256)
30
+ c = len;
31
+ else if (len < (256 + 1024))
32
+ {
33
+ uint r = (len - 256);
34
+ LZHAM_ASSERT(r <= 1023);
35
+ c = r | (2 << 10);
36
+ }
37
+ else if (len < (256 + 1024 + 4096))
38
+ {
39
+ uint r = (len - (256 + 1024));
40
+ LZHAM_ASSERT(r <= 4095);
41
+ c = r | (6 << 12);
42
+ }
43
+ else
44
+ {
45
+ uint r = (len - (256 + 1024 + 4096));
46
+ LZHAM_ASSERT(r <= 65535);
47
+ c = r | (7 << 16);
48
+ }
49
+
50
+ return c;
51
+ }
52
+
53
+ uint lzcompressor::lzdecision::get_match_dist(const state& cur_state) const
54
+ {
55
+ if (!is_match())
56
+ return 0;
57
+ else if (is_rep())
58
+ {
59
+ int index = -m_dist - 1;
60
+ LZHAM_ASSERT(index < CLZBase::cMatchHistSize);
61
+ return cur_state.m_match_hist[index];
62
+ }
63
+ else
64
+ return m_dist;
65
+ }
66
+
67
+ lzcompressor::state::state(lzham_malloc_context malloc_context) :
68
+ m_malloc_context(malloc_context),
69
+ m_lit_table(malloc_context),
70
+ m_delta_lit_table(malloc_context),
71
+ m_main_table(malloc_context),
72
+ m_dist_lsb_table(malloc_context)
73
+ {
74
+ for (uint i = 0; i < 2; i++)
75
+ {
76
+ m_rep_len_table[i].set_malloc_context(malloc_context);
77
+ m_large_len_table[i].set_malloc_context(malloc_context);
78
+ }
79
+
80
+ m_cur_ofs = 0;
81
+ m_cur_state = 0;
82
+ m_block_start_dict_ofs = 0;
83
+
84
+ m_match_hist[0] = 1;
85
+ m_match_hist[1] = 1;
86
+ m_match_hist[2] = 1;
87
+ m_match_hist[3] = 1;
88
+ }
89
+
90
+ void lzcompressor::state::clear()
91
+ {
92
+ m_cur_ofs = 0;
93
+ m_cur_state = 0;
94
+ m_block_start_dict_ofs = 0;
95
+
96
+ for (uint i = 0; i < 2; i++)
97
+ {
98
+ m_rep_len_table[i].clear();
99
+ m_large_len_table[i].clear();
100
+ }
101
+ m_main_table.clear();
102
+ m_dist_lsb_table.clear();
103
+
104
+ m_lit_table.clear();
105
+ m_delta_lit_table.clear();
106
+
107
+ m_match_hist[0] = 1;
108
+ m_match_hist[1] = 1;
109
+ m_match_hist[2] = 1;
110
+ m_match_hist[3] = 1;
111
+ }
112
+
113
+ void lzcompressor::state::reset()
114
+ {
115
+ m_cur_ofs = 0;
116
+ m_cur_state = 0;
117
+ m_block_start_dict_ofs = 0;
118
+
119
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_match_model); i++)
120
+ m_is_match_model[i].clear();
121
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_rep_model); i++)
122
+ m_is_rep_model[i].clear();
123
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_rep0_model); i++)
124
+ m_is_rep0_model[i].clear();
125
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_rep0_single_byte_model); i++)
126
+ m_is_rep0_single_byte_model[i].clear();
127
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_rep1_model); i++)
128
+ m_is_rep1_model[i].clear();
129
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_rep2_model); i++)
130
+ m_is_rep2_model[i].clear();
131
+
132
+ for (uint i = 0; i < 2; i++)
133
+ {
134
+ m_rep_len_table[i].reset();
135
+ m_large_len_table[i].reset();
136
+ }
137
+ m_main_table.reset();
138
+ m_dist_lsb_table.reset();
139
+
140
+ m_lit_table.reset();
141
+ m_delta_lit_table.reset();
142
+
143
+ m_match_hist[0] = 1;
144
+ m_match_hist[1] = 1;
145
+ m_match_hist[2] = 1;
146
+ m_match_hist[3] = 1;
147
+ }
148
+
149
+ bool lzcompressor::state::init(CLZBase& lzbase, uint table_max_update_interval, uint table_update_interval_slow_rate)
150
+ {
151
+ m_cur_ofs = 0;
152
+ m_cur_state = 0;
153
+
154
+ if (!m_rep_len_table[0].init2(m_malloc_context, true, CLZBase::cNumHugeMatchCodes + (CLZBase::cMaxMatchLen - CLZBase::cMinMatchLen + 1), table_max_update_interval, table_update_interval_slow_rate, NULL))
155
+ {
156
+ LZHAM_LOG_ERROR(8000);
157
+ return false;
158
+ }
159
+ if (!m_rep_len_table[1].assign(m_rep_len_table[0]))
160
+ {
161
+ LZHAM_LOG_ERROR(8001);
162
+ return false;
163
+ }
164
+
165
+ if (!m_large_len_table[0].init2(m_malloc_context, true, CLZBase::cNumHugeMatchCodes + CLZBase::cLZXNumSecondaryLengths, table_max_update_interval, table_update_interval_slow_rate, NULL))
166
+ {
167
+ LZHAM_LOG_ERROR(8002);
168
+ return false;
169
+ }
170
+ if (!m_large_len_table[1].assign(m_large_len_table[0]))
171
+ {
172
+ LZHAM_LOG_ERROR(8003);
173
+ return false;
174
+ }
175
+
176
+ if (!m_main_table.init2(m_malloc_context, true, CLZBase::cLZXNumSpecialLengths + (lzbase.m_num_lzx_slots - CLZBase::cLZXLowestUsableMatchSlot) * 8, table_max_update_interval, table_update_interval_slow_rate, NULL))
177
+ {
178
+ LZHAM_LOG_ERROR(8004);
179
+ return false;
180
+ }
181
+ if (!m_dist_lsb_table.init2(m_malloc_context, true, 16, table_max_update_interval, table_update_interval_slow_rate, NULL))
182
+ {
183
+ LZHAM_LOG_ERROR(8005);
184
+ return false;
185
+ }
186
+
187
+ if (!m_lit_table.init2(m_malloc_context, true, 256, table_max_update_interval, table_update_interval_slow_rate, NULL))
188
+ {
189
+ LZHAM_LOG_ERROR(8006);
190
+ return false;
191
+ }
192
+
193
+ if (!m_delta_lit_table.init2(m_malloc_context, true, 256, table_max_update_interval, table_update_interval_slow_rate, NULL))
194
+ {
195
+ LZHAM_LOG_ERROR(8007);
196
+ return false;
197
+ }
198
+
199
+ m_match_hist[0] = 1;
200
+ m_match_hist[1] = 1;
201
+ m_match_hist[2] = 1;
202
+ m_match_hist[3] = 1;
203
+
204
+ return true;
205
+ }
206
+
207
+ void lzcompressor::state_base::partial_advance(const lzdecision& lzdec)
208
+ {
209
+ if (lzdec.m_len == 0)
210
+ {
211
+ if (m_cur_state < 4) m_cur_state = 0; else if (m_cur_state < 10) m_cur_state -= 3; else m_cur_state -= 6;
212
+ }
213
+ else
214
+ {
215
+ if (lzdec.m_dist < 0)
216
+ {
217
+ int match_hist_index = -lzdec.m_dist - 1;
218
+
219
+ if (!match_hist_index)
220
+ {
221
+ if (lzdec.m_len == 1)
222
+ {
223
+ m_cur_state = (m_cur_state < CLZBase::cNumLitStates) ? 9 : 11;
224
+ }
225
+ else
226
+ {
227
+ m_cur_state = (m_cur_state < CLZBase::cNumLitStates) ? 8 : 11;
228
+ }
229
+ }
230
+ else
231
+ {
232
+ if (match_hist_index == 1)
233
+ {
234
+ std::swap(m_match_hist[0], m_match_hist[1]);
235
+ }
236
+ else if (match_hist_index == 2)
237
+ {
238
+ int dist = m_match_hist[2];
239
+ m_match_hist[2] = m_match_hist[1];
240
+ m_match_hist[1] = m_match_hist[0];
241
+ m_match_hist[0] = dist;
242
+ }
243
+ else
244
+ {
245
+ LZHAM_ASSERT(match_hist_index == 3);
246
+
247
+ int dist = m_match_hist[3];
248
+ m_match_hist[3] = m_match_hist[2];
249
+ m_match_hist[2] = m_match_hist[1];
250
+ m_match_hist[1] = m_match_hist[0];
251
+ m_match_hist[0] = dist;
252
+ }
253
+
254
+ m_cur_state = (m_cur_state < CLZBase::cNumLitStates) ? 8 : 11;
255
+ }
256
+ }
257
+ else
258
+ {
259
+ // full
260
+ LZHAM_ASSUME(CLZBase::cMatchHistSize == 4);
261
+ m_match_hist[3] = m_match_hist[2];
262
+ m_match_hist[2] = m_match_hist[1];
263
+ m_match_hist[1] = m_match_hist[0];
264
+ m_match_hist[0] = lzdec.m_dist;
265
+
266
+ m_cur_state = (m_cur_state < CLZBase::cNumLitStates) ? CLZBase::cNumLitStates : CLZBase::cNumLitStates + 3;
267
+ }
268
+ }
269
+
270
+ m_cur_ofs = lzdec.m_pos + lzdec.get_len();
271
+ }
272
+
273
+ uint lzcompressor::state::get_pred_char(const search_accelerator& dict, int pos, int backward_ofs) const
274
+ {
275
+ LZHAM_ASSERT(pos >= (int)m_block_start_dict_ofs);
276
+ int limit = pos - m_block_start_dict_ofs;
277
+ if (backward_ofs > limit)
278
+ return 0;
279
+ return dict[pos - backward_ofs];
280
+ }
281
+
282
+ bit_cost_t lzcompressor::state::get_cost(CLZBase& lzbase, const search_accelerator& dict, const lzdecision& lzdec) const
283
+ {
284
+ //const uint lit_pred0 = get_pred_char(dict, lzdec.m_pos, 1);
285
+
286
+ uint is_match_model_index = LZHAM_IS_MATCH_MODEL_INDEX(m_cur_state);
287
+ LZHAM_ASSERT(is_match_model_index < LZHAM_ARRAY_SIZE(m_is_match_model));
288
+ bit_cost_t cost = m_is_match_model[is_match_model_index].get_cost(lzdec.is_match());
289
+
290
+ if (!lzdec.is_match())
291
+ {
292
+ const uint lit = dict[lzdec.m_pos];
293
+
294
+ if (m_cur_state < CLZBase::cNumLitStates)
295
+ {
296
+ // literal
297
+ cost += m_lit_table.get_cost(lit);
298
+ }
299
+ else
300
+ {
301
+ // delta literal
302
+ const uint rep_lit0 = dict[(lzdec.m_pos - m_match_hist[0]) & dict.m_max_dict_size_mask];
303
+
304
+ uint delta_lit = rep_lit0 ^ lit;
305
+
306
+ cost += m_delta_lit_table.get_cost(delta_lit);
307
+ }
308
+ }
309
+ else
310
+ {
311
+ // match
312
+ if (lzdec.m_dist < 0)
313
+ {
314
+ // rep match
315
+ cost += m_is_rep_model[m_cur_state].get_cost(1);
316
+
317
+ int match_hist_index = -lzdec.m_dist - 1;
318
+
319
+ if (!match_hist_index)
320
+ {
321
+ // rep0 match
322
+ cost += m_is_rep0_model[m_cur_state].get_cost(1);
323
+
324
+ if (lzdec.m_len == 1)
325
+ {
326
+ // single byte rep0
327
+ cost += m_is_rep0_single_byte_model[m_cur_state].get_cost(1);
328
+ }
329
+ else
330
+ {
331
+ // normal rep0
332
+ cost += m_is_rep0_single_byte_model[m_cur_state].get_cost(0);
333
+
334
+ if (lzdec.m_len > CLZBase::cMaxMatchLen)
335
+ {
336
+ cost += get_huge_match_code_len(lzdec.m_len) + m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates].get_cost((CLZBase::cMaxMatchLen + 1) - CLZBase::cMinMatchLen);
337
+ }
338
+ else
339
+ {
340
+ cost += m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates].get_cost(lzdec.m_len - CLZBase::cMinMatchLen);
341
+ }
342
+ }
343
+ }
344
+ else
345
+ {
346
+ if (lzdec.m_len > CLZBase::cMaxMatchLen)
347
+ {
348
+ cost += get_huge_match_code_len(lzdec.m_len) + m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates].get_cost((CLZBase::cMaxMatchLen + 1) - CLZBase::cMinMatchLen);
349
+ }
350
+ else
351
+ {
352
+ cost += m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates].get_cost(lzdec.m_len - CLZBase::cMinMatchLen);
353
+ }
354
+
355
+ // rep1-rep3 match
356
+ cost += m_is_rep0_model[m_cur_state].get_cost(0);
357
+
358
+ if (match_hist_index == 1)
359
+ {
360
+ // rep1
361
+ cost += m_is_rep1_model[m_cur_state].get_cost(1);
362
+ }
363
+ else
364
+ {
365
+ cost += m_is_rep1_model[m_cur_state].get_cost(0);
366
+
367
+ if (match_hist_index == 2)
368
+ {
369
+ // rep2
370
+ cost += m_is_rep2_model[m_cur_state].get_cost(1);
371
+ }
372
+ else
373
+ {
374
+ LZHAM_ASSERT(match_hist_index == 3);
375
+ // rep3
376
+ cost += m_is_rep2_model[m_cur_state].get_cost(0);
377
+ }
378
+ }
379
+ }
380
+ }
381
+ else
382
+ {
383
+ cost += m_is_rep_model[m_cur_state].get_cost(0);
384
+
385
+ LZHAM_ASSERT(lzdec.m_len >= CLZBase::cMinMatchLen);
386
+
387
+ // full match
388
+ uint match_slot, match_extra;
389
+ lzbase.compute_lzx_position_slot(lzdec.m_dist, match_slot, match_extra);
390
+
391
+ uint match_low_sym = 0;
392
+ if (lzdec.m_len >= 9)
393
+ {
394
+ match_low_sym = 7;
395
+ if (lzdec.m_len > CLZBase::cMaxMatchLen)
396
+ {
397
+ cost += get_huge_match_code_len(lzdec.m_len) + m_large_len_table[m_cur_state >= CLZBase::cNumLitStates].get_cost((CLZBase::cMaxMatchLen + 1) - 9);
398
+ }
399
+ else
400
+ {
401
+ cost += m_large_len_table[m_cur_state >= CLZBase::cNumLitStates].get_cost(lzdec.m_len - 9);
402
+ }
403
+ }
404
+ else
405
+ match_low_sym = lzdec.m_len - 2;
406
+
407
+ uint match_high_sym = 0;
408
+
409
+ LZHAM_ASSERT(match_slot >= CLZBase::cLZXLowestUsableMatchSlot && (match_slot < lzbase.m_num_lzx_slots));
410
+ match_high_sym = match_slot - CLZBase::cLZXLowestUsableMatchSlot;
411
+
412
+ uint main_sym = match_low_sym | (match_high_sym << 3);
413
+
414
+ cost += m_main_table.get_cost(CLZBase::cLZXNumSpecialLengths + main_sym);
415
+
416
+ uint num_extra_bits = lzbase.m_lzx_position_extra_bits[match_slot];
417
+ if (num_extra_bits < 3)
418
+ cost += convert_to_scaled_bitcost(num_extra_bits);
419
+ else
420
+ {
421
+ if (num_extra_bits > 4)
422
+ cost += convert_to_scaled_bitcost(num_extra_bits - 4);
423
+
424
+ cost += m_dist_lsb_table.get_cost(match_extra & 15);
425
+ }
426
+ }
427
+ }
428
+
429
+ return cost;
430
+ }
431
+
432
+ bit_cost_t lzcompressor::state::get_len2_match_cost(CLZBase& lzbase, uint dict_pos, uint len2_match_dist, uint is_match_model_index)
433
+ {
434
+ LZHAM_NOTE_UNUSED(dict_pos);
435
+
436
+ bit_cost_t cost = m_is_match_model[is_match_model_index].get_cost(1);
437
+
438
+ cost += m_is_rep_model[m_cur_state].get_cost(0);
439
+
440
+ // full match
441
+ uint match_slot, match_extra;
442
+ lzbase.compute_lzx_position_slot(len2_match_dist, match_slot, match_extra);
443
+
444
+ const uint match_len = 2;
445
+ uint match_low_sym = match_len - 2;
446
+
447
+ uint match_high_sym = 0;
448
+
449
+ LZHAM_ASSERT(match_slot >= CLZBase::cLZXLowestUsableMatchSlot && (match_slot < lzbase.m_num_lzx_slots));
450
+ match_high_sym = match_slot - CLZBase::cLZXLowestUsableMatchSlot;
451
+
452
+ uint main_sym = match_low_sym | (match_high_sym << 3);
453
+
454
+ cost += m_main_table.get_cost(CLZBase::cLZXNumSpecialLengths + main_sym);
455
+
456
+ uint num_extra_bits = lzbase.m_lzx_position_extra_bits[match_slot];
457
+ if (num_extra_bits < 3)
458
+ cost += convert_to_scaled_bitcost(num_extra_bits);
459
+ else
460
+ {
461
+ if (num_extra_bits > 4)
462
+ cost += convert_to_scaled_bitcost(num_extra_bits - 4);
463
+
464
+ cost += m_dist_lsb_table.get_cost(match_extra & 15);
465
+ }
466
+
467
+ return cost;
468
+ }
469
+
470
+ bit_cost_t lzcompressor::state::get_lit_cost(CLZBase& lzbase, const search_accelerator& dict, uint dict_pos, uint lit_pred0, uint is_match_model_index) const
471
+ {
472
+ LZHAM_NOTE_UNUSED(lzbase);
473
+ LZHAM_NOTE_UNUSED(lit_pred0);
474
+
475
+ bit_cost_t cost = m_is_match_model[is_match_model_index].get_cost(0);
476
+
477
+ const uint lit = dict[dict_pos];
478
+
479
+ if (m_cur_state < CLZBase::cNumLitStates)
480
+ {
481
+ // literal
482
+ cost += m_lit_table.get_cost(lit);
483
+ }
484
+ else
485
+ {
486
+ // delta literal
487
+ const uint rep_lit0 = dict[(dict_pos - m_match_hist[0]) & dict.m_max_dict_size_mask];
488
+
489
+ uint delta_lit = rep_lit0 ^ lit;
490
+
491
+ cost += m_delta_lit_table.get_cost(delta_lit);
492
+ }
493
+
494
+ return cost;
495
+ }
496
+
497
+ void lzcompressor::state::get_rep_match_costs(uint dict_pos, bit_cost_t *pBitcosts, uint match_hist_index, int min_len, int max_len, uint is_match_model_index) const
498
+ {
499
+ LZHAM_NOTE_UNUSED(dict_pos);
500
+ // match
501
+ const quasi_adaptive_huffman_data_model &rep_len_table = m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates];
502
+
503
+ bit_cost_t base_cost = m_is_match_model[is_match_model_index].get_cost(1);
504
+
505
+ base_cost += m_is_rep_model[m_cur_state].get_cost(1);
506
+
507
+ if (!match_hist_index)
508
+ {
509
+ // rep0 match
510
+ base_cost += m_is_rep0_model[m_cur_state].get_cost(1);
511
+ }
512
+ else
513
+ {
514
+ // rep1-rep3 matches
515
+ base_cost += m_is_rep0_model[m_cur_state].get_cost(0);
516
+
517
+ if (match_hist_index == 1)
518
+ {
519
+ // rep1
520
+ base_cost += m_is_rep1_model[m_cur_state].get_cost(1);
521
+ }
522
+ else
523
+ {
524
+ base_cost += m_is_rep1_model[m_cur_state].get_cost(0);
525
+
526
+ if (match_hist_index == 2)
527
+ {
528
+ // rep2
529
+ base_cost += m_is_rep2_model[m_cur_state].get_cost(1);
530
+ }
531
+ else
532
+ {
533
+ // rep3
534
+ base_cost += m_is_rep2_model[m_cur_state].get_cost(0);
535
+ }
536
+ }
537
+ }
538
+
539
+ // rep match
540
+ if (!match_hist_index)
541
+ {
542
+ if (min_len == 1)
543
+ {
544
+ // single byte rep0
545
+ pBitcosts[1] = base_cost + m_is_rep0_single_byte_model[m_cur_state].get_cost(1);
546
+ min_len++;
547
+ }
548
+
549
+ bit_cost_t rep0_match_base_cost = base_cost + m_is_rep0_single_byte_model[m_cur_state].get_cost(0);
550
+ for (int match_len = min_len; match_len <= max_len; match_len++)
551
+ {
552
+ // normal rep0
553
+ if (match_len > CLZBase::cMaxMatchLen)
554
+ {
555
+ pBitcosts[match_len] = get_huge_match_code_len(match_len) + rep0_match_base_cost + rep_len_table.get_cost((CLZBase::cMaxMatchLen + 1) - CLZBase::cMinMatchLen);
556
+ }
557
+ else
558
+ {
559
+ pBitcosts[match_len] = rep0_match_base_cost + rep_len_table.get_cost(match_len - CLZBase::cMinMatchLen);
560
+ }
561
+ }
562
+ }
563
+ else
564
+ {
565
+ for (int match_len = min_len; match_len <= max_len; match_len++)
566
+ {
567
+ if (match_len > CLZBase::cMaxMatchLen)
568
+ {
569
+ pBitcosts[match_len] = get_huge_match_code_len(match_len) + base_cost + rep_len_table.get_cost((CLZBase::cMaxMatchLen + 1) - CLZBase::cMinMatchLen);
570
+ }
571
+ else
572
+ {
573
+ pBitcosts[match_len] = base_cost + rep_len_table.get_cost(match_len - CLZBase::cMinMatchLen);
574
+ }
575
+ }
576
+ }
577
+ }
578
+
579
+ void lzcompressor::state::get_full_match_costs(CLZBase& lzbase, uint dict_pos, bit_cost_t *pBitcosts, uint match_dist, int min_len, int max_len, uint is_match_model_index) const
580
+ {
581
+ LZHAM_NOTE_UNUSED(dict_pos);
582
+ LZHAM_ASSERT(min_len >= CLZBase::cMinMatchLen);
583
+
584
+ bit_cost_t cost = m_is_match_model[is_match_model_index].get_cost(1);
585
+
586
+ cost += m_is_rep_model[m_cur_state].get_cost(0);
587
+
588
+ uint match_slot, match_extra;
589
+ lzbase.compute_lzx_position_slot(match_dist, match_slot, match_extra);
590
+ LZHAM_ASSERT(match_slot >= CLZBase::cLZXLowestUsableMatchSlot && (match_slot < lzbase.m_num_lzx_slots));
591
+
592
+ uint num_extra_bits = lzbase.m_lzx_position_extra_bits[match_slot];
593
+
594
+ if (num_extra_bits < 3)
595
+ cost += convert_to_scaled_bitcost(num_extra_bits);
596
+ else
597
+ {
598
+ if (num_extra_bits > 4)
599
+ cost += convert_to_scaled_bitcost(num_extra_bits - 4);
600
+
601
+ cost += m_dist_lsb_table.get_cost(match_extra & 15);
602
+ }
603
+
604
+ uint match_high_sym = match_slot - CLZBase::cLZXLowestUsableMatchSlot;
605
+
606
+ const quasi_adaptive_huffman_data_model &large_len_table = m_large_len_table[m_cur_state >= CLZBase::cNumLitStates];
607
+
608
+ for (int match_len = min_len; match_len <= max_len; match_len++)
609
+ {
610
+ bit_cost_t len_cost = cost;
611
+
612
+ uint match_low_sym = 0;
613
+ if (match_len >= 9)
614
+ {
615
+ match_low_sym = 7;
616
+ if (match_len > CLZBase::cMaxMatchLen)
617
+ {
618
+ len_cost += get_huge_match_code_len(match_len) + large_len_table.get_cost((CLZBase::cMaxMatchLen + 1) - 9);
619
+ }
620
+ else
621
+ {
622
+ len_cost += large_len_table.get_cost(match_len - 9);
623
+ }
624
+ }
625
+ else
626
+ match_low_sym = match_len - 2;
627
+
628
+ uint main_sym = match_low_sym | (match_high_sym << 3);
629
+
630
+ pBitcosts[match_len] = len_cost + m_main_table.get_cost(CLZBase::cLZXNumSpecialLengths + main_sym);
631
+ }
632
+ }
633
+
634
+ bool lzcompressor::state::advance(CLZBase& lzbase, const search_accelerator& dict, const lzdecision& lzdec)
635
+ {
636
+ //const uint lit_pred0 = get_pred_char(dict, lzdec.m_pos, 1);
637
+
638
+ uint is_match_model_index = LZHAM_IS_MATCH_MODEL_INDEX(m_cur_state);
639
+ m_is_match_model[is_match_model_index].update(lzdec.is_match());
640
+
641
+ if (!lzdec.is_match())
642
+ {
643
+ const uint lit = dict[lzdec.m_pos];
644
+
645
+ if (m_cur_state < CLZBase::cNumLitStates)
646
+ {
647
+ // literal
648
+ if (!m_lit_table.update_sym(lit))
649
+ {
650
+ LZHAM_LOG_ERROR(8008);
651
+ return false;
652
+ }
653
+ }
654
+ else
655
+ {
656
+ // delta literal
657
+ const uint rep_lit0 = dict[(lzdec.m_pos - m_match_hist[0]) & dict.m_max_dict_size_mask];
658
+
659
+ uint delta_lit = rep_lit0 ^ lit;
660
+
661
+ if (!m_delta_lit_table.update_sym(delta_lit))
662
+ {
663
+ LZHAM_LOG_ERROR(8009);
664
+ return false;
665
+ }
666
+ }
667
+
668
+ if (m_cur_state < 4) m_cur_state = 0; else if (m_cur_state < 10) m_cur_state -= 3; else m_cur_state -= 6;
669
+ }
670
+ else
671
+ {
672
+ // match
673
+ if (lzdec.m_dist < 0)
674
+ {
675
+ // rep match
676
+ m_is_rep_model[m_cur_state].update(1);
677
+
678
+ int match_hist_index = -lzdec.m_dist - 1;
679
+
680
+ if (!match_hist_index)
681
+ {
682
+ // rep0 match
683
+ m_is_rep0_model[m_cur_state].update(1);
684
+
685
+ if (lzdec.m_len == 1)
686
+ {
687
+ // single byte rep0
688
+ m_is_rep0_single_byte_model[m_cur_state].update(1);
689
+
690
+ m_cur_state = (m_cur_state < CLZBase::cNumLitStates) ? 9 : 11;
691
+ }
692
+ else
693
+ {
694
+ // normal rep0
695
+ m_is_rep0_single_byte_model[m_cur_state].update(0);
696
+
697
+ if (lzdec.m_len > CLZBase::cMaxMatchLen)
698
+ {
699
+ if (!m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates].update_sym((CLZBase::cMaxMatchLen + 1) - CLZBase::cMinMatchLen))
700
+ {
701
+ LZHAM_LOG_ERROR(8010);
702
+ return false;
703
+ }
704
+ }
705
+ else
706
+ {
707
+ if (!m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates].update_sym(lzdec.m_len - CLZBase::cMinMatchLen))
708
+ {
709
+ LZHAM_LOG_ERROR(8011);
710
+ return false;
711
+ }
712
+ }
713
+
714
+ m_cur_state = (m_cur_state < CLZBase::cNumLitStates) ? 8 : 11;
715
+ }
716
+ }
717
+ else
718
+ {
719
+ // rep1-rep3 match
720
+ m_is_rep0_model[m_cur_state].update(0);
721
+
722
+ if (lzdec.m_len > CLZBase::cMaxMatchLen)
723
+ {
724
+ if (!m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates].update_sym((CLZBase::cMaxMatchLen + 1) - CLZBase::cMinMatchLen))
725
+ {
726
+ LZHAM_LOG_ERROR(8012);
727
+ return false;
728
+ }
729
+ }
730
+ else
731
+ {
732
+ if (!m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates].update_sym(lzdec.m_len - CLZBase::cMinMatchLen))
733
+ {
734
+ LZHAM_LOG_ERROR(8013);
735
+ return false;
736
+ }
737
+ }
738
+
739
+ if (match_hist_index == 1)
740
+ {
741
+ // rep1
742
+ m_is_rep1_model[m_cur_state].update(1);
743
+
744
+ std::swap(m_match_hist[0], m_match_hist[1]);
745
+ }
746
+ else
747
+ {
748
+ m_is_rep1_model[m_cur_state].update(0);
749
+
750
+ if (match_hist_index == 2)
751
+ {
752
+ // rep2
753
+ m_is_rep2_model[m_cur_state].update(1);
754
+
755
+ int dist = m_match_hist[2];
756
+ m_match_hist[2] = m_match_hist[1];
757
+ m_match_hist[1] = m_match_hist[0];
758
+ m_match_hist[0] = dist;
759
+ }
760
+ else
761
+ {
762
+ // rep3
763
+ m_is_rep2_model[m_cur_state].update(0);
764
+
765
+ int dist = m_match_hist[3];
766
+ m_match_hist[3] = m_match_hist[2];
767
+ m_match_hist[2] = m_match_hist[1];
768
+ m_match_hist[1] = m_match_hist[0];
769
+ m_match_hist[0] = dist;
770
+ }
771
+ }
772
+
773
+ m_cur_state = (m_cur_state < CLZBase::cNumLitStates) ? 8 : 11;
774
+ }
775
+ }
776
+ else
777
+ {
778
+ m_is_rep_model[m_cur_state].update(0);
779
+
780
+ LZHAM_ASSERT(lzdec.m_len >= CLZBase::cMinMatchLen);
781
+
782
+ // full match
783
+ uint match_slot, match_extra;
784
+ lzbase.compute_lzx_position_slot(lzdec.m_dist, match_slot, match_extra);
785
+
786
+ uint match_low_sym = 0;
787
+ int large_len_sym = -1;
788
+ if (lzdec.m_len >= 9)
789
+ {
790
+ match_low_sym = 7;
791
+
792
+ large_len_sym = lzdec.m_len - 9;
793
+ }
794
+ else
795
+ match_low_sym = lzdec.m_len - 2;
796
+
797
+ uint match_high_sym = 0;
798
+
799
+ LZHAM_ASSERT(match_slot >= CLZBase::cLZXLowestUsableMatchSlot && (match_slot < lzbase.m_num_lzx_slots));
800
+ match_high_sym = match_slot - CLZBase::cLZXLowestUsableMatchSlot;
801
+
802
+ uint main_sym = match_low_sym | (match_high_sym << 3);
803
+
804
+ if (!m_main_table.update_sym(CLZBase::cLZXNumSpecialLengths + main_sym))
805
+ {
806
+ LZHAM_LOG_ERROR(8014);
807
+ return false;
808
+ }
809
+
810
+ if (large_len_sym >= 0)
811
+ {
812
+ if (lzdec.m_len > CLZBase::cMaxMatchLen)
813
+ {
814
+ if (!m_large_len_table[m_cur_state >= CLZBase::cNumLitStates].update_sym((CLZBase::cMaxMatchLen + 1) - 9))
815
+ {
816
+ LZHAM_LOG_ERROR(8015);
817
+ return false;
818
+ }
819
+ }
820
+ else
821
+ {
822
+ if (!m_large_len_table[m_cur_state >= CLZBase::cNumLitStates].update_sym(large_len_sym))
823
+ {
824
+ LZHAM_LOG_ERROR(8016);
825
+ return false;
826
+ }
827
+ }
828
+ }
829
+
830
+ uint num_extra_bits = lzbase.m_lzx_position_extra_bits[match_slot];
831
+ if (num_extra_bits >= 3)
832
+ {
833
+ if (!m_dist_lsb_table.update_sym(match_extra & 15))
834
+ {
835
+ LZHAM_LOG_ERROR(8017);
836
+ return false;
837
+ }
838
+ }
839
+
840
+ update_match_hist(lzdec.m_dist);
841
+
842
+ m_cur_state = (m_cur_state < CLZBase::cNumLitStates) ? CLZBase::cNumLitStates : CLZBase::cNumLitStates + 3;
843
+ }
844
+ }
845
+
846
+ m_cur_ofs = lzdec.m_pos + lzdec.get_len();
847
+ return true;
848
+ }
849
+
850
+ bool lzcompressor::state::encode(symbol_codec& codec, CLZBase& lzbase, const search_accelerator& dict, const lzdecision& lzdec)
851
+ {
852
+ //const uint lit_pred0 = get_pred_char(dict, lzdec.m_pos, 1);
853
+
854
+ uint is_match_model_index = LZHAM_IS_MATCH_MODEL_INDEX(m_cur_state);
855
+ if (!codec.encode(lzdec.is_match(), m_is_match_model[is_match_model_index]))
856
+ {
857
+ LZHAM_LOG_ERROR(8018);
858
+ return false;
859
+ }
860
+
861
+ if (!lzdec.is_match())
862
+ {
863
+ const uint lit = dict[lzdec.m_pos];
864
+
865
+ #ifdef LZHAM_LZDEBUG
866
+ if (!codec.encode_bits(lit, 8))
867
+ {
868
+ LZHAM_LOG_ERROR(8019);
869
+ return false;
870
+ }
871
+ #endif
872
+
873
+ if (m_cur_state < CLZBase::cNumLitStates)
874
+ {
875
+ // literal
876
+ if (!codec.encode(lit, m_lit_table))
877
+ {
878
+ LZHAM_LOG_ERROR(8020);
879
+ return false;
880
+ }
881
+ }
882
+ else
883
+ {
884
+ // delta literal
885
+ const uint rep_lit0 = dict[(lzdec.m_pos - m_match_hist[0]) & dict.m_max_dict_size_mask];
886
+
887
+ uint delta_lit = rep_lit0 ^ lit;
888
+
889
+ #ifdef LZHAM_LZDEBUG
890
+ if (!codec.encode_bits(rep_lit0, 8))
891
+ {
892
+ LZHAM_LOG_ERROR(8021);
893
+ return false;
894
+ }
895
+ #endif
896
+
897
+ if (!codec.encode(delta_lit, m_delta_lit_table))
898
+ {
899
+ LZHAM_LOG_ERROR(8022);
900
+ return false;
901
+ }
902
+ }
903
+
904
+ if (m_cur_state < 4) m_cur_state = 0; else if (m_cur_state < 10) m_cur_state -= 3; else m_cur_state -= 6;
905
+ }
906
+ else
907
+ {
908
+ // match
909
+ if (lzdec.m_dist < 0)
910
+ {
911
+ // rep match
912
+ if (!codec.encode(1, m_is_rep_model[m_cur_state]))
913
+ {
914
+ LZHAM_LOG_ERROR(8023);
915
+ return false;
916
+ }
917
+
918
+ int match_hist_index = -lzdec.m_dist - 1;
919
+
920
+ if (!match_hist_index)
921
+ {
922
+ // rep0 match
923
+ if (!codec.encode(1, m_is_rep0_model[m_cur_state]))
924
+ {
925
+ LZHAM_LOG_ERROR(8024);
926
+ return false;
927
+ }
928
+
929
+ if (lzdec.m_len == 1)
930
+ {
931
+ // single byte rep0
932
+ if (!codec.encode(1, m_is_rep0_single_byte_model[m_cur_state]))
933
+ {
934
+ LZHAM_LOG_ERROR(8025);
935
+ return false;
936
+ }
937
+
938
+ m_cur_state = (m_cur_state < CLZBase::cNumLitStates) ? 9 : 11;
939
+ }
940
+ else
941
+ {
942
+ // normal rep0
943
+ if (!codec.encode(0, m_is_rep0_single_byte_model[m_cur_state]))
944
+ {
945
+ LZHAM_LOG_ERROR(8026);
946
+ return false;
947
+ }
948
+
949
+ if (lzdec.m_len > CLZBase::cMaxMatchLen)
950
+ {
951
+ if (!codec.encode((CLZBase::cMaxMatchLen + 1) - CLZBase::cMinMatchLen, m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates]))
952
+ {
953
+ LZHAM_LOG_ERROR(8027);
954
+ return false;
955
+ }
956
+ if (!codec.encode_bits(get_huge_match_code_bits(lzdec.m_len), get_huge_match_code_len(lzdec.m_len)))
957
+ {
958
+ LZHAM_LOG_ERROR(8028);
959
+ return false;
960
+ }
961
+ }
962
+ else
963
+ {
964
+ if (!codec.encode(lzdec.m_len - CLZBase::cMinMatchLen, m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates]))
965
+ {
966
+ LZHAM_LOG_ERROR(8029);
967
+ return false;
968
+ }
969
+ }
970
+
971
+ m_cur_state = (m_cur_state < CLZBase::cNumLitStates) ? 8 : 11;
972
+ }
973
+ }
974
+ else
975
+ {
976
+ // rep1-rep3 match
977
+ if (!codec.encode(0, m_is_rep0_model[m_cur_state]))
978
+ {
979
+ LZHAM_LOG_ERROR(8030);
980
+ return false;
981
+ }
982
+
983
+ if (lzdec.m_len > CLZBase::cMaxMatchLen)
984
+ {
985
+ if (!codec.encode((CLZBase::cMaxMatchLen + 1) - CLZBase::cMinMatchLen, m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates]))
986
+ {
987
+ LZHAM_LOG_ERROR(8031);
988
+ return false;
989
+ }
990
+ if (!codec.encode_bits(get_huge_match_code_bits(lzdec.m_len), get_huge_match_code_len(lzdec.m_len)))
991
+ {
992
+ LZHAM_LOG_ERROR(8032);
993
+ return false;
994
+ }
995
+ }
996
+ else
997
+ {
998
+ if (!codec.encode(lzdec.m_len - CLZBase::cMinMatchLen, m_rep_len_table[m_cur_state >= CLZBase::cNumLitStates]))
999
+ {
1000
+ LZHAM_LOG_ERROR(8033);
1001
+ return false;
1002
+ }
1003
+ }
1004
+
1005
+ if (match_hist_index == 1)
1006
+ {
1007
+ // rep1
1008
+ if (!codec.encode(1, m_is_rep1_model[m_cur_state]))
1009
+ {
1010
+ LZHAM_LOG_ERROR(8034);
1011
+ return false;
1012
+ }
1013
+
1014
+ std::swap(m_match_hist[0], m_match_hist[1]);
1015
+ }
1016
+ else
1017
+ {
1018
+ if (!codec.encode(0, m_is_rep1_model[m_cur_state]))
1019
+ {
1020
+ LZHAM_LOG_ERROR(8035);
1021
+ return false;
1022
+ }
1023
+
1024
+ if (match_hist_index == 2)
1025
+ {
1026
+ // rep2
1027
+ if (!codec.encode(1, m_is_rep2_model[m_cur_state]))
1028
+ {
1029
+ LZHAM_LOG_ERROR(8036);
1030
+ return false;
1031
+ }
1032
+
1033
+ int dist = m_match_hist[2];
1034
+ m_match_hist[2] = m_match_hist[1];
1035
+ m_match_hist[1] = m_match_hist[0];
1036
+ m_match_hist[0] = dist;
1037
+ }
1038
+ else
1039
+ {
1040
+ // rep3
1041
+ if (!codec.encode(0, m_is_rep2_model[m_cur_state]))
1042
+ {
1043
+ LZHAM_LOG_ERROR(8037);
1044
+ return false;
1045
+ }
1046
+
1047
+ int dist = m_match_hist[3];
1048
+ m_match_hist[3] = m_match_hist[2];
1049
+ m_match_hist[2] = m_match_hist[1];
1050
+ m_match_hist[1] = m_match_hist[0];
1051
+ m_match_hist[0] = dist;
1052
+ }
1053
+ }
1054
+
1055
+ m_cur_state = (m_cur_state < CLZBase::cNumLitStates) ? 8 : 11;
1056
+ }
1057
+ }
1058
+ else
1059
+ {
1060
+ if (!codec.encode(0, m_is_rep_model[m_cur_state]))
1061
+ {
1062
+ LZHAM_LOG_ERROR(8038);
1063
+ return false;
1064
+ }
1065
+
1066
+ LZHAM_ASSERT(lzdec.m_len >= CLZBase::cMinMatchLen);
1067
+
1068
+ // full match
1069
+ uint match_slot, match_extra;
1070
+ lzbase.compute_lzx_position_slot(lzdec.m_dist, match_slot, match_extra);
1071
+
1072
+ uint match_low_sym = 0;
1073
+ int large_len_sym = -1;
1074
+ if (lzdec.m_len >= 9)
1075
+ {
1076
+ match_low_sym = 7;
1077
+
1078
+ large_len_sym = lzdec.m_len - 9;
1079
+ }
1080
+ else
1081
+ match_low_sym = lzdec.m_len - 2;
1082
+
1083
+ uint match_high_sym = 0;
1084
+
1085
+ LZHAM_ASSERT(match_slot >= CLZBase::cLZXLowestUsableMatchSlot && (match_slot < lzbase.m_num_lzx_slots));
1086
+ match_high_sym = match_slot - CLZBase::cLZXLowestUsableMatchSlot;
1087
+
1088
+ uint main_sym = match_low_sym | (match_high_sym << 3);
1089
+
1090
+ if (!codec.encode(CLZBase::cLZXNumSpecialLengths + main_sym, m_main_table))
1091
+ {
1092
+ LZHAM_LOG_ERROR(8039);
1093
+ return false;
1094
+ }
1095
+
1096
+ if (large_len_sym >= 0)
1097
+ {
1098
+ if (lzdec.m_len > CLZBase::cMaxMatchLen)
1099
+ {
1100
+ if (!codec.encode((CLZBase::cMaxMatchLen + 1) - 9, m_large_len_table[m_cur_state >= CLZBase::cNumLitStates]))
1101
+ {
1102
+ LZHAM_LOG_ERROR(8040);
1103
+ return false;
1104
+ }
1105
+ if (!codec.encode_bits(get_huge_match_code_bits(lzdec.m_len), get_huge_match_code_len(lzdec.m_len)))
1106
+ {
1107
+ LZHAM_LOG_ERROR(8041);
1108
+ return false;
1109
+ }
1110
+ }
1111
+ else
1112
+ {
1113
+ if (!codec.encode(large_len_sym, m_large_len_table[m_cur_state >= CLZBase::cNumLitStates]))
1114
+ {
1115
+ LZHAM_LOG_ERROR(8042);
1116
+ return false;
1117
+ }
1118
+ }
1119
+ }
1120
+
1121
+ uint num_extra_bits = lzbase.m_lzx_position_extra_bits[match_slot];
1122
+ if (num_extra_bits < 3)
1123
+ {
1124
+ if (!codec.encode_bits(match_extra, num_extra_bits))
1125
+ {
1126
+ LZHAM_LOG_ERROR(8043);
1127
+ return false;
1128
+ }
1129
+ }
1130
+ else
1131
+ {
1132
+ if (num_extra_bits > 4)
1133
+ {
1134
+ if (!codec.encode_bits((match_extra >> 4), num_extra_bits - 4))
1135
+ {
1136
+ LZHAM_LOG_ERROR(8044);
1137
+ return false;
1138
+ }
1139
+ }
1140
+
1141
+ if (!codec.encode(match_extra & 15, m_dist_lsb_table))
1142
+ {
1143
+ LZHAM_LOG_ERROR(8045);
1144
+ return false;
1145
+ }
1146
+ }
1147
+
1148
+ update_match_hist(lzdec.m_dist);
1149
+
1150
+ m_cur_state = (m_cur_state < CLZBase::cNumLitStates) ? CLZBase::cNumLitStates : CLZBase::cNumLitStates + 3;
1151
+ }
1152
+
1153
+ #ifdef LZHAM_LZDEBUG
1154
+ if (!codec.encode_bits(m_match_hist[0], 29))
1155
+ {
1156
+ LZHAM_LOG_ERROR(8046);
1157
+ return false;
1158
+ }
1159
+ #endif
1160
+ }
1161
+
1162
+ m_cur_ofs = lzdec.m_pos + lzdec.get_len();
1163
+ return true;
1164
+ }
1165
+
1166
+ void lzcompressor::state::print(symbol_codec& codec, CLZBase& lzbase, const search_accelerator& dict, const lzdecision& lzdec)
1167
+ {
1168
+ LZHAM_NOTE_UNUSED(codec), LZHAM_NOTE_UNUSED(lzbase), LZHAM_NOTE_UNUSED(dict);
1169
+
1170
+ const uint lit_pred0 = get_pred_char(dict, lzdec.m_pos, 1);
1171
+
1172
+ uint is_match_model_index = LZHAM_IS_MATCH_MODEL_INDEX(m_cur_state);
1173
+
1174
+ printf(" pos: %u, state: %u, match_pred: %u, is_match_model_index: %u, is_match: %u, cost: %f\n",
1175
+ lzdec.m_pos,
1176
+ m_cur_state,
1177
+ lit_pred0, is_match_model_index, lzdec.is_match(), get_cost(lzbase, dict, lzdec) / (float)cBitCostScale);
1178
+
1179
+ if (!lzdec.is_match())
1180
+ {
1181
+ const uint lit = dict[lzdec.m_pos];
1182
+
1183
+ if (m_cur_state < CLZBase::cNumLitStates)
1184
+ {
1185
+ printf("---Regular lit: %u '%c'\n",
1186
+ lit, ((lit >= 32) && (lit <= 127)) ? lit : '.');
1187
+ }
1188
+ else
1189
+ {
1190
+ // delta literal
1191
+ const uint rep_lit0 = dict[(lzdec.m_pos - m_match_hist[0]) & dict.m_max_dict_size_mask];
1192
+
1193
+ uint delta_lit = rep_lit0 ^ lit;
1194
+
1195
+ printf("***Delta lit: %u '%c', Mismatch: %u '%c', Delta: 0x%02X\n",
1196
+ lit, ((lit >= 32) && (lit <= 127)) ? lit : '.',
1197
+ rep_lit0, ((rep_lit0 >= 32) && (rep_lit0 <= 127)) ? rep_lit0 : '.',
1198
+ delta_lit);
1199
+ }
1200
+ }
1201
+ else
1202
+ {
1203
+ uint actual_match_len = dict.get_match_len(0, lzdec.get_match_dist(*this), CLZBase::cMaxMatchLen);
1204
+ LZHAM_ASSERT(actual_match_len >= lzdec.get_len());
1205
+
1206
+ // match
1207
+ if (lzdec.m_dist < 0)
1208
+ {
1209
+ int match_hist_index = -lzdec.m_dist - 1;
1210
+
1211
+ if (!match_hist_index)
1212
+ {
1213
+ if (lzdec.m_len == 1)
1214
+ {
1215
+ printf("!!!Rep 0 len1\n");
1216
+ }
1217
+ else
1218
+ {
1219
+ printf("!!!Rep 0 full len %u\n", lzdec.m_len);
1220
+ }
1221
+ }
1222
+ else
1223
+ {
1224
+ printf("!!!Rep %u full len %u\n", match_hist_index, lzdec.m_len);
1225
+ }
1226
+ }
1227
+ else
1228
+ {
1229
+ LZHAM_ASSERT(lzdec.m_len >= CLZBase::cMinMatchLen);
1230
+
1231
+ // full match
1232
+ uint match_slot, match_extra;
1233
+ lzbase.compute_lzx_position_slot(lzdec.m_dist, match_slot, match_extra);
1234
+
1235
+ uint match_low_sym = 0; LZHAM_NOTE_UNUSED(match_low_sym);
1236
+ int large_len_sym = -1; LZHAM_NOTE_UNUSED(large_len_sym);
1237
+ if (lzdec.m_len >= 9)
1238
+ {
1239
+ match_low_sym = 7;
1240
+
1241
+ large_len_sym = lzdec.m_len - 9;
1242
+ }
1243
+ else
1244
+ match_low_sym = lzdec.m_len - 2;
1245
+
1246
+ uint match_high_sym = 0; LZHAM_NOTE_UNUSED(match_high_sym);
1247
+
1248
+ LZHAM_ASSERT(match_slot >= CLZBase::cLZXLowestUsableMatchSlot && (match_slot < lzbase.m_num_lzx_slots));
1249
+ match_high_sym = match_slot - CLZBase::cLZXLowestUsableMatchSlot;
1250
+
1251
+ //uint main_sym = match_low_sym | (match_high_sym << 3);
1252
+
1253
+ uint num_extra_bits = lzbase.m_lzx_position_extra_bits[match_slot];
1254
+ printf("^^^Full match Len %u Dist %u, Slot %u, ExtraBits: %u", lzdec.m_len, lzdec.m_dist, match_slot, num_extra_bits);
1255
+
1256
+ if (num_extra_bits < 3)
1257
+ {
1258
+ }
1259
+ else
1260
+ {
1261
+ printf(" (Low 4 bits: %u vs. %u)", lzdec.m_dist & 15, match_extra & 15);
1262
+ }
1263
+ printf("\n");
1264
+ }
1265
+
1266
+ if (actual_match_len > lzdec.get_len())
1267
+ {
1268
+ printf(" TRUNCATED match, actual len is %u, shortened by %u\n", actual_match_len, actual_match_len - lzdec.get_len());
1269
+ }
1270
+ }
1271
+ }
1272
+
1273
+ bool lzcompressor::state::encode_eob(symbol_codec& codec, const search_accelerator& dict, uint dict_pos)
1274
+ {
1275
+ LZHAM_NOTE_UNUSED(dict);
1276
+ LZHAM_NOTE_UNUSED(dict_pos);
1277
+
1278
+ #ifdef LZHAM_LZDEBUG
1279
+ if (!codec.encode_bits(CLZBase::cLZHAMDebugSyncMarkerValue, CLZBase::cLZHAMDebugSyncMarkerBits))
1280
+ {
1281
+ LZHAM_LOG_ERROR(8047);
1282
+ return false;
1283
+ }
1284
+ if (!codec.encode_bits(1, 1))
1285
+ {
1286
+ LZHAM_LOG_ERROR(8048);
1287
+ return false;
1288
+ }
1289
+ if (!codec.encode_bits(0, 17))
1290
+ {
1291
+ LZHAM_LOG_ERROR(8049);
1292
+ return false;
1293
+ }
1294
+ if (!codec.encode_bits(m_cur_state, 4))
1295
+ {
1296
+ LZHAM_LOG_ERROR(8050);
1297
+ return false;
1298
+ }
1299
+ #endif
1300
+
1301
+ //const uint match_pred = get_pred_char(dict, dict_pos, 1);
1302
+ uint is_match_model_index = LZHAM_IS_MATCH_MODEL_INDEX(m_cur_state);
1303
+ if (!codec.encode(1, m_is_match_model[is_match_model_index]))
1304
+ {
1305
+ LZHAM_LOG_ERROR(8051);
1306
+ return false;
1307
+ }
1308
+
1309
+ // full match
1310
+ if (!codec.encode(0, m_is_rep_model[m_cur_state]))
1311
+ {
1312
+ LZHAM_LOG_ERROR(8052);
1313
+ return false;
1314
+ }
1315
+
1316
+ return codec.encode(CLZBase::cLZXSpecialCodeEndOfBlockCode, m_main_table);
1317
+ }
1318
+
1319
+ bool lzcompressor::state::encode_reset_state_partial(symbol_codec& codec, const search_accelerator& dict, uint dict_pos)
1320
+ {
1321
+ LZHAM_NOTE_UNUSED(dict);
1322
+ LZHAM_NOTE_UNUSED(dict_pos);
1323
+
1324
+ #ifdef LZHAM_LZDEBUG
1325
+ if (!codec.encode_bits(CLZBase::cLZHAMDebugSyncMarkerValue, CLZBase::cLZHAMDebugSyncMarkerBits))
1326
+ {
1327
+ LZHAM_LOG_ERROR(8053);
1328
+ return false;
1329
+ }
1330
+ if (!codec.encode_bits(1, 1))
1331
+ {
1332
+ LZHAM_LOG_ERROR(8054);
1333
+ return false;
1334
+ }
1335
+ if (!codec.encode_bits(0, 17))
1336
+ {
1337
+ LZHAM_LOG_ERROR(8055);
1338
+ return false;
1339
+ }
1340
+ if (!codec.encode_bits(m_cur_state, 4))
1341
+ {
1342
+ LZHAM_LOG_ERROR(8056);
1343
+ return false;
1344
+ }
1345
+ #endif
1346
+
1347
+ //const uint match_pred = get_pred_char(dict, dict_pos, 1);
1348
+ uint is_match_model_index = LZHAM_IS_MATCH_MODEL_INDEX(m_cur_state);
1349
+ if (!codec.encode(1, m_is_match_model[is_match_model_index]))
1350
+ {
1351
+ LZHAM_LOG_ERROR(8057);
1352
+ return false;
1353
+ }
1354
+
1355
+ // full match
1356
+ if (!codec.encode(0, m_is_rep_model[m_cur_state]))
1357
+ {
1358
+ LZHAM_LOG_ERROR(8058);
1359
+ return false;
1360
+ }
1361
+
1362
+ if (!codec.encode(CLZBase::cLZXSpecialCodePartialStateReset, m_main_table))
1363
+ {
1364
+ LZHAM_LOG_ERROR(8059);
1365
+ return false;
1366
+ }
1367
+
1368
+ reset_state_partial();
1369
+ return true;
1370
+ }
1371
+
1372
+ void lzcompressor::state::update_match_hist(uint match_dist)
1373
+ {
1374
+ LZHAM_ASSUME(CLZBase::cMatchHistSize == 4);
1375
+ m_match_hist[3] = m_match_hist[2];
1376
+ m_match_hist[2] = m_match_hist[1];
1377
+ m_match_hist[1] = m_match_hist[0];
1378
+ m_match_hist[0] = match_dist;
1379
+ }
1380
+
1381
+ int lzcompressor::state::find_match_dist(uint match_dist) const
1382
+ {
1383
+ for (uint match_hist_index = 0; match_hist_index < CLZBase::cMatchHistSize; match_hist_index++)
1384
+ if (match_dist == m_match_hist[match_hist_index])
1385
+ return match_hist_index;
1386
+
1387
+ return -1;
1388
+ }
1389
+
1390
+ void lzcompressor::state::reset_state_partial()
1391
+ {
1392
+ LZHAM_ASSUME(CLZBase::cMatchHistSize == 4);
1393
+ m_match_hist[0] = 1;
1394
+ m_match_hist[1] = 1;
1395
+ m_match_hist[2] = 1;
1396
+ m_match_hist[3] = 1;
1397
+ m_cur_state = 0;
1398
+ }
1399
+
1400
+ void lzcompressor::state::start_of_block(const search_accelerator& dict, uint cur_ofs, uint block_index)
1401
+ {
1402
+ LZHAM_NOTE_UNUSED(dict), LZHAM_NOTE_UNUSED(block_index);
1403
+
1404
+ reset_state_partial();
1405
+
1406
+ m_cur_ofs = cur_ofs;
1407
+ m_block_start_dict_ofs = cur_ofs;
1408
+ }
1409
+
1410
+ void lzcompressor::state::reset_update_rate()
1411
+ {
1412
+ m_lit_table.reset_update_rate();
1413
+ m_delta_lit_table.reset_update_rate();
1414
+
1415
+ m_main_table.reset_update_rate();
1416
+
1417
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_rep_len_table); i++)
1418
+ m_rep_len_table[i].reset_update_rate();
1419
+
1420
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_large_len_table); i++)
1421
+ m_large_len_table[i].reset_update_rate();
1422
+
1423
+ m_dist_lsb_table.reset_update_rate();
1424
+ }
1425
+
1426
+ void lzcompressor::state::reset_tables()
1427
+ {
1428
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_match_model); i++)
1429
+ m_is_match_model[i].clear();
1430
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_rep_model); i++)
1431
+ m_is_rep_model[i].clear();
1432
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_rep0_model); i++)
1433
+ m_is_rep0_model[i].clear();
1434
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_rep0_single_byte_model); i++)
1435
+ m_is_rep0_single_byte_model[i].clear();
1436
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_rep1_model); i++)
1437
+ m_is_rep1_model[i].clear();
1438
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_rep2_model); i++)
1439
+ m_is_rep2_model[i].clear();
1440
+
1441
+ for (uint i = 0; i < 2; i++)
1442
+ {
1443
+ m_rep_len_table[i].reset();
1444
+ m_large_len_table[i].reset();
1445
+ }
1446
+ m_main_table.reset();
1447
+ m_dist_lsb_table.reset();
1448
+
1449
+ m_lit_table.reset();
1450
+ m_delta_lit_table.reset();
1451
+ }
1452
+
1453
+ void lzcompressor::coding_stats::clear()
1454
+ {
1455
+ m_total_bytes = 0;
1456
+ m_total_contexts = 0;
1457
+ m_total_match_bits_cost = 0;
1458
+ m_worst_match_bits_cost = 0;
1459
+ m_total_is_match0_bits_cost = 0;
1460
+ m_total_is_match1_bits_cost = 0;
1461
+ m_context_stats.clear();
1462
+
1463
+ m_total_nonmatches = 0;
1464
+ m_total_matches = 0;
1465
+ m_total_cost = 0.0f;
1466
+
1467
+ m_lit_stats.clear();
1468
+ m_delta_lit_stats.clear();
1469
+
1470
+ m_rep0_len1_stats.clear();
1471
+ for (uint i = 0; i < CLZBase::cMatchHistSize; i++)
1472
+ m_rep_stats[i].clear();
1473
+ m_rep0_len1_stats.clear();
1474
+ m_rep0_len2_plus_stats.clear();
1475
+
1476
+ for (uint i = 0; i <= CLZBase::cMaxMatchLen; i++)
1477
+ m_full_match_stats[i].clear();
1478
+
1479
+ m_total_far_len2_matches = 0;
1480
+ m_total_near_len2_matches = 0;
1481
+
1482
+ m_total_truncated_matches = 0;
1483
+ utils::zero_object(m_match_truncation_len_hist);
1484
+ utils::zero_object(m_match_truncation_hist);
1485
+ utils::zero_object(m_match_type_truncation_hist);
1486
+ utils::zero_object(m_match_type_was_not_truncated_hist);
1487
+
1488
+ m_total_update_rate_resets = 0;
1489
+
1490
+ m_max_len2_dist = 0;
1491
+ }
1492
+
1493
+ void lzcompressor::coding_stats::print()
1494
+ {
1495
+ if (!m_total_contexts)
1496
+ return;
1497
+
1498
+ printf("-----------\n");
1499
+ printf("Coding statistics:\n");
1500
+ printf("Total update rate resets: %u\n", m_total_update_rate_resets);
1501
+ printf("Total Bytes: %u, Total Contexts: %u, Total Cost: %f bits (%f bytes)\nContext ave cost: %f StdDev: %f Min: %f Max: %f\n", m_total_bytes, m_total_contexts, m_total_cost, m_total_cost / 8.0f, m_context_stats.get_average(), m_context_stats.get_std_dev(), m_context_stats.get_min_val(), m_context_stats.get_max_val());
1502
+ printf("Ave bytes per context: %f\n", m_total_bytes / (float)m_total_contexts);
1503
+
1504
+ printf("IsMatch:\n");
1505
+ printf(" Total: %u, Cost: %f (%f bytes), Ave. Cost: %f, Worst Cost: %f\n",
1506
+ m_total_contexts, m_total_match_bits_cost, m_total_match_bits_cost / 8.0f, m_total_match_bits_cost / math::maximum<uint>(1, m_total_contexts), m_worst_match_bits_cost);
1507
+
1508
+ printf(" IsMatch(0): %u, Cost: %f (%f bytes), Ave. Cost: %f\n",
1509
+ m_total_nonmatches, m_total_is_match0_bits_cost, m_total_is_match0_bits_cost / 8.0f, m_total_is_match0_bits_cost / math::maximum<uint>(1, m_total_nonmatches));
1510
+
1511
+ printf(" IsMatch(1): %u, Cost: %f (%f bytes), Ave. Cost: %f\n",
1512
+ m_total_matches, m_total_is_match1_bits_cost, m_total_is_match1_bits_cost / 8.0f, m_total_is_match1_bits_cost / math::maximum<uint>(1, m_total_matches));
1513
+
1514
+ printf("Literal stats:\n");
1515
+ printf(" Count: %u, Cost: %f (%f bytes), Ave: %f StdDev: %f Min: %f Max: %f\n", m_lit_stats.get_number_of_values32(), m_lit_stats.get_total(), m_lit_stats.get_total() / 8.0f, m_lit_stats.get_average(), m_lit_stats.get_std_dev(), m_lit_stats.get_min_val(), m_lit_stats.get_max_val());
1516
+
1517
+ printf("Delta literal stats:\n");
1518
+ printf(" Count: %u, Cost: %f (%f bytes), Ave: %f StdDev: %f Min: %f Max: %f\n", m_delta_lit_stats.get_number_of_values32(), m_delta_lit_stats.get_total(), m_delta_lit_stats.get_total() / 8.0f, m_delta_lit_stats.get_average(), m_delta_lit_stats.get_std_dev(), m_delta_lit_stats.get_min_val(), m_delta_lit_stats.get_max_val());
1519
+
1520
+ printf("Rep0 Len1 stats:\n");
1521
+ printf(" Count: %u, Cost: %f (%f bytes), Ave. Cost: %f StdDev: %f Min: %f Max: %f\n", m_rep0_len1_stats.get_number_of_values32(), m_rep0_len1_stats.get_total(), m_rep0_len1_stats.get_total() / 8.0f, m_rep0_len1_stats.get_average(), m_rep0_len1_stats.get_std_dev(), m_rep0_len1_stats.get_min_val(), m_rep0_len1_stats.get_max_val());
1522
+
1523
+ printf("Rep0 Len2+ stats:\n");
1524
+ printf(" Count: %u, Cost: %f (%f bytes), Ave. Cost: %f StdDev: %f Min: %f Max: %f\n", m_rep0_len2_plus_stats.get_number_of_values32(), m_rep0_len2_plus_stats.get_total(), m_rep0_len2_plus_stats.get_total() / 8.0f, m_rep0_len2_plus_stats.get_average(), m_rep0_len2_plus_stats.get_std_dev(), m_rep0_len2_plus_stats.get_min_val(), m_rep0_len2_plus_stats.get_max_val());
1525
+
1526
+ for (uint i = 0; i < CLZBase::cMatchHistSize; i++)
1527
+ {
1528
+ printf("Rep %u stats:\n", i);
1529
+ printf(" Count: %u, Cost: %f (%f bytes), Ave. Cost: %f StdDev: %f Min: %f Max: %f\n", m_rep_stats[i].get_number_of_values32(), m_rep_stats[i].get_total(), m_rep_stats[i].get_total() / 8.0f, m_rep_stats[i].get_average(), m_rep_stats[i].get_std_dev(), m_rep_stats[i].get_min_val(), m_rep_stats[i].get_max_val());
1530
+ }
1531
+
1532
+ for (uint i = CLZBase::cMinMatchLen; i <= CLZBase::cMaxMatchLen; i++)
1533
+ {
1534
+ printf("Match %u: Total: %u, Cost: %f (%f bytes), Ave: %f StdDev: %f Min: %f Max: %f\n", i,
1535
+ m_full_match_stats[i].get_number_of_values32(), m_full_match_stats[i].get_total(), m_full_match_stats[i].get_total() / 8.0f,
1536
+ m_full_match_stats[i].get_average(), m_full_match_stats[i].get_std_dev(), m_full_match_stats[i].get_min_val(), m_full_match_stats[i].get_max_val());
1537
+ }
1538
+
1539
+ printf("Total near len2 matches: %u, total far len2 matches: %u\n", m_total_near_len2_matches, m_total_far_len2_matches);
1540
+ printf("Total matches: %u, truncated matches: %u\n", m_total_matches, m_total_truncated_matches);
1541
+ printf("Max full match len2 distance: %u\n", m_max_len2_dist);
1542
+
1543
+ #if 0
1544
+ printf("Size of truncation histogram:\n");
1545
+ for (uint i = 0; i <= CLZBase::cMaxMatchLen; i++)
1546
+ {
1547
+ printf("%05u ", m_match_truncation_len_hist[i]);
1548
+ if ((i & 15) == 15) printf("\n");
1549
+ }
1550
+ printf("\n");
1551
+
1552
+ printf("Number of truncations per encoded match length histogram:\n");
1553
+ for (uint i = 0; i <= CLZBase::cMaxMatchLen; i++)
1554
+ {
1555
+ printf("%05u ", m_match_truncation_hist[i]);
1556
+ if ((i & 15) == 15) printf("\n");
1557
+ }
1558
+ printf("\n");
1559
+
1560
+ for (uint s = 0; s < CLZBase::cNumStates; s++)
1561
+ {
1562
+ printf("-- Match type truncation hist for state %u:\n", s);
1563
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_match_type_truncation_hist[s]); i++)
1564
+ {
1565
+ printf("%u truncated (%3.1f%%), %u not truncated\n", m_match_type_truncation_hist[s][i], 100.0f * (float)m_match_type_truncation_hist[s][i] / (m_match_type_truncation_hist[s][i] + m_match_type_was_not_truncated_hist[s][i]), m_match_type_was_not_truncated_hist[s][i]);
1566
+ }
1567
+ }
1568
+ #endif
1569
+ }
1570
+
1571
+ void lzcompressor::coding_stats::update(const lzdecision& lzdec, const state& cur_state, const search_accelerator& dict, bit_cost_t cost)
1572
+ {
1573
+ m_total_bytes += lzdec.get_len();
1574
+ m_total_contexts++;
1575
+
1576
+ float cost_in_bits = cost / (float)cBitCostScale;
1577
+ LZHAM_ASSERT(cost_in_bits > 0.0f);
1578
+ m_total_cost += cost_in_bits;
1579
+
1580
+ m_context_stats.update(cost_in_bits);
1581
+
1582
+ //uint match_pred = cur_state.get_pred_char(dict, lzdec.m_pos, 1);
1583
+ uint is_match_model_index = LZHAM_IS_MATCH_MODEL_INDEX(cur_state.m_cur_state);
1584
+
1585
+ if (lzdec.m_len == 0)
1586
+ {
1587
+ float match_bit_cost = cur_state.m_is_match_model[is_match_model_index].get_cost(0) / (float)cBitCostScale;
1588
+
1589
+ m_total_is_match0_bits_cost += match_bit_cost;
1590
+ m_total_match_bits_cost += match_bit_cost;
1591
+ m_worst_match_bits_cost = math::maximum<double>(m_worst_match_bits_cost, static_cast<double>(match_bit_cost));
1592
+ m_total_nonmatches++;
1593
+
1594
+ if (cur_state.m_cur_state < CLZBase::cNumLitStates)
1595
+ {
1596
+ m_lit_stats.update(cost_in_bits);
1597
+ }
1598
+ else
1599
+ {
1600
+ m_delta_lit_stats.update(cost_in_bits);
1601
+ }
1602
+ }
1603
+ else if (lzdec.m_len <= CLZBase::cMaxMatchLen)
1604
+ {
1605
+ const uint match_len = lzdec.get_len();
1606
+
1607
+ {
1608
+ uint match_dist = lzdec.get_match_dist(cur_state);
1609
+
1610
+ uint cur_lookahead_size = dict.get_lookahead_size();
1611
+
1612
+ uint actual_match_len = dict.get_match_len(0, match_dist, LZHAM_MIN(cur_lookahead_size, static_cast<uint>(CLZBase::cMaxMatchLen)));
1613
+ LZHAM_VERIFY(match_len <= actual_match_len);
1614
+
1615
+ m_total_truncated_matches += match_len < actual_match_len;
1616
+ m_match_truncation_len_hist[math::maximum<int>(0, actual_match_len - match_len)]++;
1617
+
1618
+ uint type_index = 4;
1619
+ if (!lzdec.is_full_match())
1620
+ {
1621
+ LZHAM_ASSUME(CLZBase::cMatchHistSize == 4);
1622
+ type_index = -lzdec.m_dist - 1;
1623
+ }
1624
+
1625
+ if (actual_match_len > match_len)
1626
+ {
1627
+ m_match_truncation_hist[match_len]++;
1628
+
1629
+ m_match_type_truncation_hist[cur_state.m_cur_state][type_index]++;
1630
+ }
1631
+ else
1632
+ {
1633
+ m_match_type_was_not_truncated_hist[cur_state.m_cur_state][type_index]++;
1634
+ }
1635
+ }
1636
+
1637
+ float match_bit_cost = cur_state.m_is_match_model[is_match_model_index].get_cost(1) / (float)cBitCostScale;
1638
+ m_total_is_match1_bits_cost += match_bit_cost;
1639
+ m_total_match_bits_cost += match_bit_cost;
1640
+ m_worst_match_bits_cost = math::maximum<double>(m_worst_match_bits_cost, static_cast<double>(match_bit_cost));
1641
+ m_total_matches++;
1642
+
1643
+ if (lzdec.m_dist < 0)
1644
+ {
1645
+ // rep match
1646
+ int match_hist_index = -lzdec.m_dist - 1;
1647
+ LZHAM_ASSERT(match_hist_index < CLZBase::cMatchHistSize);
1648
+
1649
+ m_rep_stats[match_hist_index].update(cost_in_bits);
1650
+
1651
+ if (!match_hist_index)
1652
+ {
1653
+ // rep0 match
1654
+ if (lzdec.m_len == 1)
1655
+ {
1656
+ m_rep0_len1_stats.update(cost_in_bits);
1657
+ }
1658
+ else
1659
+ {
1660
+ m_rep0_len2_plus_stats.update(cost_in_bits);
1661
+ }
1662
+ }
1663
+ }
1664
+ else
1665
+ {
1666
+ m_full_match_stats[math::minimum<int>(cMaxMatchLen, match_len)].update(cost_in_bits);
1667
+
1668
+ if (match_len == 2)
1669
+ {
1670
+ if (lzdec.m_dist <= 512)
1671
+ m_total_near_len2_matches++;
1672
+ else
1673
+ m_total_far_len2_matches++;
1674
+
1675
+ m_max_len2_dist = LZHAM_MAX((int)m_max_len2_dist, lzdec.m_dist);
1676
+ }
1677
+ }
1678
+ }
1679
+ else
1680
+ {
1681
+ // TODO: Handle huge matches.
1682
+ }
1683
+ }
1684
+ } // namespace lzham