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,1586 @@
1
+ // File: lzham_lzdecomp.cpp
2
+ // See Copyright Notice and license at the end of include/lzham.h
3
+ //
4
+ // See "Coroutines in C":
5
+ // http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
6
+ // Also see "Protothreads - Lightweight, Stackless Threads in C":
7
+ // http://www.sics.se/~adam/pt/
8
+ #include "lzham_core.h"
9
+ #include "lzham_decomp.h"
10
+ #include "lzham_symbol_codec.h"
11
+ #include "lzham_checksum.h"
12
+ #include "lzham_lzdecompbase.h"
13
+
14
+ using namespace lzham;
15
+
16
+ // We currently only really need ~35K, adding a few K as a fudge factor.
17
+ #define LZHAM_DECOMP_MEMORY_ARENA_SIZE (38*1024)
18
+
19
+ namespace lzham
20
+ {
21
+ static const uint8 s_literal_next_state[24] =
22
+ {
23
+ 0, 0, 0, 0, 1, 2, 3, // 0-6: literal states
24
+ 4, 5, 6, 4, 5, // 7-11: match states
25
+ 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10 // 12-23: unused
26
+ };
27
+
28
+ static const uint s_huge_match_base_len[4] = { CLZDecompBase::cMaxMatchLen + 1, CLZDecompBase::cMaxMatchLen + 1 + 256, CLZDecompBase::cMaxMatchLen + 1 + 256 + 1024, CLZDecompBase::cMaxMatchLen + 1 + 256 + 1024 + 4096 };
29
+ static const uint8 s_huge_match_code_len[4] = { 8, 10, 12, 16 };
30
+
31
+ struct lzham_decompressor
32
+ {
33
+ lzham_decompressor(lzham_malloc_context malloc_context) :
34
+ m_malloc_context(malloc_context),
35
+ m_codec(malloc_context),
36
+ m_lit_table(malloc_context),
37
+ m_delta_lit_table(malloc_context),
38
+ m_main_table(malloc_context),
39
+ m_dist_lsb_table(malloc_context)
40
+ {
41
+ for (uint i = 0; i < 2; i++)
42
+ {
43
+ m_rep_len_table[i].set_malloc_context(malloc_context);
44
+ m_large_len_table[i].set_malloc_context(malloc_context);
45
+ }
46
+ }
47
+
48
+ void init();
49
+
50
+ template<bool unbuffered> lzham_decompress_status_t decompress();
51
+
52
+ void reset_huff_tables();
53
+ void reset_arith_tables();
54
+ void reset_all_tables();
55
+ void reset_huffman_table_update_rates();
56
+
57
+ lzham_malloc_context m_malloc_context;
58
+
59
+ int m_state;
60
+
61
+ CLZDecompBase m_lzBase;
62
+ symbol_codec m_codec;
63
+
64
+ uint32 m_raw_decomp_buf_size;
65
+ uint8 *m_pRaw_decomp_buf;
66
+ uint8 *m_pDecomp_buf;
67
+ uint32 m_decomp_adler32;
68
+
69
+ const uint8 *m_pIn_buf;
70
+ size_t *m_pIn_buf_size;
71
+ uint8 *m_pOut_buf;
72
+ size_t *m_pOut_buf_size;
73
+ bool m_no_more_input_bytes_flag;
74
+
75
+ uint8 *m_pOrig_out_buf;
76
+ size_t m_orig_out_buf_size;
77
+
78
+ lzham_decompress_params m_params;
79
+
80
+ lzham_decompress_status_t m_status;
81
+
82
+ quasi_adaptive_huffman_data_model m_lit_table;
83
+ quasi_adaptive_huffman_data_model m_delta_lit_table;
84
+ quasi_adaptive_huffman_data_model m_main_table;
85
+ quasi_adaptive_huffman_data_model m_rep_len_table[2];
86
+ quasi_adaptive_huffman_data_model m_large_len_table[2];
87
+ quasi_adaptive_huffman_data_model m_dist_lsb_table;
88
+
89
+ adaptive_bit_model m_is_match_model[CLZDecompBase::cNumStates];
90
+ adaptive_bit_model m_is_rep_model[CLZDecompBase::cNumStates];
91
+ adaptive_bit_model m_is_rep0_model[CLZDecompBase::cNumStates];
92
+ adaptive_bit_model m_is_rep0_single_byte_model[CLZDecompBase::cNumStates];
93
+ adaptive_bit_model m_is_rep1_model[CLZDecompBase::cNumStates];
94
+ adaptive_bit_model m_is_rep2_model[CLZDecompBase::cNumStates];
95
+
96
+ uint m_dst_ofs;
97
+ uint m_dst_highwater_ofs;
98
+
99
+ uint m_step;
100
+ uint m_block_step;
101
+ uint m_initial_step;
102
+
103
+ uint m_block_index;
104
+
105
+ int m_match_hist0;
106
+ int m_match_hist1;
107
+ int m_match_hist2;
108
+ int m_match_hist3;
109
+ uint m_cur_state;
110
+
111
+ uint m_start_block_dst_ofs;
112
+
113
+ uint m_block_type;
114
+
115
+ const uint8 *m_pFlush_src;
116
+ size_t m_flush_num_bytes_remaining;
117
+ size_t m_flush_n;
118
+
119
+ uint m_seed_bytes_to_ignore_when_flushing;
120
+
121
+ uint m_file_src_file_adler32;
122
+
123
+ uint m_rep_lit0;
124
+ uint m_match_len;
125
+ uint m_match_slot;
126
+ uint m_extra_bits;
127
+ uint m_num_extra_bits;
128
+
129
+ uint m_src_ofs;
130
+ const uint8* m_pCopy_src;
131
+ uint m_num_raw_bytes_remaining;
132
+
133
+ uint m_debug_is_match;
134
+ uint m_debug_match_len;
135
+ uint m_debug_match_dist;
136
+ uint m_debug_lit;
137
+
138
+ lzham_decompress_status_t m_z_last_status;
139
+ uint m_z_first_call;
140
+ uint m_z_has_flushed;
141
+ uint m_z_cmf;
142
+ uint m_z_flg;
143
+ uint m_z_dict_adler32;
144
+
145
+ uint m_tmp;
146
+ };
147
+
148
+ // Ordinarily I dislike macros like this, but in this case I think using them makes the decompression function easier to follow.
149
+
150
+ // Coroutine helpers.
151
+ #define LZHAM_CR_INITIAL_STATE 0
152
+ #define LZHAM_CR_BEGIN(state) switch( state ) { case LZHAM_CR_INITIAL_STATE:
153
+ #define LZHAM_CR_RETURN(state, result) do { state = __LINE__; return (result); case __LINE__:; } while (0)
154
+ #define LZHAM_CR_FINISH }
155
+
156
+ // Helpers to save/restore local variables (hopefully CPU registers) to memory.
157
+ #define LZHAM_RESTORE_STATE LZHAM_RESTORE_LOCAL_STATE \
158
+ match_hist0 = m_match_hist0; match_hist1 = m_match_hist1; match_hist2 = m_match_hist2; match_hist3 = m_match_hist3; \
159
+ cur_state = m_cur_state; dst_ofs = m_dst_ofs;
160
+
161
+ #define LZHAM_SAVE_STATE LZHAM_SAVE_LOCAL_STATE \
162
+ m_match_hist0 = match_hist0; m_match_hist1 = match_hist1; m_match_hist2 = match_hist2; m_match_hist3 = match_hist3; \
163
+ m_cur_state = cur_state; m_dst_ofs = dst_ofs;
164
+
165
+ // Helper that coroutine returns to the caller with a request for more input bytes.
166
+ #define LZHAM_DECODE_NEEDS_BYTES \
167
+ LZHAM_SAVE_STATE \
168
+ for ( ; ; ) \
169
+ { \
170
+ *m_pIn_buf_size = static_cast<size_t>(m_codec.decode_get_bytes_consumed()); \
171
+ *m_pOut_buf_size = 0; \
172
+ LZHAM_CR_RETURN(m_state, LZHAM_DECOMP_STATUS_NEEDS_MORE_INPUT); \
173
+ m_codec.decode_set_input_buffer(m_pIn_buf, *m_pIn_buf_size, m_pIn_buf, m_no_more_input_bytes_flag); \
174
+ if ((m_codec.m_decode_buf_eof) || (m_codec.m_decode_buf_size)) break; \
175
+ } \
176
+ LZHAM_RESTORE_STATE
177
+
178
+ #if LZHAM_PLATFORM_X360
179
+ #define LZHAM_BULK_MEMCPY XMemCpy
180
+ #define LZHAM_MEMCPY memcpy
181
+ #else
182
+ #define LZHAM_BULK_MEMCPY memcpy
183
+ #define LZHAM_MEMCPY memcpy
184
+ #endif
185
+
186
+ // Flush the output buffer/dictionary by doing a coroutine return to the caller.
187
+ // Buffered mode only.
188
+ #define LZHAM_FLUSH_DICT_TO_OUTPUT_BUFFER(dict_ofs) \
189
+ LZHAM_SAVE_STATE \
190
+ m_pFlush_src = m_pDecomp_buf + m_seed_bytes_to_ignore_when_flushing + m_dst_highwater_ofs; \
191
+ m_flush_num_bytes_remaining = dict_ofs - m_seed_bytes_to_ignore_when_flushing - m_dst_highwater_ofs; \
192
+ m_seed_bytes_to_ignore_when_flushing = 0; \
193
+ m_dst_highwater_ofs = dict_ofs & dict_size_mask; \
194
+ while (m_flush_num_bytes_remaining) \
195
+ { \
196
+ m_flush_n = LZHAM_MIN(m_flush_num_bytes_remaining, *m_pOut_buf_size); \
197
+ if (0 == (m_params.m_decompress_flags & LZHAM_DECOMP_FLAG_COMPUTE_ADLER32)) \
198
+ { \
199
+ LZHAM_BULK_MEMCPY(m_pOut_buf, m_pFlush_src, m_flush_n); \
200
+ } \
201
+ else \
202
+ { \
203
+ size_t copy_ofs = 0; \
204
+ while (copy_ofs < m_flush_n) \
205
+ { \
206
+ const uint cBytesToMemCpyPerIteration = 8192U; \
207
+ size_t bytes_to_copy = LZHAM_MIN((size_t)(m_flush_n - copy_ofs), cBytesToMemCpyPerIteration); \
208
+ LZHAM_MEMCPY(m_pOut_buf + copy_ofs, m_pFlush_src + copy_ofs, bytes_to_copy); \
209
+ m_decomp_adler32 = adler32(m_pFlush_src + copy_ofs, bytes_to_copy, m_decomp_adler32); \
210
+ copy_ofs += bytes_to_copy; \
211
+ } \
212
+ } \
213
+ *m_pIn_buf_size = static_cast<size_t>(m_codec.decode_get_bytes_consumed()); \
214
+ *m_pOut_buf_size = m_flush_n; \
215
+ LZHAM_CR_RETURN(m_state, m_flush_n ? LZHAM_DECOMP_STATUS_NOT_FINISHED : LZHAM_DECOMP_STATUS_HAS_MORE_OUTPUT); \
216
+ m_codec.decode_set_input_buffer(m_pIn_buf, *m_pIn_buf_size, m_pIn_buf, m_no_more_input_bytes_flag); \
217
+ m_pFlush_src += m_flush_n; \
218
+ m_flush_num_bytes_remaining -= m_flush_n; \
219
+ } \
220
+ LZHAM_RESTORE_STATE
221
+
222
+ #define LZHAM_DECOMPRESS_DECODE_ADAPTIVE_SYMBOL(codec, result, model) LZHAM_SYMBOL_CODEC_DECODE_ADAPTIVE_HUFFMAN(codec, result, model)
223
+
224
+ //------------------------------------------------------------------------------------------------------------------
225
+ void lzham_decompressor::init()
226
+ {
227
+ m_lzBase.init_position_slots(m_params.m_dict_size_log2);
228
+
229
+ #ifdef LZHAM_LZDEBUG
230
+ if (m_pDecomp_buf)
231
+ memset(m_pDecomp_buf, 0xCE, 1U << m_params.m_dict_size_log2);
232
+ #endif
233
+
234
+ m_state = LZHAM_CR_INITIAL_STATE;
235
+ m_step = 0;
236
+ m_block_step = 0;
237
+ m_block_index = 0;
238
+ m_initial_step = 0;
239
+
240
+ m_dst_ofs = 0;
241
+ m_dst_highwater_ofs = 0;
242
+
243
+ m_pIn_buf = NULL;
244
+ m_pIn_buf_size = NULL;
245
+ m_pOut_buf = NULL;
246
+ m_pOut_buf_size = NULL;
247
+ m_no_more_input_bytes_flag = false;
248
+ m_status = LZHAM_DECOMP_STATUS_NOT_FINISHED;
249
+ m_pOrig_out_buf = NULL;
250
+ m_orig_out_buf_size = 0;
251
+ m_decomp_adler32 = cInitAdler32;
252
+ m_seed_bytes_to_ignore_when_flushing = 0;
253
+
254
+ m_z_last_status = LZHAM_DECOMP_STATUS_NOT_FINISHED;
255
+ m_z_first_call = 1;
256
+ m_z_has_flushed = 0;
257
+ m_z_cmf = 0;
258
+ m_z_flg = 0;
259
+ m_z_dict_adler32 = 0;
260
+
261
+ m_tmp = 0;
262
+
263
+ m_match_hist0 = 0;
264
+ m_match_hist1 = 0;
265
+ m_match_hist2 = 0;
266
+ m_match_hist3 = 0;
267
+ m_cur_state = 0;
268
+
269
+ m_start_block_dst_ofs = 0;
270
+ m_block_type = 0;
271
+ m_flush_num_bytes_remaining = 0;
272
+ m_flush_n = 0;
273
+ m_file_src_file_adler32 = 0;
274
+ m_rep_lit0 = 0;
275
+ m_match_len = 0;
276
+ m_match_slot = 0;
277
+ m_extra_bits = 0;
278
+ m_num_extra_bits = 0;
279
+ m_src_ofs = 0;
280
+ m_pCopy_src = NULL;
281
+ m_num_raw_bytes_remaining = 0;
282
+
283
+ m_codec.clear();
284
+ }
285
+
286
+ void lzham_decompressor::reset_huff_tables()
287
+ {
288
+ m_lit_table.reset();
289
+ m_delta_lit_table.reset();
290
+
291
+ m_main_table.reset();
292
+
293
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_rep_len_table); i++)
294
+ m_rep_len_table[i].reset();
295
+
296
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_large_len_table); i++)
297
+ m_large_len_table[i].reset();
298
+
299
+ m_dist_lsb_table.reset();
300
+ }
301
+
302
+ void lzham_decompressor::reset_arith_tables()
303
+ {
304
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_is_match_model); i++)
305
+ m_is_match_model[i].clear();
306
+
307
+ for (uint i = 0; i < CLZDecompBase::cNumStates; i++)
308
+ {
309
+ m_is_rep_model[i].clear();
310
+ m_is_rep0_model[i].clear();
311
+ m_is_rep0_single_byte_model[i].clear();
312
+ m_is_rep1_model[i].clear();
313
+ m_is_rep2_model[i].clear();
314
+ }
315
+ }
316
+
317
+ void lzham_decompressor::reset_all_tables()
318
+ {
319
+ reset_huff_tables();
320
+
321
+ reset_arith_tables();
322
+ }
323
+
324
+ void lzham_decompressor::reset_huffman_table_update_rates()
325
+ {
326
+ m_lit_table.reset_update_rate();
327
+ m_delta_lit_table.reset_update_rate();
328
+
329
+ m_main_table.reset_update_rate();
330
+
331
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_rep_len_table); i++)
332
+ m_rep_len_table[i].reset_update_rate();
333
+
334
+ for (uint i = 0; i < LZHAM_ARRAY_SIZE(m_large_len_table); i++)
335
+ m_large_len_table[i].reset_update_rate();
336
+
337
+ m_dist_lsb_table.reset_update_rate();
338
+ }
339
+
340
+ //------------------------------------------------------------------------------------------------------------------
341
+ // Decompression method. Implemented as a coroutine so it can be paused and resumed to support streaming.
342
+ //------------------------------------------------------------------------------------------------------------------
343
+ template<bool unbuffered>
344
+ lzham_decompress_status_t lzham_decompressor::decompress()
345
+ {
346
+ // Important: This function is a coroutine. ANY locals variables that need to be preserved across coroutine
347
+ // returns must be either be a member variable, or a local which is saved/restored to a member variable at
348
+ // the right times. (This makes this function difficult to follow and freaking ugly due to the macros of doom - but hey it works.)
349
+ // The most often used variables are in locals so the compiler hopefully puts them into CPU registers.
350
+ symbol_codec &codec = m_codec;
351
+ const uint dict_size = 1U << m_params.m_dict_size_log2;
352
+ const uint dict_size_mask = unbuffered ? UINT_MAX : (dict_size - 1);
353
+
354
+ int match_hist0 = 0, match_hist1 = 0, match_hist2 = 0, match_hist3 = 0;
355
+ uint cur_state = 0, dst_ofs = 0;
356
+
357
+ const size_t out_buf_size = *m_pOut_buf_size;
358
+
359
+ uint8* pDst = unbuffered ? reinterpret_cast<uint8*>(m_pOut_buf) : reinterpret_cast<uint8*>(m_pDecomp_buf);
360
+ uint8* pDst_end = unbuffered ? (reinterpret_cast<uint8*>(m_pOut_buf) + out_buf_size) : (reinterpret_cast<uint8*>(m_pDecomp_buf) + dict_size);
361
+
362
+ LZHAM_SYMBOL_CODEC_DECODE_DECLARE(codec);
363
+
364
+ #define LZHAM_SAVE_LOCAL_STATE
365
+ #define LZHAM_RESTORE_LOCAL_STATE
366
+
367
+ // Important: Do not use any switch() statements below here.
368
+ LZHAM_CR_BEGIN(m_state)
369
+
370
+ if ((!unbuffered) && (m_params.m_num_seed_bytes))
371
+ {
372
+ LZHAM_BULK_MEMCPY(pDst, m_params.m_pSeed_bytes, m_params.m_num_seed_bytes);
373
+ dst_ofs += m_params.m_num_seed_bytes;
374
+ if (dst_ofs >= dict_size)
375
+ dst_ofs = 0;
376
+ else
377
+ m_seed_bytes_to_ignore_when_flushing = dst_ofs;
378
+ }
379
+
380
+ if (!m_codec.start_decoding(m_pIn_buf, *m_pIn_buf_size, m_no_more_input_bytes_flag, NULL, NULL))
381
+ {
382
+ LZHAM_LOG_ERROR(1020);
383
+ return LZHAM_DECOMP_STATUS_FAILED_INITIALIZING;
384
+ }
385
+
386
+ LZHAM_SYMBOL_CODEC_DECODE_BEGIN(codec);
387
+
388
+ {
389
+ if (m_params.m_decompress_flags & LZHAM_DECOMP_FLAG_READ_ZLIB_STREAM)
390
+ {
391
+ uint check;
392
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, m_z_cmf, 8);
393
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, m_z_flg, 8);
394
+ check = ((m_z_cmf << 8) + m_z_flg) % 31;
395
+ if ((check != 0) || ((m_z_cmf & 15) != LZHAM_Z_LZHAM))
396
+ {
397
+ LZHAM_LOG_ERROR(1021);
398
+ return LZHAM_DECOMP_STATUS_FAILED_BAD_ZLIB_HEADER;
399
+ }
400
+ if (m_z_flg & 32)
401
+ {
402
+ if ((!m_params.m_pSeed_bytes) || (unbuffered))
403
+ {
404
+ LZHAM_LOG_ERROR(1022);
405
+ return LZHAM_DECOMP_STATUS_FAILED_NEED_SEED_BYTES;
406
+ }
407
+ m_z_dict_adler32 = 0;
408
+ for (m_tmp = 0; m_tmp < 4; ++m_tmp)
409
+ {
410
+ uint n; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, n, 8);
411
+ m_z_dict_adler32 = (m_z_dict_adler32 << 8) | n;
412
+ }
413
+ if (adler32(m_params.m_pSeed_bytes, m_params.m_num_seed_bytes) != m_z_dict_adler32)
414
+ {
415
+ LZHAM_LOG_ERROR(1023);
416
+ return LZHAM_DECOMP_STATUS_FAILED_BAD_SEED_BYTES;
417
+ }
418
+ }
419
+ }
420
+
421
+ {
422
+ // Was written by lzcompressor::send_configuration().
423
+ //uint tmp;
424
+ //LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, tmp, 2);
425
+ }
426
+
427
+ uint max_update_interval = m_params.m_table_max_update_interval, update_interval_slow_rate = m_params.m_table_update_interval_slow_rate;
428
+ if (!max_update_interval && !update_interval_slow_rate)
429
+ {
430
+ uint rate = m_params.m_table_update_rate;
431
+ if (!rate)
432
+ rate = LZHAM_DEFAULT_TABLE_UPDATE_RATE;
433
+ rate = math::clamp<uint>(rate, 1, LZHAM_FASTEST_TABLE_UPDATE_RATE) - 1;
434
+ max_update_interval = g_table_update_settings[rate].m_max_update_interval;
435
+ update_interval_slow_rate = g_table_update_settings[rate].m_slow_rate;
436
+ }
437
+
438
+ bool succeeded = m_lit_table.init2(m_malloc_context, false, 256, max_update_interval, update_interval_slow_rate, NULL);
439
+ succeeded = succeeded && m_delta_lit_table.assign(m_lit_table);
440
+
441
+ succeeded = succeeded && m_main_table.init2(m_malloc_context, false, CLZDecompBase::cLZXNumSpecialLengths + (m_lzBase.m_num_lzx_slots - CLZDecompBase::cLZXLowestUsableMatchSlot) * 8, max_update_interval, update_interval_slow_rate, NULL);
442
+
443
+ succeeded = succeeded && m_rep_len_table[0].init2(m_malloc_context, false, CLZDecompBase::cNumHugeMatchCodes + (CLZDecompBase::cMaxMatchLen - CLZDecompBase::cMinMatchLen + 1), max_update_interval, update_interval_slow_rate, NULL);
444
+ succeeded = succeeded && m_rep_len_table[1].assign(m_rep_len_table[0]);
445
+
446
+ succeeded = succeeded && m_large_len_table[0].init2(m_malloc_context, false, CLZDecompBase::cNumHugeMatchCodes + CLZDecompBase::cLZXNumSecondaryLengths, max_update_interval, update_interval_slow_rate, NULL);
447
+ succeeded = succeeded && m_large_len_table[1].assign(m_large_len_table[0]);
448
+
449
+ succeeded = succeeded && m_dist_lsb_table.init2(m_malloc_context, false, 16, max_update_interval, update_interval_slow_rate, NULL);
450
+ if (!succeeded)
451
+ {
452
+ LZHAM_LOG_ERROR(1024);
453
+ return LZHAM_DECOMP_STATUS_FAILED_INITIALIZING;
454
+ }
455
+ }
456
+
457
+ // Output block loop.
458
+ do
459
+ {
460
+ #ifdef LZHAM_LZDEBUG
461
+ uint outer_sync_marker; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, k, 12);
462
+ LZHAM_VERIFY(outer_sync_marker == 166);
463
+ #endif
464
+
465
+ // Decode block type.
466
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, m_block_type, CLZDecompBase::cBlockHeaderBits);
467
+
468
+ if (m_block_type == CLZDecompBase::cSyncBlock)
469
+ {
470
+ // Sync block
471
+ // Reset either the symbol table update rates, or all statistics, then force a coroutine return to give the caller a chance to handle the output right now.
472
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, m_tmp, CLZDecompBase::cBlockFlushTypeBits);
473
+
474
+ // See lzcompressor::send_sync_block() (TODO: make these an enum)
475
+ if (m_tmp == 1)
476
+ reset_huffman_table_update_rates();
477
+ else if (m_tmp == 2)
478
+ reset_all_tables();
479
+
480
+ LZHAM_SYMBOL_CODEC_DECODE_ALIGN_TO_BYTE(codec);
481
+
482
+ uint n; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, n, 16);
483
+ if (n != 0)
484
+ {
485
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
486
+ *m_pIn_buf_size = static_cast<size_t>(codec.decode_get_bytes_consumed());
487
+ *m_pOut_buf_size = 0;
488
+ for ( ; ; ) { LZHAM_LOG_ERROR(1025); LZHAM_CR_RETURN(m_state, LZHAM_DECOMP_STATUS_FAILED_BAD_SYNC_BLOCK); }
489
+ }
490
+
491
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, n, 16);
492
+ if (n != 0xFFFF)
493
+ {
494
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
495
+ *m_pIn_buf_size = static_cast<size_t>(codec.decode_get_bytes_consumed());
496
+ *m_pOut_buf_size = 0;
497
+ for ( ; ; ) { LZHAM_LOG_ERROR(1026); LZHAM_CR_RETURN(m_state, LZHAM_DECOMP_STATUS_FAILED_BAD_SYNC_BLOCK); }
498
+ }
499
+
500
+ // See lzcompressor::send_sync_block() (TODO: make these an enum)
501
+ if ((m_tmp == 2) || (m_tmp == 3))
502
+ {
503
+ // It's a sync or full flush, so immediately give caller whatever output we have. Also gives the caller a chance to reposition the input stream ptr somewhere else before continuing.
504
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
505
+
506
+ if ((!unbuffered) && (dst_ofs))
507
+ {
508
+ LZHAM_FLUSH_DICT_TO_OUTPUT_BUFFER(dst_ofs);
509
+ }
510
+ else
511
+ {
512
+ if (unbuffered)
513
+ {
514
+ LZHAM_ASSERT(dst_ofs >= m_dst_highwater_ofs);
515
+ }
516
+ else
517
+ {
518
+ LZHAM_ASSERT(!m_dst_highwater_ofs);
519
+ }
520
+
521
+ // unbuffered, or dst_ofs==0
522
+ *m_pIn_buf_size = static_cast<size_t>(codec.decode_get_bytes_consumed());
523
+ *m_pOut_buf_size = dst_ofs - m_dst_highwater_ofs;
524
+
525
+ // Partial/sync flushes in unbuffered mode details:
526
+ // We assume the caller doesn't move the output buffer between calls AND the pointer to the output buffer input parameter won't change between calls (i.e.
527
+ // it *always* points to the beginning of the decompressed stream). The caller will need to track the current output buffer offset.
528
+ m_dst_highwater_ofs = dst_ofs;
529
+
530
+ LZHAM_SAVE_STATE
531
+ LZHAM_CR_RETURN(m_state, LZHAM_DECOMP_STATUS_NOT_FINISHED);
532
+ LZHAM_RESTORE_STATE
533
+
534
+ m_codec.decode_set_input_buffer(m_pIn_buf, *m_pIn_buf_size, m_pIn_buf, m_no_more_input_bytes_flag);
535
+ }
536
+
537
+ LZHAM_SYMBOL_CODEC_DECODE_BEGIN(codec);
538
+ }
539
+ }
540
+ else if (m_block_type == CLZDecompBase::cRawBlock)
541
+ {
542
+ // Raw block handling is complex because we ultimately want to (safely) handle as many bytes as possible using a small number of memcpy()'s.
543
+ uint num_raw_bytes_remaining;
544
+ num_raw_bytes_remaining = 0;
545
+
546
+ #undef LZHAM_SAVE_LOCAL_STATE
547
+ #undef LZHAM_RESTORE_LOCAL_STATE
548
+ #define LZHAM_SAVE_LOCAL_STATE m_num_raw_bytes_remaining = num_raw_bytes_remaining;
549
+ #define LZHAM_RESTORE_LOCAL_STATE num_raw_bytes_remaining = m_num_raw_bytes_remaining;
550
+
551
+ // Determine how large this raw block is.
552
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, num_raw_bytes_remaining, 24);
553
+
554
+ // Get and verify raw block length check bits.
555
+ uint num_raw_bytes_check_bits; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, num_raw_bytes_check_bits, 8);
556
+ uint raw_bytes_remaining0, raw_bytes_remaining1, raw_bytes_remaining2;
557
+ raw_bytes_remaining0 = num_raw_bytes_remaining & 0xFF;
558
+ raw_bytes_remaining1 = (num_raw_bytes_remaining >> 8) & 0xFF;
559
+ raw_bytes_remaining2 = (num_raw_bytes_remaining >> 16) & 0xFF;
560
+ if (num_raw_bytes_check_bits != ((raw_bytes_remaining0 ^ raw_bytes_remaining1) ^ raw_bytes_remaining2))
561
+ {
562
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
563
+ *m_pIn_buf_size = static_cast<size_t>(codec.decode_get_bytes_consumed());
564
+ *m_pOut_buf_size = 0;
565
+ for ( ; ; ) { LZHAM_LOG_ERROR(1027); LZHAM_CR_RETURN(m_state, LZHAM_DECOMP_STATUS_FAILED_BAD_RAW_BLOCK); }
566
+ }
567
+
568
+ num_raw_bytes_remaining++;
569
+
570
+ // Discard any partial bytes from the bit buffer (align up to the next byte).
571
+ LZHAM_SYMBOL_CODEC_DECODE_ALIGN_TO_BYTE(codec);
572
+
573
+ // Flush any full bytes from the bit buffer.
574
+ do
575
+ {
576
+ int b;
577
+ LZHAM_SYMBOL_CODEC_DECODE_REMOVE_BYTE_FROM_BIT_BUF(codec, b);
578
+ if (b < 0)
579
+ break;
580
+
581
+ if ((unbuffered) && (dst_ofs >= out_buf_size))
582
+ {
583
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
584
+ *m_pIn_buf_size = static_cast<size_t>(codec.decode_get_bytes_consumed());
585
+ *m_pOut_buf_size = 0;
586
+ for ( ; ; ) { LZHAM_LOG_ERROR(1028); LZHAM_CR_RETURN(m_state, LZHAM_DECOMP_STATUS_FAILED_DEST_BUF_TOO_SMALL); }
587
+ }
588
+
589
+ pDst[dst_ofs++] = static_cast<uint8>(b);
590
+
591
+ if ((!unbuffered) && (dst_ofs > dict_size_mask))
592
+ {
593
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
594
+ LZHAM_FLUSH_DICT_TO_OUTPUT_BUFFER(dict_size);
595
+ LZHAM_SYMBOL_CODEC_DECODE_BEGIN(codec);
596
+ dst_ofs = 0;
597
+ }
598
+
599
+ num_raw_bytes_remaining--;
600
+ } while (num_raw_bytes_remaining);
601
+
602
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
603
+
604
+ // Now handle the bulk of the raw data with memcpy().
605
+ while (num_raw_bytes_remaining)
606
+ {
607
+ uint64 in_buf_ofs, in_buf_remaining;
608
+ in_buf_ofs = codec.decode_get_bytes_consumed();
609
+ in_buf_remaining = *m_pIn_buf_size - in_buf_ofs;
610
+
611
+ while (!in_buf_remaining)
612
+ {
613
+ // We need more bytes from the caller.
614
+ *m_pIn_buf_size = static_cast<size_t>(in_buf_ofs);
615
+ *m_pOut_buf_size = 0;
616
+
617
+ if (m_no_more_input_bytes_flag)
618
+ {
619
+ for ( ; ; ) { LZHAM_LOG_ERROR(1029); LZHAM_CR_RETURN(m_state, LZHAM_DECOMP_STATUS_FAILED_EXPECTED_MORE_RAW_BYTES); }
620
+ }
621
+
622
+ LZHAM_SAVE_STATE
623
+ LZHAM_CR_RETURN(m_state, LZHAM_DECOMP_STATUS_NEEDS_MORE_INPUT);
624
+ LZHAM_RESTORE_STATE
625
+
626
+ m_codec.decode_set_input_buffer(m_pIn_buf, *m_pIn_buf_size, m_pIn_buf, m_no_more_input_bytes_flag);
627
+
628
+ in_buf_ofs = 0;
629
+ in_buf_remaining = *m_pIn_buf_size;
630
+ }
631
+
632
+ // Determine how many bytes we can safely memcpy() in a single call.
633
+ uint num_bytes_to_copy;
634
+ num_bytes_to_copy = static_cast<uint>(LZHAM_MIN(num_raw_bytes_remaining, in_buf_remaining));
635
+ if (!unbuffered)
636
+ num_bytes_to_copy = LZHAM_MIN(num_bytes_to_copy, dict_size - dst_ofs);
637
+
638
+ if ((unbuffered) && ((dst_ofs + num_bytes_to_copy) > out_buf_size))
639
+ {
640
+ // Output buffer is not large enough.
641
+ *m_pIn_buf_size = static_cast<size_t>(in_buf_ofs);
642
+ *m_pOut_buf_size = 0;
643
+ for ( ; ; ) { LZHAM_LOG_ERROR(1030); LZHAM_CR_RETURN(m_state, LZHAM_DECOMP_STATUS_FAILED_DEST_BUF_TOO_SMALL); }
644
+ }
645
+
646
+ // Copy the raw bytes.
647
+ LZHAM_BULK_MEMCPY(pDst + dst_ofs, m_pIn_buf + in_buf_ofs, num_bytes_to_copy);
648
+
649
+ in_buf_ofs += num_bytes_to_copy;
650
+ num_raw_bytes_remaining -= num_bytes_to_copy;
651
+
652
+ codec.decode_set_input_buffer(m_pIn_buf, *m_pIn_buf_size, m_pIn_buf + in_buf_ofs, m_no_more_input_bytes_flag);
653
+
654
+ dst_ofs += num_bytes_to_copy;
655
+
656
+ if ((!unbuffered) && (dst_ofs > dict_size_mask))
657
+ {
658
+ LZHAM_ASSERT(dst_ofs == dict_size);
659
+
660
+ LZHAM_FLUSH_DICT_TO_OUTPUT_BUFFER(dict_size);
661
+
662
+ dst_ofs = 0;
663
+ }
664
+ }
665
+
666
+ LZHAM_SYMBOL_CODEC_DECODE_BEGIN(codec);
667
+
668
+ #undef LZHAM_SAVE_LOCAL_STATE
669
+ #undef LZHAM_RESTORE_LOCAL_STATE
670
+ #define LZHAM_SAVE_LOCAL_STATE
671
+ #define LZHAM_RESTORE_LOCAL_STATE
672
+ }
673
+ else if (m_block_type == CLZDecompBase::cCompBlock)
674
+ {
675
+ LZHAM_SYMBOL_CODEC_DECODE_ARITH_START(codec)
676
+
677
+ match_hist0 = 1;
678
+ match_hist1 = 1;
679
+ match_hist2 = 1;
680
+ match_hist3 = 1;
681
+ cur_state = 0;
682
+
683
+ m_start_block_dst_ofs = dst_ofs;
684
+
685
+ {
686
+ uint block_flush_type; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, block_flush_type, CLZDecompBase::cBlockFlushTypeBits);
687
+ if (block_flush_type == 1)
688
+ reset_huffman_table_update_rates();
689
+ else if (block_flush_type == 2)
690
+ reset_all_tables();
691
+ }
692
+
693
+ #ifdef LZHAM_LZDEBUG
694
+ m_initial_step = m_step;
695
+ m_block_step = 0;
696
+ for ( ; ; m_step++, m_block_step++)
697
+ #else
698
+ for ( ; ; )
699
+ #endif
700
+ {
701
+ #ifdef LZHAM_LZDEBUG
702
+ uint sync_marker; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, x, CLZDecompBase::cLZHAMDebugSyncMarkerBits);
703
+ LZHAM_VERIFY(sync_marker == CLZDecompBase::cLZHAMDebugSyncMarkerValue);
704
+
705
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, m_debug_is_match, 1);
706
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, m_debug_match_len, 17);
707
+
708
+ uint debug_cur_state; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, debug_cur_state, 4);
709
+ LZHAM_VERIFY(cur_state == debug_cur_state);
710
+ #endif
711
+
712
+ // Read "is match" bit.
713
+ uint match_model_index;
714
+ match_model_index = LZHAM_IS_MATCH_MODEL_INDEX(cur_state);
715
+ LZHAM_ASSERT(match_model_index < LZHAM_ARRAY_SIZE(m_is_match_model));
716
+
717
+ uint is_match_bit; LZHAM_SYMBOL_CODEC_DECODE_ARITH_BIT(codec, is_match_bit, m_is_match_model[match_model_index]);
718
+
719
+ #ifdef LZHAM_LZDEBUG
720
+ LZHAM_VERIFY(is_match_bit == m_debug_is_match);
721
+ #endif
722
+
723
+ if (LZHAM_BUILTIN_EXPECT(!is_match_bit, 0))
724
+ {
725
+ // Handle literal.
726
+
727
+ #ifdef LZHAM_LZDEBUG
728
+ LZHAM_VERIFY(m_debug_match_len == 1);
729
+ #endif
730
+
731
+ #ifdef LZHAM_LZDEBUG
732
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, m_debug_lit, 8);
733
+ #endif
734
+
735
+ if ((unbuffered) && (LZHAM_BUILTIN_EXPECT(dst_ofs >= out_buf_size, 0)))
736
+ {
737
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
738
+ *m_pIn_buf_size = static_cast<size_t>(codec.decode_get_bytes_consumed());
739
+ *m_pOut_buf_size = 0;
740
+ for ( ; ; ) { LZHAM_LOG_ERROR(1031); LZHAM_CR_RETURN(m_state, LZHAM_DECOMP_STATUS_FAILED_DEST_BUF_TOO_SMALL); }
741
+ }
742
+
743
+ if (LZHAM_BUILTIN_EXPECT(cur_state < CLZDecompBase::cNumLitStates, 1))
744
+ {
745
+ // Regular literal
746
+ uint r; LZHAM_DECOMPRESS_DECODE_ADAPTIVE_SYMBOL(codec, r, m_lit_table);
747
+ pDst[dst_ofs] = static_cast<uint8>(r);
748
+
749
+ #ifdef LZHAM_LZDEBUG
750
+ LZHAM_VERIFY(pDst[dst_ofs] == m_debug_lit);
751
+ #endif
752
+ }
753
+ else
754
+ {
755
+ // Delta literal
756
+ uint match_hist0_ofs, rep_lit0;
757
+
758
+ // Determine delta literal's partial context.
759
+ match_hist0_ofs = dst_ofs - match_hist0;
760
+ rep_lit0 = pDst[match_hist0_ofs & dict_size_mask];
761
+
762
+ #undef LZHAM_SAVE_LOCAL_STATE
763
+ #undef LZHAM_RESTORE_LOCAL_STATE
764
+ #define LZHAM_SAVE_LOCAL_STATE m_rep_lit0 = rep_lit0;
765
+ #define LZHAM_RESTORE_LOCAL_STATE rep_lit0 = m_rep_lit0;
766
+
767
+ #ifdef LZHAM_LZDEBUG
768
+ uint debug_rep_lit0; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, debug_rep_lit0, 8);
769
+ LZHAM_VERIFY(debug_rep_lit0 == rep_lit0);
770
+ #endif
771
+
772
+ uint r; LZHAM_DECOMPRESS_DECODE_ADAPTIVE_SYMBOL(codec, r, m_delta_lit_table);
773
+ r ^= rep_lit0;
774
+ pDst[dst_ofs] = static_cast<uint8>(r);
775
+
776
+ #ifdef LZHAM_LZDEBUG
777
+ LZHAM_VERIFY(pDst[dst_ofs] == m_debug_lit);
778
+ #endif
779
+
780
+ #undef LZHAM_SAVE_LOCAL_STATE
781
+ #undef LZHAM_RESTORE_LOCAL_STATE
782
+ #define LZHAM_SAVE_LOCAL_STATE
783
+ #define LZHAM_RESTORE_LOCAL_STATE
784
+ }
785
+
786
+ cur_state = s_literal_next_state[cur_state];
787
+
788
+ dst_ofs++;
789
+ if ((!unbuffered) && (LZHAM_BUILTIN_EXPECT(dst_ofs > dict_size_mask, 0)))
790
+ {
791
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
792
+ LZHAM_FLUSH_DICT_TO_OUTPUT_BUFFER(dict_size);
793
+ LZHAM_SYMBOL_CODEC_DECODE_BEGIN(codec);
794
+ dst_ofs = 0;
795
+ }
796
+ }
797
+ else
798
+ {
799
+ // Handle match.
800
+ uint match_len;
801
+ match_len = 1;
802
+
803
+ #undef LZHAM_SAVE_LOCAL_STATE
804
+ #undef LZHAM_RESTORE_LOCAL_STATE
805
+ #define LZHAM_SAVE_LOCAL_STATE m_match_len = match_len;
806
+ #define LZHAM_RESTORE_LOCAL_STATE match_len = m_match_len;
807
+
808
+ // Determine if match is a rep_match, and if so what type.
809
+ uint is_rep; LZHAM_SYMBOL_CODEC_DECODE_ARITH_BIT(codec, is_rep, m_is_rep_model[cur_state]);
810
+ if (LZHAM_BUILTIN_EXPECT(is_rep, 1))
811
+ {
812
+ uint is_rep0; LZHAM_SYMBOL_CODEC_DECODE_ARITH_BIT(codec, is_rep0, m_is_rep0_model[cur_state]);
813
+ if (LZHAM_BUILTIN_EXPECT(is_rep0, 1))
814
+ {
815
+ uint is_rep0_len1; LZHAM_SYMBOL_CODEC_DECODE_ARITH_BIT(codec, is_rep0_len1, m_is_rep0_single_byte_model[cur_state]);
816
+ if (LZHAM_BUILTIN_EXPECT(is_rep0_len1, 1))
817
+ {
818
+ cur_state = (cur_state < CLZDecompBase::cNumLitStates) ? 9 : 11;
819
+ }
820
+ else
821
+ {
822
+ LZHAM_DECOMPRESS_DECODE_ADAPTIVE_SYMBOL(codec, match_len, m_rep_len_table[cur_state >= CLZDecompBase::cNumLitStates]);
823
+ match_len += CLZDecompBase::cMinMatchLen;
824
+
825
+ if (match_len == (CLZDecompBase::cMaxMatchLen + 1))
826
+ {
827
+ // Decode "huge" match length.
828
+ match_len = 0;
829
+ do
830
+ {
831
+ uint b; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, b, 1);
832
+ if (!b)
833
+ break;
834
+ match_len++;
835
+ } while (match_len < 3);
836
+ uint k; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, k, s_huge_match_code_len[match_len]);
837
+ match_len = s_huge_match_base_len[match_len] + k;
838
+ }
839
+
840
+ cur_state = (cur_state < CLZDecompBase::cNumLitStates) ? 8 : 11;
841
+ }
842
+ }
843
+ else
844
+ {
845
+ LZHAM_DECOMPRESS_DECODE_ADAPTIVE_SYMBOL(codec, match_len, m_rep_len_table[cur_state >= CLZDecompBase::cNumLitStates]);
846
+ match_len += CLZDecompBase::cMinMatchLen;
847
+
848
+ if (match_len == (CLZDecompBase::cMaxMatchLen + 1))
849
+ {
850
+ // Decode "huge" match length.
851
+ match_len = 0;
852
+ do
853
+ {
854
+ uint b; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, b, 1);
855
+ if (!b)
856
+ break;
857
+ match_len++;
858
+ } while (match_len < 3);
859
+ uint k; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, k, s_huge_match_code_len[match_len]);
860
+ match_len = s_huge_match_base_len[match_len] + k;
861
+ }
862
+
863
+ uint is_rep1; LZHAM_SYMBOL_CODEC_DECODE_ARITH_BIT(codec, is_rep1, m_is_rep1_model[cur_state]);
864
+ if (LZHAM_BUILTIN_EXPECT(is_rep1, 1))
865
+ {
866
+ uint temp = match_hist1;
867
+ match_hist1 = match_hist0;
868
+ match_hist0 = temp;
869
+ }
870
+ else
871
+ {
872
+ uint is_rep2; LZHAM_SYMBOL_CODEC_DECODE_ARITH_BIT(codec, is_rep2, m_is_rep2_model[cur_state]);
873
+
874
+ if (LZHAM_BUILTIN_EXPECT(is_rep2, 1))
875
+ {
876
+ // rep2
877
+ uint temp = match_hist2;
878
+ match_hist2 = match_hist1;
879
+ match_hist1 = match_hist0;
880
+ match_hist0 = temp;
881
+ }
882
+ else
883
+ {
884
+ // rep3
885
+ uint temp = match_hist3;
886
+ match_hist3 = match_hist2;
887
+ match_hist2 = match_hist1;
888
+ match_hist1 = match_hist0;
889
+ match_hist0 = temp;
890
+ }
891
+ }
892
+
893
+ cur_state = (cur_state < CLZDecompBase::cNumLitStates) ? 8 : 11;
894
+ }
895
+ }
896
+ else
897
+ {
898
+ // Handle normal/full match.
899
+ uint sym; LZHAM_DECOMPRESS_DECODE_ADAPTIVE_SYMBOL(codec, sym, m_main_table);
900
+ sym -= CLZDecompBase::cLZXNumSpecialLengths;
901
+
902
+ if (LZHAM_BUILTIN_EXPECT(static_cast<int>(sym) < 0, 0))
903
+ {
904
+ // Handle special symbols.
905
+ if (static_cast<int>(sym) == (CLZDecompBase::cLZXSpecialCodeEndOfBlockCode - CLZDecompBase::cLZXNumSpecialLengths))
906
+ break;
907
+ else
908
+ {
909
+ // Must be cLZXSpecialCodePartialStateReset.
910
+ match_hist0 = 1;
911
+ match_hist1 = 1;
912
+ match_hist2 = 1;
913
+ match_hist3 = 1;
914
+ cur_state = 0;
915
+ continue;
916
+ }
917
+ }
918
+
919
+ // Low 3 bits of symbol = match length category, higher bits = distance category.
920
+ match_len = (sym & 7) + 2;
921
+
922
+ uint match_slot;
923
+ match_slot = (sym >> 3) + CLZDecompBase::cLZXLowestUsableMatchSlot;
924
+
925
+ #undef LZHAM_SAVE_LOCAL_STATE
926
+ #undef LZHAM_RESTORE_LOCAL_STATE
927
+ #define LZHAM_SAVE_LOCAL_STATE m_match_len = match_len; m_match_slot = match_slot;
928
+ #define LZHAM_RESTORE_LOCAL_STATE match_len = m_match_len; match_slot = m_match_slot;
929
+
930
+ if (LZHAM_BUILTIN_EXPECT(match_len == 9, 0))
931
+ {
932
+ // Match is >= 9 bytes, decode the actual length.
933
+ uint e; LZHAM_DECOMPRESS_DECODE_ADAPTIVE_SYMBOL(codec, e, m_large_len_table[cur_state >= CLZDecompBase::cNumLitStates]);
934
+ match_len += e;
935
+
936
+ if (match_len == (CLZDecompBase::cMaxMatchLen + 1))
937
+ {
938
+ // Decode "huge" match length.
939
+ match_len = 0;
940
+ do
941
+ {
942
+ uint b; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, b, 1);
943
+ if (!b)
944
+ break;
945
+ match_len++;
946
+ } while (match_len < 3);
947
+ uint k; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, k, s_huge_match_code_len[match_len]);
948
+ match_len = s_huge_match_base_len[match_len] + k;
949
+ }
950
+ }
951
+
952
+ uint num_extra_bits;
953
+ num_extra_bits = m_lzBase.m_lzx_position_extra_bits[match_slot];
954
+
955
+ uint extra_bits;
956
+
957
+ #undef LZHAM_SAVE_LOCAL_STATE
958
+ #undef LZHAM_RESTORE_LOCAL_STATE
959
+ #define LZHAM_SAVE_LOCAL_STATE m_match_len = match_len; m_match_slot = match_slot; m_num_extra_bits = num_extra_bits;
960
+ #define LZHAM_RESTORE_LOCAL_STATE match_len = m_match_len; match_slot = m_match_slot; num_extra_bits = m_num_extra_bits;
961
+
962
+ if (LZHAM_BUILTIN_EXPECT(num_extra_bits < 3, 0))
963
+ {
964
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, extra_bits, num_extra_bits);
965
+ }
966
+ else
967
+ {
968
+ extra_bits = 0;
969
+ if (LZHAM_BUILTIN_EXPECT(num_extra_bits > 4, 1))
970
+ {
971
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, extra_bits, num_extra_bits - 4);
972
+ extra_bits <<= 4;
973
+ }
974
+
975
+ #undef LZHAM_SAVE_LOCAL_STATE
976
+ #undef LZHAM_RESTORE_LOCAL_STATE
977
+ #define LZHAM_SAVE_LOCAL_STATE m_match_len = match_len; m_match_slot = match_slot; m_extra_bits = extra_bits;
978
+ #define LZHAM_RESTORE_LOCAL_STATE match_len = m_match_len; match_slot = m_match_slot; extra_bits = m_extra_bits;
979
+
980
+ uint j; LZHAM_DECOMPRESS_DECODE_ADAPTIVE_SYMBOL(codec, j, m_dist_lsb_table);
981
+ extra_bits += j;
982
+ }
983
+
984
+ match_hist3 = match_hist2;
985
+ match_hist2 = match_hist1;
986
+ match_hist1 = match_hist0;
987
+ match_hist0 = m_lzBase.m_lzx_position_base[match_slot] + extra_bits;
988
+
989
+ cur_state = (cur_state < CLZDecompBase::cNumLitStates) ? CLZDecompBase::cNumLitStates : CLZDecompBase::cNumLitStates + 3;
990
+
991
+ #undef LZHAM_SAVE_LOCAL_STATE
992
+ #undef LZHAM_RESTORE_LOCAL_STATE
993
+ #define LZHAM_SAVE_LOCAL_STATE m_match_len = match_len;
994
+ #define LZHAM_RESTORE_LOCAL_STATE match_len = m_match_len;
995
+ }
996
+
997
+ // We have the match's length and distance, now do the copy.
998
+
999
+ #ifdef LZHAM_LZDEBUG
1000
+ LZHAM_VERIFY(match_len == m_debug_match_len);
1001
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, m_debug_match_dist, 25);
1002
+ uint d; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, d, 4);
1003
+ m_debug_match_dist = (m_debug_match_dist << 4) | d;
1004
+ LZHAM_VERIFY((uint)match_hist0 == m_debug_match_dist);
1005
+ #endif
1006
+ if ( (unbuffered) && LZHAM_BUILTIN_EXPECT((((size_t)match_hist0 > dst_ofs) || ((dst_ofs + match_len) > out_buf_size)), 0) )
1007
+ {
1008
+ LZHAM_LOG_ERROR(1032);
1009
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
1010
+ *m_pIn_buf_size = static_cast<size_t>(codec.decode_get_bytes_consumed());
1011
+ *m_pOut_buf_size = 0;
1012
+ for ( ; ; ) { LZHAM_CR_RETURN(m_state, LZHAM_DECOMP_STATUS_FAILED_BAD_CODE); }
1013
+ }
1014
+
1015
+ uint src_ofs;
1016
+ const uint8* pCopy_src;
1017
+ src_ofs = (dst_ofs - match_hist0) & dict_size_mask;
1018
+ pCopy_src = pDst + src_ofs;
1019
+
1020
+ #undef LZHAM_SAVE_LOCAL_STATE
1021
+ #undef LZHAM_RESTORE_LOCAL_STATE
1022
+ #define LZHAM_SAVE_LOCAL_STATE m_match_len = match_len; m_src_ofs = src_ofs; m_pCopy_src = pCopy_src;
1023
+ #define LZHAM_RESTORE_LOCAL_STATE match_len = m_match_len; src_ofs = m_src_ofs; pCopy_src = m_pCopy_src;
1024
+
1025
+ if ( (!unbuffered) && LZHAM_BUILTIN_EXPECT( ((LZHAM_MAX(src_ofs, dst_ofs) + match_len) > dict_size_mask), 0) )
1026
+ {
1027
+ // Match source or destination wraps around the end of the dictionary to the beginning, so handle the copy one byte at a time.
1028
+ do
1029
+ {
1030
+ pDst[dst_ofs++] = *pCopy_src++;
1031
+
1032
+ if (LZHAM_BUILTIN_EXPECT(pCopy_src == pDst_end, 0))
1033
+ pCopy_src = pDst;
1034
+
1035
+ if (LZHAM_BUILTIN_EXPECT(dst_ofs > dict_size_mask, 0))
1036
+ {
1037
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
1038
+ LZHAM_FLUSH_DICT_TO_OUTPUT_BUFFER(dict_size);
1039
+ LZHAM_SYMBOL_CODEC_DECODE_BEGIN(codec);
1040
+ dst_ofs = 0;
1041
+ }
1042
+
1043
+ match_len--;
1044
+ } while (LZHAM_BUILTIN_EXPECT(match_len > 0, 1));
1045
+ }
1046
+ else
1047
+ {
1048
+ uint8* pCopy_dst = pDst + dst_ofs;
1049
+ if (LZHAM_BUILTIN_EXPECT(match_hist0 == 1, 0))
1050
+ {
1051
+ // Handle byte runs.
1052
+ uint8 c = *pCopy_src;
1053
+ if (LZHAM_BUILTIN_EXPECT(match_len < 8, 1))
1054
+ {
1055
+ for (int i = match_len; i > 0; i--)
1056
+ *pCopy_dst++ = c;
1057
+ }
1058
+ else
1059
+ {
1060
+ memset(pCopy_dst, c, match_len);
1061
+ }
1062
+ }
1063
+ else
1064
+ {
1065
+ // Handle matches of length 2 or higher.
1066
+ if (LZHAM_BUILTIN_EXPECT(((match_len < 8) || ((int)match_len > match_hist0)), 1))
1067
+ {
1068
+ for (int i = match_len; i > 0; i--)
1069
+ *pCopy_dst++ = *pCopy_src++;
1070
+ }
1071
+ else
1072
+ {
1073
+ LZHAM_MEMCPY(pCopy_dst, pCopy_src, match_len);
1074
+ }
1075
+ }
1076
+ dst_ofs += match_len;
1077
+ }
1078
+ } // lit or match
1079
+
1080
+ #undef LZHAM_SAVE_LOCAL_STATE
1081
+ #undef LZHAM_RESTORE_LOCAL_STATE
1082
+ #define LZHAM_SAVE_LOCAL_STATE
1083
+ #define LZHAM_RESTORE_LOCAL_STATE
1084
+ } // for ( ; ; )
1085
+
1086
+ #ifdef LZHAM_LZDEBUG
1087
+ uint end_sync_marker; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, end_sync_marker, 12);
1088
+ LZHAM_VERIFY(end_sync_marker == 366);
1089
+ #endif
1090
+ LZHAM_SYMBOL_CODEC_DECODE_ALIGN_TO_BYTE(codec);
1091
+ }
1092
+ else if (m_block_type == CLZDecompBase::cEOFBlock)
1093
+ {
1094
+ // Received EOF.
1095
+ m_status = LZHAM_DECOMP_STATUS_SUCCESS;
1096
+ }
1097
+ else
1098
+ {
1099
+ LZHAM_LOG_ERROR(1033);
1100
+ // This block type is currently undefined.
1101
+ m_status = LZHAM_DECOMP_STATUS_FAILED_BAD_CODE;
1102
+ }
1103
+
1104
+ m_block_index++;
1105
+
1106
+ } while (m_status == LZHAM_DECOMP_STATUS_NOT_FINISHED);
1107
+
1108
+ if ((!unbuffered) && (dst_ofs))
1109
+ {
1110
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
1111
+ LZHAM_FLUSH_DICT_TO_OUTPUT_BUFFER(dst_ofs);
1112
+ LZHAM_SYMBOL_CODEC_DECODE_BEGIN(codec);
1113
+ }
1114
+
1115
+ if (m_status == LZHAM_DECOMP_STATUS_SUCCESS)
1116
+ {
1117
+ LZHAM_SYMBOL_CODEC_DECODE_ALIGN_TO_BYTE(codec);
1118
+
1119
+ LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, m_file_src_file_adler32, 16);
1120
+ uint l; LZHAM_SYMBOL_CODEC_DECODE_GET_BITS(codec, l, 16);
1121
+ m_file_src_file_adler32 = (m_file_src_file_adler32 << 16) | l;
1122
+
1123
+ if (m_params.m_decompress_flags & LZHAM_DECOMP_FLAG_COMPUTE_ADLER32)
1124
+ {
1125
+ if (unbuffered)
1126
+ {
1127
+ m_decomp_adler32 = adler32(pDst, dst_ofs, cInitAdler32);
1128
+ }
1129
+
1130
+ if (m_file_src_file_adler32 != m_decomp_adler32)
1131
+ {
1132
+ LZHAM_LOG_ERROR(1034);
1133
+ m_status = LZHAM_DECOMP_STATUS_FAILED_ADLER32;
1134
+ }
1135
+ }
1136
+ else
1137
+ {
1138
+ m_decomp_adler32 = m_file_src_file_adler32;
1139
+ }
1140
+ }
1141
+
1142
+ LZHAM_SYMBOL_CODEC_DECODE_END(codec);
1143
+
1144
+ *m_pIn_buf_size = static_cast<size_t>(codec.stop_decoding());
1145
+ *m_pOut_buf_size = unbuffered ? (dst_ofs - m_dst_highwater_ofs) : 0;
1146
+ m_dst_highwater_ofs = dst_ofs;
1147
+
1148
+ LZHAM_CR_RETURN(m_state, m_status);
1149
+
1150
+ for ( ; ; )
1151
+ {
1152
+ *m_pIn_buf_size = 0;
1153
+ *m_pOut_buf_size = 0;
1154
+ LZHAM_CR_RETURN(m_state, m_status);
1155
+ }
1156
+
1157
+ LZHAM_CR_FINISH
1158
+
1159
+ return m_status;
1160
+ }
1161
+
1162
+ static bool check_params(const lzham_decompress_params *pParams)
1163
+ {
1164
+ if ((!pParams) || (pParams->m_struct_size != sizeof(lzham_decompress_params)))
1165
+ {
1166
+ LZHAM_LOG_ERROR(1000);
1167
+ return false;
1168
+ }
1169
+
1170
+ if ((pParams->m_dict_size_log2 < CLZDecompBase::cMinDictSizeLog2) || (pParams->m_dict_size_log2 > CLZDecompBase::cMaxDictSizeLog2))
1171
+ {
1172
+ LZHAM_LOG_ERROR(1001);
1173
+ return false;
1174
+ }
1175
+
1176
+ if (pParams->m_num_seed_bytes)
1177
+ {
1178
+ if (((pParams->m_decompress_flags & LZHAM_DECOMP_FLAG_OUTPUT_UNBUFFERED) != 0) || (!pParams->m_pSeed_bytes))
1179
+ {
1180
+ LZHAM_LOG_ERROR(1002);
1181
+ return false;
1182
+ }
1183
+ if (pParams->m_num_seed_bytes > (1U << pParams->m_dict_size_log2))
1184
+ {
1185
+ LZHAM_LOG_ERROR(1003);
1186
+ return false;
1187
+ }
1188
+ }
1189
+ return true;
1190
+ }
1191
+
1192
+ lzham_decompress_state_ptr LZHAM_CDECL lzham_lib_decompress_init(const lzham_decompress_params *pParams)
1193
+ {
1194
+ LZHAM_ASSUME(CLZDecompBase::cMinDictSizeLog2 == LZHAM_MIN_DICT_SIZE_LOG2);
1195
+ LZHAM_ASSUME(CLZDecompBase::cMaxDictSizeLog2 == LZHAM_MAX_DICT_SIZE_LOG2_X64);
1196
+
1197
+ if (!check_params(pParams))
1198
+ return NULL;
1199
+
1200
+ lzham_malloc_context malloc_context = lzham_create_malloc_context(LZHAM_DECOMP_MEMORY_ARENA_SIZE);
1201
+
1202
+ lzham_decompressor *pState = lzham_new<lzham_decompressor>(malloc_context, malloc_context);
1203
+ if (!pState)
1204
+ {
1205
+ lzham_destroy_malloc_context(malloc_context);
1206
+ return NULL;
1207
+ }
1208
+
1209
+ pState->m_params = *pParams;
1210
+
1211
+ if (pState->m_params.m_decompress_flags & LZHAM_DECOMP_FLAG_OUTPUT_UNBUFFERED)
1212
+ {
1213
+ pState->m_pRaw_decomp_buf = NULL;
1214
+ pState->m_raw_decomp_buf_size = 0;
1215
+ pState->m_pDecomp_buf = NULL;
1216
+ }
1217
+ else
1218
+ {
1219
+ uint32 decomp_buf_size = 1U << pState->m_params.m_dict_size_log2;
1220
+ pState->m_pRaw_decomp_buf = static_cast<uint8*>(lzham_malloc(malloc_context, decomp_buf_size + 15));
1221
+ if (!pState->m_pRaw_decomp_buf)
1222
+ {
1223
+ lzham_delete(malloc_context, pState);
1224
+ lzham_destroy_malloc_context(malloc_context);
1225
+ return NULL;
1226
+ }
1227
+ pState->m_raw_decomp_buf_size = decomp_buf_size;
1228
+ pState->m_pDecomp_buf = math::align_up_pointer(pState->m_pRaw_decomp_buf, 16);
1229
+ }
1230
+
1231
+ pState->init();
1232
+
1233
+ return pState;
1234
+ }
1235
+
1236
+ lzham_decompress_state_ptr LZHAM_CDECL lzham_lib_decompress_reinit(lzham_decompress_state_ptr p, const lzham_decompress_params *pParams)
1237
+ {
1238
+ if (!p)
1239
+ return lzham_lib_decompress_init(pParams);
1240
+
1241
+ lzham_decompressor *pState = static_cast<lzham_decompressor *>(p);
1242
+
1243
+ if (!check_params(pParams))
1244
+ return NULL;
1245
+
1246
+ if (pState->m_params.m_decompress_flags & LZHAM_DECOMP_FLAG_OUTPUT_UNBUFFERED)
1247
+ {
1248
+ lzham_free(pState->m_malloc_context, pState->m_pRaw_decomp_buf);
1249
+ pState->m_pRaw_decomp_buf = NULL;
1250
+ pState->m_raw_decomp_buf_size = 0;
1251
+ pState->m_pDecomp_buf = NULL;
1252
+ }
1253
+ else
1254
+ {
1255
+ uint32 new_dict_size = 1U << pState->m_params.m_dict_size_log2;
1256
+ if ((!pState->m_pRaw_decomp_buf) || (pState->m_raw_decomp_buf_size < new_dict_size))
1257
+ {
1258
+ uint8 *pNew_dict = static_cast<uint8*>(lzham_realloc(pState->m_malloc_context, pState->m_pRaw_decomp_buf, new_dict_size + 15));
1259
+ if (!pNew_dict)
1260
+ return NULL;
1261
+ pState->m_pRaw_decomp_buf = pNew_dict;
1262
+ pState->m_raw_decomp_buf_size = new_dict_size;
1263
+ pState->m_pDecomp_buf = math::align_up_pointer(pState->m_pRaw_decomp_buf, 16);
1264
+ }
1265
+ }
1266
+
1267
+ pState->m_params = *pParams;
1268
+
1269
+ pState->init();
1270
+
1271
+ pState->reset_arith_tables();
1272
+ return pState;
1273
+ }
1274
+
1275
+ uint32 LZHAM_CDECL lzham_lib_decompress_deinit(lzham_decompress_state_ptr p)
1276
+ {
1277
+ lzham_decompressor *pState = static_cast<lzham_decompressor *>(p);
1278
+ if (!pState)
1279
+ return 0;
1280
+
1281
+ uint32 adler32 = pState->m_decomp_adler32;
1282
+
1283
+ lzham_malloc_context malloc_context = pState->m_malloc_context;
1284
+
1285
+ lzham_free(malloc_context, pState->m_pRaw_decomp_buf);
1286
+ lzham_delete(malloc_context, pState);
1287
+ lzham_destroy_malloc_context(malloc_context);
1288
+
1289
+ return adler32;
1290
+ }
1291
+
1292
+ lzham_decompress_status_t LZHAM_CDECL lzham_lib_decompress(
1293
+ lzham_decompress_state_ptr p,
1294
+ const lzham_uint8 *pIn_buf, size_t *pIn_buf_size,
1295
+ lzham_uint8 *pOut_buf, size_t *pOut_buf_size,
1296
+ lzham_bool no_more_input_bytes_flag)
1297
+ {
1298
+ lzham_decompressor *pState = static_cast<lzham_decompressor *>(p);
1299
+
1300
+ if ((!pState) || (!pState->m_params.m_dict_size_log2) || (!pIn_buf_size) || (!pOut_buf_size))
1301
+ {
1302
+ return LZHAM_DECOMP_STATUS_INVALID_PARAMETER;
1303
+ }
1304
+
1305
+ if ((*pIn_buf_size) && (!pIn_buf))
1306
+ {
1307
+ return LZHAM_DECOMP_STATUS_INVALID_PARAMETER;
1308
+ }
1309
+
1310
+ if ((*pOut_buf_size) && (!pOut_buf))
1311
+ {
1312
+ return LZHAM_DECOMP_STATUS_INVALID_PARAMETER;
1313
+ }
1314
+
1315
+ pState->m_pIn_buf = pIn_buf;
1316
+ pState->m_pIn_buf_size = pIn_buf_size;
1317
+ pState->m_pOut_buf = pOut_buf;
1318
+ pState->m_pOut_buf_size = pOut_buf_size;
1319
+ pState->m_no_more_input_bytes_flag = (no_more_input_bytes_flag != 0);
1320
+
1321
+ if (pState->m_params.m_decompress_flags & LZHAM_DECOMP_FLAG_OUTPUT_UNBUFFERED)
1322
+ {
1323
+ if (!pState->m_pOrig_out_buf)
1324
+ {
1325
+ pState->m_pOrig_out_buf = pOut_buf;
1326
+ pState->m_orig_out_buf_size = *pOut_buf_size;
1327
+ }
1328
+ else
1329
+ {
1330
+ // In unbuffered mode, the caller is not allowed to move the output buffer and the output pointer MUST always point to the beginning of the output buffer.
1331
+ // Also, the output buffer size must indicate the full size of the output buffer. The decompressor will track the current output offset, and during partial/sync
1332
+ // flushes it'll report how many bytes it has written since the call.
1333
+ if ((pState->m_pOrig_out_buf != pOut_buf) || (pState->m_orig_out_buf_size != *pOut_buf_size))
1334
+ {
1335
+ return LZHAM_DECOMP_STATUS_INVALID_PARAMETER;
1336
+ }
1337
+ }
1338
+ }
1339
+
1340
+ lzham_decompress_status_t status;
1341
+
1342
+ if (pState->m_params.m_decompress_flags & LZHAM_DECOMP_FLAG_OUTPUT_UNBUFFERED)
1343
+ status = pState->decompress<true>();
1344
+ else
1345
+ status = pState->decompress<false>();
1346
+
1347
+ return status;
1348
+ }
1349
+
1350
+ lzham_decompress_status_t LZHAM_CDECL lzham_lib_decompress_memory(const lzham_decompress_params *pParams, lzham_uint8* pDst_buf, size_t *pDst_len, const lzham_uint8* pSrc_buf, size_t src_len, lzham_uint32 *pAdler32)
1351
+ {
1352
+ if (!pParams)
1353
+ return LZHAM_DECOMP_STATUS_INVALID_PARAMETER;
1354
+
1355
+ lzham_decompress_params params(*pParams);
1356
+ params.m_decompress_flags |= LZHAM_DECOMP_FLAG_OUTPUT_UNBUFFERED;
1357
+
1358
+ lzham_decompress_state_ptr pState = lzham_lib_decompress_init(&params);
1359
+ if (!pState)
1360
+ return LZHAM_DECOMP_STATUS_FAILED_INITIALIZING;
1361
+
1362
+ lzham_decompress_status_t status = lzham_lib_decompress(pState, pSrc_buf, &src_len, pDst_buf, pDst_len, true);
1363
+
1364
+ uint32 adler32 = lzham_lib_decompress_deinit(pState);
1365
+ if (pAdler32)
1366
+ *pAdler32 = adler32;
1367
+
1368
+ return status;
1369
+ }
1370
+
1371
+ // ----------------- zlib-style API's
1372
+
1373
+ int LZHAM_CDECL lzham_lib_z_inflateInit(lzham_z_streamp pStream)
1374
+ {
1375
+ return lzham_lib_z_inflateInit2(pStream, LZHAM_Z_DEFAULT_WINDOW_BITS);
1376
+ }
1377
+
1378
+ int LZHAM_CDECL lzham_lib_z_inflateInit2(lzham_z_streamp pStream, int window_bits)
1379
+ {
1380
+ if (!pStream)
1381
+ return LZHAM_Z_STREAM_ERROR;
1382
+
1383
+ #ifdef LZHAM_Z_API_FORCE_WINDOW_BITS
1384
+ window_bits = LZHAM_Z_API_FORCE_WINDOW_BITS;
1385
+ #endif
1386
+
1387
+ int max_window_bits = LZHAM_64BIT_POINTERS ? LZHAM_MAX_DICT_SIZE_LOG2_X64 : LZHAM_MAX_DICT_SIZE_LOG2_X86;
1388
+ if (labs(window_bits) > max_window_bits)
1389
+ return LZHAM_Z_PARAM_ERROR;
1390
+
1391
+ if (labs(window_bits) < LZHAM_MIN_DICT_SIZE_LOG2)
1392
+ window_bits = (window_bits < 0) ? -LZHAM_MIN_DICT_SIZE_LOG2 : LZHAM_MIN_DICT_SIZE_LOG2;
1393
+
1394
+ lzham_decompress_params params;
1395
+ utils::zero_object(params);
1396
+ params.m_struct_size = sizeof(lzham_decompress_params);
1397
+ params.m_dict_size_log2 = static_cast<lzham_uint32>(labs(window_bits));
1398
+
1399
+ params.m_decompress_flags = LZHAM_DECOMP_FLAG_COMPUTE_ADLER32;
1400
+ if (window_bits > 0)
1401
+ params.m_decompress_flags |= LZHAM_DECOMP_FLAG_READ_ZLIB_STREAM;
1402
+
1403
+ lzham_decompress_state_ptr pState = lzham_lib_decompress_init(&params);
1404
+ if (!pState)
1405
+ return LZHAM_Z_MEM_ERROR;
1406
+ pStream->state = static_cast<lzham_z_internal_state *>(pState);
1407
+
1408
+ pStream->data_type = 0;
1409
+ pStream->adler = LZHAM_Z_ADLER32_INIT;
1410
+ pStream->msg = NULL;
1411
+ pStream->total_in = 0;
1412
+ pStream->total_out = 0;
1413
+ pStream->reserved = 0;
1414
+
1415
+ return LZHAM_Z_OK;
1416
+ }
1417
+
1418
+ int LZHAM_CDECL lzham_lib_z_inflateReset(lzham_z_streamp pStream)
1419
+ {
1420
+ if ((!pStream) || (!pStream->state))
1421
+ return LZHAM_Z_STREAM_ERROR;
1422
+
1423
+ lzham_decompress_state_ptr pState = static_cast<lzham_decompress_state_ptr>(pStream->state);
1424
+ lzham_decompressor *pDecomp = static_cast<lzham_decompressor *>(pState);
1425
+
1426
+ lzham_decompress_params params(pDecomp->m_params);
1427
+
1428
+ if (!lzham_lib_decompress_reinit(pState, &params))
1429
+ return LZHAM_Z_STREAM_ERROR;
1430
+
1431
+ return LZHAM_Z_OK;
1432
+ }
1433
+
1434
+ int LZHAM_CDECL lzham_lib_z_inflate(lzham_z_streamp pStream, int flush)
1435
+ {
1436
+ if ((!pStream) || (!pStream->state))
1437
+ return LZHAM_Z_STREAM_ERROR;
1438
+
1439
+ if ((flush == LZHAM_Z_PARTIAL_FLUSH) || (flush == LZHAM_Z_FULL_FLUSH))
1440
+ flush = LZHAM_Z_SYNC_FLUSH;
1441
+ if (flush)
1442
+ {
1443
+ if ((flush != LZHAM_Z_SYNC_FLUSH) && (flush != LZHAM_Z_FINISH))
1444
+ return LZHAM_Z_STREAM_ERROR;
1445
+ }
1446
+
1447
+ size_t orig_avail_in = pStream->avail_in;
1448
+
1449
+ lzham_decompress_state_ptr pState = static_cast<lzham_decompress_state_ptr>(pStream->state);
1450
+ lzham_decompressor *pDecomp = static_cast<lzham_decompressor *>(pState);
1451
+ if (pDecomp->m_z_last_status >= LZHAM_DECOMP_STATUS_FIRST_SUCCESS_OR_FAILURE_CODE)
1452
+ return LZHAM_Z_DATA_ERROR;
1453
+
1454
+ if (pDecomp->m_z_has_flushed && (flush != LZHAM_Z_FINISH))
1455
+ return LZHAM_Z_STREAM_ERROR;
1456
+ pDecomp->m_z_has_flushed |= (flush == LZHAM_Z_FINISH);
1457
+
1458
+ lzham_decompress_status_t status;
1459
+ for ( ; ; )
1460
+ {
1461
+ size_t in_bytes = pStream->avail_in;
1462
+ size_t out_bytes = pStream->avail_out;
1463
+ lzham_bool no_more_input_bytes_flag = (flush == LZHAM_Z_FINISH);
1464
+ status = lzham_lib_decompress(pState, pStream->next_in, &in_bytes, pStream->next_out, &out_bytes, no_more_input_bytes_flag);
1465
+
1466
+ pDecomp->m_z_last_status = status;
1467
+
1468
+ pStream->next_in += (uint)in_bytes;
1469
+ pStream->avail_in -= (uint)in_bytes;
1470
+ pStream->total_in += (uint)in_bytes;
1471
+ pStream->adler = pDecomp->m_decomp_adler32;
1472
+
1473
+ pStream->next_out += (uint)out_bytes;
1474
+ pStream->avail_out -= (uint)out_bytes;
1475
+ pStream->total_out += (uint)out_bytes;
1476
+
1477
+ if (status >= LZHAM_DECOMP_STATUS_FIRST_FAILURE_CODE)
1478
+ {
1479
+ if (status == LZHAM_DECOMP_STATUS_FAILED_NEED_SEED_BYTES)
1480
+ return LZHAM_Z_NEED_DICT;
1481
+ else
1482
+ return LZHAM_Z_DATA_ERROR; // Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well).
1483
+ }
1484
+
1485
+ if ((status == LZHAM_DECOMP_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in))
1486
+ return LZHAM_Z_BUF_ERROR; // Signal caller that we can't make forward progress without supplying more input, or by setting flush to LZHAM_Z_FINISH.
1487
+ else if (flush == LZHAM_Z_FINISH)
1488
+ {
1489
+ // Caller has indicated that all remaining input was at next_in, and all remaining output will fit entirely in next_out.
1490
+ // (The output buffer at next_out MUST be large to hold the remaining uncompressed data when flush==LZHAM_Z_FINISH).
1491
+ if (status == LZHAM_DECOMP_STATUS_SUCCESS)
1492
+ return LZHAM_Z_STREAM_END;
1493
+ // If status is LZHAM_DECOMP_STATUS_HAS_MORE_OUTPUT, there must be at least 1 more byte on the way but the caller to lzham_decompress() supplied an empty output buffer.
1494
+ // Something is wrong because the caller's output buffer should be large enough to hold the entire decompressed stream when flush==LZHAM_Z_FINISH.
1495
+ else if (status == LZHAM_DECOMP_STATUS_HAS_MORE_OUTPUT)
1496
+ return LZHAM_Z_BUF_ERROR;
1497
+ }
1498
+ else if ((status == LZHAM_DECOMP_STATUS_SUCCESS) || (!pStream->avail_in) || (!pStream->avail_out))
1499
+ break;
1500
+ }
1501
+
1502
+ return (status == LZHAM_DECOMP_STATUS_SUCCESS) ? LZHAM_Z_STREAM_END : LZHAM_Z_OK;
1503
+ }
1504
+
1505
+ int LZHAM_CDECL lzham_lib_z_inflateEnd(lzham_z_streamp pStream)
1506
+ {
1507
+ if (!pStream)
1508
+ return LZHAM_Z_STREAM_ERROR;
1509
+
1510
+ lzham_decompress_state_ptr pState = static_cast<lzham_decompress_state_ptr>(pStream->state);
1511
+ if (pState)
1512
+ {
1513
+ pStream->adler = lzham_lib_decompress_deinit(pState);
1514
+ pStream->state = NULL;
1515
+ }
1516
+
1517
+ return LZHAM_Z_OK;
1518
+ }
1519
+
1520
+ int LZHAM_CDECL lzham_lib_z_uncompress(unsigned char *pDest, lzham_z_ulong *pDest_len, const unsigned char *pSource, lzham_z_ulong source_len)
1521
+ {
1522
+ lzham_z_stream stream;
1523
+ int status;
1524
+ memset(&stream, 0, sizeof(stream));
1525
+
1526
+ // In case lzham_z_ulong is 64-bits (argh I hate longs).
1527
+ if ((source_len | *pDest_len) > 0xFFFFFFFFU)
1528
+ return LZHAM_Z_PARAM_ERROR;
1529
+
1530
+ stream.next_in = pSource;
1531
+ stream.avail_in = (uint)source_len;
1532
+ stream.next_out = pDest;
1533
+ stream.avail_out = (uint)*pDest_len;
1534
+
1535
+ status = lzham_lib_z_inflateInit(&stream);
1536
+ if (status != LZHAM_Z_OK)
1537
+ return status;
1538
+
1539
+ status = lzham_lib_z_inflate(&stream, LZHAM_Z_FINISH);
1540
+ if (status != LZHAM_Z_STREAM_END)
1541
+ {
1542
+ lzham_lib_z_inflateEnd(&stream);
1543
+ return ((status == LZHAM_Z_BUF_ERROR) && (!stream.avail_in)) ? LZHAM_Z_DATA_ERROR : status;
1544
+ }
1545
+ *pDest_len = stream.total_out;
1546
+
1547
+ return lzham_lib_z_inflateEnd(&stream);
1548
+ }
1549
+
1550
+ const char * LZHAM_CDECL lzham_lib_z_error(int err)
1551
+ {
1552
+ static struct
1553
+ {
1554
+ int m_err;
1555
+ const char *m_pDesc;
1556
+ }
1557
+ s_error_descs[] =
1558
+ {
1559
+ { LZHAM_Z_OK, "" },
1560
+ { LZHAM_Z_STREAM_END, "stream end" },
1561
+ { LZHAM_Z_NEED_DICT, "need dictionary" },
1562
+ { LZHAM_Z_ERRNO, "file error" },
1563
+ { LZHAM_Z_STREAM_ERROR, "stream error" },
1564
+ { LZHAM_Z_DATA_ERROR, "data error" },
1565
+ { LZHAM_Z_MEM_ERROR, "out of memory" },
1566
+ { LZHAM_Z_BUF_ERROR, "buf error" },
1567
+ { LZHAM_Z_VERSION_ERROR, "version error" },
1568
+ { LZHAM_Z_PARAM_ERROR, "parameter error" }
1569
+ };
1570
+ for (uint i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i)
1571
+ if (s_error_descs[i].m_err == err)
1572
+ return s_error_descs[i].m_pDesc;
1573
+ return NULL;
1574
+ }
1575
+
1576
+ lzham_z_ulong lzham_lib_z_adler32(lzham_z_ulong adler, const unsigned char *ptr, size_t buf_len)
1577
+ {
1578
+ return adler32(ptr, buf_len, static_cast<uint>(adler));
1579
+ }
1580
+
1581
+ lzham_z_ulong LZHAM_CDECL lzham_lib_z_crc32(lzham_z_ulong crc, const lzham_uint8 *ptr, size_t buf_len)
1582
+ {
1583
+ return crc32(static_cast<uint>(crc), ptr, buf_len);
1584
+ }
1585
+
1586
+ } // namespace lzham