laag-xz 5.2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (393) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +57 -0
  3. data/LICENSE.txt +65 -0
  4. data/README.org +34 -0
  5. data/ext/laag/xz/extconf.rb +21 -0
  6. data/laag-xz.gemspec +20 -0
  7. data/lib/laag/xz.rb +29 -0
  8. data/vendor/git.tukaani.org/xz/.gitignore +66 -0
  9. data/vendor/git.tukaani.org/xz/AUTHORS +27 -0
  10. data/vendor/git.tukaani.org/xz/COPYING +65 -0
  11. data/vendor/git.tukaani.org/xz/COPYING.GPLv2 +339 -0
  12. data/vendor/git.tukaani.org/xz/COPYING.GPLv3 +674 -0
  13. data/vendor/git.tukaani.org/xz/COPYING.LGPLv2.1 +502 -0
  14. data/vendor/git.tukaani.org/xz/ChangeLog +7 -0
  15. data/vendor/git.tukaani.org/xz/Doxyfile.in +1234 -0
  16. data/vendor/git.tukaani.org/xz/INSTALL +618 -0
  17. data/vendor/git.tukaani.org/xz/INSTALL.generic +365 -0
  18. data/vendor/git.tukaani.org/xz/Makefile.am +110 -0
  19. data/vendor/git.tukaani.org/xz/NEWS +571 -0
  20. data/vendor/git.tukaani.org/xz/PACKAGERS +231 -0
  21. data/vendor/git.tukaani.org/xz/README +308 -0
  22. data/vendor/git.tukaani.org/xz/THANKS +124 -0
  23. data/vendor/git.tukaani.org/xz/TODO +111 -0
  24. data/vendor/git.tukaani.org/xz/autogen.sh +22 -0
  25. data/vendor/git.tukaani.org/xz/build-aux/manconv.sh +58 -0
  26. data/vendor/git.tukaani.org/xz/build-aux/version.sh +24 -0
  27. data/vendor/git.tukaani.org/xz/configure.ac +900 -0
  28. data/vendor/git.tukaani.org/xz/debug/Makefile.am +30 -0
  29. data/vendor/git.tukaani.org/xz/debug/README +17 -0
  30. data/vendor/git.tukaani.org/xz/debug/crc32.c +39 -0
  31. data/vendor/git.tukaani.org/xz/debug/full_flush.c +103 -0
  32. data/vendor/git.tukaani.org/xz/debug/hex2bin.c +53 -0
  33. data/vendor/git.tukaani.org/xz/debug/known_sizes.c +129 -0
  34. data/vendor/git.tukaani.org/xz/debug/memusage.c +51 -0
  35. data/vendor/git.tukaani.org/xz/debug/repeat.c +36 -0
  36. data/vendor/git.tukaani.org/xz/debug/sync_flush.c +125 -0
  37. data/vendor/git.tukaani.org/xz/debug/translation.bash +100 -0
  38. data/vendor/git.tukaani.org/xz/doc/examples/00_README.txt +31 -0
  39. data/vendor/git.tukaani.org/xz/doc/examples/01_compress_easy.c +297 -0
  40. data/vendor/git.tukaani.org/xz/doc/examples/02_decompress.c +287 -0
  41. data/vendor/git.tukaani.org/xz/doc/examples/03_compress_custom.c +193 -0
  42. data/vendor/git.tukaani.org/xz/doc/examples/04_compress_easy_mt.c +206 -0
  43. data/vendor/git.tukaani.org/xz/doc/examples/Makefile +24 -0
  44. data/vendor/git.tukaani.org/xz/doc/examples_old/xz_pipe_comp.c +127 -0
  45. data/vendor/git.tukaani.org/xz/doc/examples_old/xz_pipe_decomp.c +123 -0
  46. data/vendor/git.tukaani.org/xz/doc/faq.txt +224 -0
  47. data/vendor/git.tukaani.org/xz/doc/history.txt +150 -0
  48. data/vendor/git.tukaani.org/xz/doc/lzma-file-format.txt +166 -0
  49. data/vendor/git.tukaani.org/xz/doc/xz-file-format.txt +1150 -0
  50. data/vendor/git.tukaani.org/xz/dos/INSTALL.txt +79 -0
  51. data/vendor/git.tukaani.org/xz/dos/Makefile +147 -0
  52. data/vendor/git.tukaani.org/xz/dos/README.txt +123 -0
  53. data/vendor/git.tukaani.org/xz/dos/config.h +136 -0
  54. data/vendor/git.tukaani.org/xz/extra/7z2lzma/7z2lzma.bash +115 -0
  55. data/vendor/git.tukaani.org/xz/extra/scanlzma/scanlzma.c +88 -0
  56. data/vendor/git.tukaani.org/xz/lib/Makefile.am +32 -0
  57. data/vendor/git.tukaani.org/xz/lib/getopt.c +1197 -0
  58. data/vendor/git.tukaani.org/xz/lib/getopt.in.h +226 -0
  59. data/vendor/git.tukaani.org/xz/lib/getopt1.c +171 -0
  60. data/vendor/git.tukaani.org/xz/lib/getopt_int.h +131 -0
  61. data/vendor/git.tukaani.org/xz/m4/.gitignore +38 -0
  62. data/vendor/git.tukaani.org/xz/m4/ax_check_capsicum.m4 +85 -0
  63. data/vendor/git.tukaani.org/xz/m4/ax_pthread.m4 +332 -0
  64. data/vendor/git.tukaani.org/xz/m4/getopt.m4 +71 -0
  65. data/vendor/git.tukaani.org/xz/m4/posix-shell.m4 +63 -0
  66. data/vendor/git.tukaani.org/xz/m4/tuklib_common.m4 +22 -0
  67. data/vendor/git.tukaani.org/xz/m4/tuklib_cpucores.m4 +176 -0
  68. data/vendor/git.tukaani.org/xz/m4/tuklib_integer.m4 +74 -0
  69. data/vendor/git.tukaani.org/xz/m4/tuklib_mbstr.m4 +30 -0
  70. data/vendor/git.tukaani.org/xz/m4/tuklib_physmem.m4 +212 -0
  71. data/vendor/git.tukaani.org/xz/m4/tuklib_progname.m4 +25 -0
  72. data/vendor/git.tukaani.org/xz/macosx/build.sh +113 -0
  73. data/vendor/git.tukaani.org/xz/po/.gitignore +31 -0
  74. data/vendor/git.tukaani.org/xz/po/LINGUAS +6 -0
  75. data/vendor/git.tukaani.org/xz/po/Makevars +46 -0
  76. data/vendor/git.tukaani.org/xz/po/POTFILES.in +13 -0
  77. data/vendor/git.tukaani.org/xz/po/cs.po +949 -0
  78. data/vendor/git.tukaani.org/xz/po/de.po +993 -0
  79. data/vendor/git.tukaani.org/xz/po/fr.po +978 -0
  80. data/vendor/git.tukaani.org/xz/po/it.po +1067 -0
  81. data/vendor/git.tukaani.org/xz/po/pl.po +968 -0
  82. data/vendor/git.tukaani.org/xz/po/vi.po +1039 -0
  83. data/vendor/git.tukaani.org/xz/src/Makefile.am +42 -0
  84. data/vendor/git.tukaani.org/xz/src/common/common_w32res.rc +50 -0
  85. data/vendor/git.tukaani.org/xz/src/common/mythread.h +521 -0
  86. data/vendor/git.tukaani.org/xz/src/common/sysdefs.h +202 -0
  87. data/vendor/git.tukaani.org/xz/src/common/tuklib_common.h +71 -0
  88. data/vendor/git.tukaani.org/xz/src/common/tuklib_config.h +7 -0
  89. data/vendor/git.tukaani.org/xz/src/common/tuklib_cpucores.c +100 -0
  90. data/vendor/git.tukaani.org/xz/src/common/tuklib_cpucores.h +23 -0
  91. data/vendor/git.tukaani.org/xz/src/common/tuklib_exit.c +57 -0
  92. data/vendor/git.tukaani.org/xz/src/common/tuklib_exit.h +25 -0
  93. data/vendor/git.tukaani.org/xz/src/common/tuklib_gettext.h +44 -0
  94. data/vendor/git.tukaani.org/xz/src/common/tuklib_integer.h +534 -0
  95. data/vendor/git.tukaani.org/xz/src/common/tuklib_mbstr.h +66 -0
  96. data/vendor/git.tukaani.org/xz/src/common/tuklib_mbstr_fw.c +31 -0
  97. data/vendor/git.tukaani.org/xz/src/common/tuklib_mbstr_width.c +64 -0
  98. data/vendor/git.tukaani.org/xz/src/common/tuklib_open_stdxxx.c +57 -0
  99. data/vendor/git.tukaani.org/xz/src/common/tuklib_open_stdxxx.h +23 -0
  100. data/vendor/git.tukaani.org/xz/src/common/tuklib_physmem.c +216 -0
  101. data/vendor/git.tukaani.org/xz/src/common/tuklib_physmem.h +28 -0
  102. data/vendor/git.tukaani.org/xz/src/common/tuklib_progname.c +50 -0
  103. data/vendor/git.tukaani.org/xz/src/common/tuklib_progname.h +32 -0
  104. data/vendor/git.tukaani.org/xz/src/liblzma/Makefile.am +122 -0
  105. data/vendor/git.tukaani.org/xz/src/liblzma/api/Makefile.am +23 -0
  106. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma.h +325 -0
  107. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/base.h +659 -0
  108. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/bcj.h +90 -0
  109. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/block.h +581 -0
  110. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/check.h +150 -0
  111. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/container.h +632 -0
  112. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/delta.h +77 -0
  113. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/filter.h +425 -0
  114. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/hardware.h +64 -0
  115. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/index.h +686 -0
  116. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/index_hash.h +107 -0
  117. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/lzma12.h +420 -0
  118. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/stream_flags.h +223 -0
  119. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/version.h +121 -0
  120. data/vendor/git.tukaani.org/xz/src/liblzma/api/lzma/vli.h +166 -0
  121. data/vendor/git.tukaani.org/xz/src/liblzma/check/Makefile.inc +53 -0
  122. data/vendor/git.tukaani.org/xz/src/liblzma/check/check.c +174 -0
  123. data/vendor/git.tukaani.org/xz/src/liblzma/check/check.h +172 -0
  124. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc32_fast.c +82 -0
  125. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc32_small.c +61 -0
  126. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc32_table.c +19 -0
  127. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc32_table_be.h +525 -0
  128. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc32_table_le.h +525 -0
  129. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc32_tablegen.c +117 -0
  130. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc32_x86.S +304 -0
  131. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc64_fast.c +72 -0
  132. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc64_small.c +53 -0
  133. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc64_table.c +19 -0
  134. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc64_table_be.h +521 -0
  135. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc64_table_le.h +521 -0
  136. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc64_tablegen.c +88 -0
  137. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc64_x86.S +287 -0
  138. data/vendor/git.tukaani.org/xz/src/liblzma/check/crc_macros.h +30 -0
  139. data/vendor/git.tukaani.org/xz/src/liblzma/check/sha256.c +196 -0
  140. data/vendor/git.tukaani.org/xz/src/liblzma/common/Makefile.inc +79 -0
  141. data/vendor/git.tukaani.org/xz/src/liblzma/common/alone_decoder.c +243 -0
  142. data/vendor/git.tukaani.org/xz/src/liblzma/common/alone_decoder.h +23 -0
  143. data/vendor/git.tukaani.org/xz/src/liblzma/common/alone_encoder.c +163 -0
  144. data/vendor/git.tukaani.org/xz/src/liblzma/common/auto_decoder.c +195 -0
  145. data/vendor/git.tukaani.org/xz/src/liblzma/common/block_buffer_decoder.c +80 -0
  146. data/vendor/git.tukaani.org/xz/src/liblzma/common/block_buffer_encoder.c +337 -0
  147. data/vendor/git.tukaani.org/xz/src/liblzma/common/block_buffer_encoder.h +24 -0
  148. data/vendor/git.tukaani.org/xz/src/liblzma/common/block_decoder.c +257 -0
  149. data/vendor/git.tukaani.org/xz/src/liblzma/common/block_decoder.h +22 -0
  150. data/vendor/git.tukaani.org/xz/src/liblzma/common/block_encoder.c +223 -0
  151. data/vendor/git.tukaani.org/xz/src/liblzma/common/block_encoder.h +47 -0
  152. data/vendor/git.tukaani.org/xz/src/liblzma/common/block_header_decoder.c +124 -0
  153. data/vendor/git.tukaani.org/xz/src/liblzma/common/block_header_encoder.c +132 -0
  154. data/vendor/git.tukaani.org/xz/src/liblzma/common/block_util.c +90 -0
  155. data/vendor/git.tukaani.org/xz/src/liblzma/common/common.c +445 -0
  156. data/vendor/git.tukaani.org/xz/src/liblzma/common/common.h +314 -0
  157. data/vendor/git.tukaani.org/xz/src/liblzma/common/easy_buffer_encoder.c +27 -0
  158. data/vendor/git.tukaani.org/xz/src/liblzma/common/easy_decoder_memusage.c +24 -0
  159. data/vendor/git.tukaani.org/xz/src/liblzma/common/easy_encoder.c +24 -0
  160. data/vendor/git.tukaani.org/xz/src/liblzma/common/easy_encoder_memusage.c +24 -0
  161. data/vendor/git.tukaani.org/xz/src/liblzma/common/easy_preset.c +27 -0
  162. data/vendor/git.tukaani.org/xz/src/liblzma/common/easy_preset.h +32 -0
  163. data/vendor/git.tukaani.org/xz/src/liblzma/common/filter_buffer_decoder.c +88 -0
  164. data/vendor/git.tukaani.org/xz/src/liblzma/common/filter_buffer_encoder.c +55 -0
  165. data/vendor/git.tukaani.org/xz/src/liblzma/common/filter_common.c +337 -0
  166. data/vendor/git.tukaani.org/xz/src/liblzma/common/filter_common.h +48 -0
  167. data/vendor/git.tukaani.org/xz/src/liblzma/common/filter_decoder.c +184 -0
  168. data/vendor/git.tukaani.org/xz/src/liblzma/common/filter_decoder.h +23 -0
  169. data/vendor/git.tukaani.org/xz/src/liblzma/common/filter_encoder.c +286 -0
  170. data/vendor/git.tukaani.org/xz/src/liblzma/common/filter_encoder.h +27 -0
  171. data/vendor/git.tukaani.org/xz/src/liblzma/common/filter_flags_decoder.c +46 -0
  172. data/vendor/git.tukaani.org/xz/src/liblzma/common/filter_flags_encoder.c +56 -0
  173. data/vendor/git.tukaani.org/xz/src/liblzma/common/hardware_cputhreads.c +22 -0
  174. data/vendor/git.tukaani.org/xz/src/liblzma/common/hardware_physmem.c +25 -0
  175. data/vendor/git.tukaani.org/xz/src/liblzma/common/index.c +1250 -0
  176. data/vendor/git.tukaani.org/xz/src/liblzma/common/index.h +73 -0
  177. data/vendor/git.tukaani.org/xz/src/liblzma/common/index_decoder.c +352 -0
  178. data/vendor/git.tukaani.org/xz/src/liblzma/common/index_encoder.c +256 -0
  179. data/vendor/git.tukaani.org/xz/src/liblzma/common/index_encoder.h +23 -0
  180. data/vendor/git.tukaani.org/xz/src/liblzma/common/index_hash.c +334 -0
  181. data/vendor/git.tukaani.org/xz/src/liblzma/common/memcmplen.h +175 -0
  182. data/vendor/git.tukaani.org/xz/src/liblzma/common/outqueue.c +184 -0
  183. data/vendor/git.tukaani.org/xz/src/liblzma/common/outqueue.h +156 -0
  184. data/vendor/git.tukaani.org/xz/src/liblzma/common/stream_buffer_decoder.c +91 -0
  185. data/vendor/git.tukaani.org/xz/src/liblzma/common/stream_buffer_encoder.c +141 -0
  186. data/vendor/git.tukaani.org/xz/src/liblzma/common/stream_decoder.c +467 -0
  187. data/vendor/git.tukaani.org/xz/src/liblzma/common/stream_decoder.h +22 -0
  188. data/vendor/git.tukaani.org/xz/src/liblzma/common/stream_encoder.c +340 -0
  189. data/vendor/git.tukaani.org/xz/src/liblzma/common/stream_encoder_mt.c +1143 -0
  190. data/vendor/git.tukaani.org/xz/src/liblzma/common/stream_flags_common.c +47 -0
  191. data/vendor/git.tukaani.org/xz/src/liblzma/common/stream_flags_common.h +33 -0
  192. data/vendor/git.tukaani.org/xz/src/liblzma/common/stream_flags_decoder.c +82 -0
  193. data/vendor/git.tukaani.org/xz/src/liblzma/common/stream_flags_encoder.c +86 -0
  194. data/vendor/git.tukaani.org/xz/src/liblzma/common/vli_decoder.c +86 -0
  195. data/vendor/git.tukaani.org/xz/src/liblzma/common/vli_encoder.c +69 -0
  196. data/vendor/git.tukaani.org/xz/src/liblzma/common/vli_size.c +30 -0
  197. data/vendor/git.tukaani.org/xz/src/liblzma/delta/Makefile.inc +23 -0
  198. data/vendor/git.tukaani.org/xz/src/liblzma/delta/delta_common.c +73 -0
  199. data/vendor/git.tukaani.org/xz/src/liblzma/delta/delta_common.h +20 -0
  200. data/vendor/git.tukaani.org/xz/src/liblzma/delta/delta_decoder.c +78 -0
  201. data/vendor/git.tukaani.org/xz/src/liblzma/delta/delta_decoder.h +26 -0
  202. data/vendor/git.tukaani.org/xz/src/liblzma/delta/delta_encoder.c +125 -0
  203. data/vendor/git.tukaani.org/xz/src/liblzma/delta/delta_encoder.h +24 -0
  204. data/vendor/git.tukaani.org/xz/src/liblzma/delta/delta_private.h +37 -0
  205. data/vendor/git.tukaani.org/xz/src/liblzma/liblzma.map +108 -0
  206. data/vendor/git.tukaani.org/xz/src/liblzma/liblzma.pc.in +19 -0
  207. data/vendor/git.tukaani.org/xz/src/liblzma/liblzma_w32res.rc +12 -0
  208. data/vendor/git.tukaani.org/xz/src/liblzma/lz/Makefile.inc +22 -0
  209. data/vendor/git.tukaani.org/xz/src/liblzma/lz/lz_decoder.c +306 -0
  210. data/vendor/git.tukaani.org/xz/src/liblzma/lz/lz_decoder.h +234 -0
  211. data/vendor/git.tukaani.org/xz/src/liblzma/lz/lz_encoder.c +616 -0
  212. data/vendor/git.tukaani.org/xz/src/liblzma/lz/lz_encoder.h +327 -0
  213. data/vendor/git.tukaani.org/xz/src/liblzma/lz/lz_encoder_hash.h +108 -0
  214. data/vendor/git.tukaani.org/xz/src/liblzma/lz/lz_encoder_hash_table.h +68 -0
  215. data/vendor/git.tukaani.org/xz/src/liblzma/lz/lz_encoder_mf.c +744 -0
  216. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/Makefile.inc +47 -0
  217. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/fastpos.h +141 -0
  218. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/fastpos_table.c +519 -0
  219. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/fastpos_tablegen.c +56 -0
  220. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma2_decoder.c +310 -0
  221. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma2_decoder.h +29 -0
  222. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma2_encoder.c +410 -0
  223. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma2_encoder.h +43 -0
  224. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma_common.h +224 -0
  225. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma_decoder.c +1064 -0
  226. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma_decoder.h +53 -0
  227. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma_encoder.c +677 -0
  228. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma_encoder.h +58 -0
  229. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma_encoder_optimum_fast.c +170 -0
  230. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma_encoder_optimum_normal.c +855 -0
  231. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma_encoder_presets.c +64 -0
  232. data/vendor/git.tukaani.org/xz/src/liblzma/lzma/lzma_encoder_private.h +148 -0
  233. data/vendor/git.tukaani.org/xz/src/liblzma/rangecoder/Makefile.inc +21 -0
  234. data/vendor/git.tukaani.org/xz/src/liblzma/rangecoder/price.h +92 -0
  235. data/vendor/git.tukaani.org/xz/src/liblzma/rangecoder/price_table.c +22 -0
  236. data/vendor/git.tukaani.org/xz/src/liblzma/rangecoder/price_tablegen.c +87 -0
  237. data/vendor/git.tukaani.org/xz/src/liblzma/rangecoder/range_common.h +71 -0
  238. data/vendor/git.tukaani.org/xz/src/liblzma/rangecoder/range_decoder.h +185 -0
  239. data/vendor/git.tukaani.org/xz/src/liblzma/rangecoder/range_encoder.h +231 -0
  240. data/vendor/git.tukaani.org/xz/src/liblzma/simple/Makefile.inc +47 -0
  241. data/vendor/git.tukaani.org/xz/src/liblzma/simple/arm.c +71 -0
  242. data/vendor/git.tukaani.org/xz/src/liblzma/simple/armthumb.c +76 -0
  243. data/vendor/git.tukaani.org/xz/src/liblzma/simple/ia64.c +112 -0
  244. data/vendor/git.tukaani.org/xz/src/liblzma/simple/powerpc.c +75 -0
  245. data/vendor/git.tukaani.org/xz/src/liblzma/simple/simple_coder.c +282 -0
  246. data/vendor/git.tukaani.org/xz/src/liblzma/simple/simple_coder.h +72 -0
  247. data/vendor/git.tukaani.org/xz/src/liblzma/simple/simple_decoder.c +40 -0
  248. data/vendor/git.tukaani.org/xz/src/liblzma/simple/simple_decoder.h +22 -0
  249. data/vendor/git.tukaani.org/xz/src/liblzma/simple/simple_encoder.c +38 -0
  250. data/vendor/git.tukaani.org/xz/src/liblzma/simple/simple_encoder.h +23 -0
  251. data/vendor/git.tukaani.org/xz/src/liblzma/simple/simple_private.h +74 -0
  252. data/vendor/git.tukaani.org/xz/src/liblzma/simple/sparc.c +83 -0
  253. data/vendor/git.tukaani.org/xz/src/liblzma/simple/x86.c +159 -0
  254. data/vendor/git.tukaani.org/xz/src/liblzma/validate_map.sh +68 -0
  255. data/vendor/git.tukaani.org/xz/src/lzmainfo/Makefile.am +39 -0
  256. data/vendor/git.tukaani.org/xz/src/lzmainfo/lzmainfo.1 +60 -0
  257. data/vendor/git.tukaani.org/xz/src/lzmainfo/lzmainfo.c +219 -0
  258. data/vendor/git.tukaani.org/xz/src/lzmainfo/lzmainfo_w32res.rc +12 -0
  259. data/vendor/git.tukaani.org/xz/src/scripts/Makefile.am +55 -0
  260. data/vendor/git.tukaani.org/xz/src/scripts/xzdiff.1 +77 -0
  261. data/vendor/git.tukaani.org/xz/src/scripts/xzdiff.in +200 -0
  262. data/vendor/git.tukaani.org/xz/src/scripts/xzgrep.1 +98 -0
  263. data/vendor/git.tukaani.org/xz/src/scripts/xzgrep.in +215 -0
  264. data/vendor/git.tukaani.org/xz/src/scripts/xzless.1 +69 -0
  265. data/vendor/git.tukaani.org/xz/src/scripts/xzless.in +58 -0
  266. data/vendor/git.tukaani.org/xz/src/scripts/xzmore.1 +55 -0
  267. data/vendor/git.tukaani.org/xz/src/scripts/xzmore.in +78 -0
  268. data/vendor/git.tukaani.org/xz/src/xz/Makefile.am +111 -0
  269. data/vendor/git.tukaani.org/xz/src/xz/args.c +700 -0
  270. data/vendor/git.tukaani.org/xz/src/xz/args.h +44 -0
  271. data/vendor/git.tukaani.org/xz/src/xz/coder.c +936 -0
  272. data/vendor/git.tukaani.org/xz/src/xz/coder.h +76 -0
  273. data/vendor/git.tukaani.org/xz/src/xz/file_io.c +1300 -0
  274. data/vendor/git.tukaani.org/xz/src/xz/file_io.h +156 -0
  275. data/vendor/git.tukaani.org/xz/src/xz/hardware.c +150 -0
  276. data/vendor/git.tukaani.org/xz/src/xz/hardware.h +37 -0
  277. data/vendor/git.tukaani.org/xz/src/xz/list.c +1192 -0
  278. data/vendor/git.tukaani.org/xz/src/xz/list.h +18 -0
  279. data/vendor/git.tukaani.org/xz/src/xz/main.c +330 -0
  280. data/vendor/git.tukaani.org/xz/src/xz/main.h +30 -0
  281. data/vendor/git.tukaani.org/xz/src/xz/message.c +1258 -0
  282. data/vendor/git.tukaani.org/xz/src/xz/message.h +167 -0
  283. data/vendor/git.tukaani.org/xz/src/xz/mytime.c +89 -0
  284. data/vendor/git.tukaani.org/xz/src/xz/mytime.h +47 -0
  285. data/vendor/git.tukaani.org/xz/src/xz/options.c +363 -0
  286. data/vendor/git.tukaani.org/xz/src/xz/options.h +31 -0
  287. data/vendor/git.tukaani.org/xz/src/xz/private.h +66 -0
  288. data/vendor/git.tukaani.org/xz/src/xz/signals.c +209 -0
  289. data/vendor/git.tukaani.org/xz/src/xz/signals.h +43 -0
  290. data/vendor/git.tukaani.org/xz/src/xz/suffix.c +399 -0
  291. data/vendor/git.tukaani.org/xz/src/xz/suffix.h +28 -0
  292. data/vendor/git.tukaani.org/xz/src/xz/util.c +288 -0
  293. data/vendor/git.tukaani.org/xz/src/xz/util.h +123 -0
  294. data/vendor/git.tukaani.org/xz/src/xz/xz.1 +2786 -0
  295. data/vendor/git.tukaani.org/xz/src/xz/xz_w32res.rc +12 -0
  296. data/vendor/git.tukaani.org/xz/src/xzdec/Makefile.am +82 -0
  297. data/vendor/git.tukaani.org/xz/src/xzdec/lzmadec_w32res.rc +12 -0
  298. data/vendor/git.tukaani.org/xz/src/xzdec/xzdec.1 +146 -0
  299. data/vendor/git.tukaani.org/xz/src/xzdec/xzdec.c +323 -0
  300. data/vendor/git.tukaani.org/xz/src/xzdec/xzdec_w32res.rc +12 -0
  301. data/vendor/git.tukaani.org/xz/tests/Makefile.am +57 -0
  302. data/vendor/git.tukaani.org/xz/tests/bcj_test.c +65 -0
  303. data/vendor/git.tukaani.org/xz/tests/compress_prepared_bcj_sparc +0 -0
  304. data/vendor/git.tukaani.org/xz/tests/compress_prepared_bcj_x86 +0 -0
  305. data/vendor/git.tukaani.org/xz/tests/create_compress_files.c +158 -0
  306. data/vendor/git.tukaani.org/xz/tests/files/README +240 -0
  307. data/vendor/git.tukaani.org/xz/tests/files/bad-0-backward_size.xz +0 -0
  308. data/vendor/git.tukaani.org/xz/tests/files/bad-0-empty-truncated.xz +0 -0
  309. data/vendor/git.tukaani.org/xz/tests/files/bad-0-footer_magic.xz +0 -0
  310. data/vendor/git.tukaani.org/xz/tests/files/bad-0-header_magic.xz +0 -0
  311. data/vendor/git.tukaani.org/xz/tests/files/bad-0-nonempty_index.xz +0 -0
  312. data/vendor/git.tukaani.org/xz/tests/files/bad-0cat-alone.xz +0 -0
  313. data/vendor/git.tukaani.org/xz/tests/files/bad-0cat-header_magic.xz +0 -0
  314. data/vendor/git.tukaani.org/xz/tests/files/bad-0catpad-empty.xz +0 -0
  315. data/vendor/git.tukaani.org/xz/tests/files/bad-0pad-empty.xz +0 -0
  316. data/vendor/git.tukaani.org/xz/tests/files/bad-1-block_header-1.xz +0 -0
  317. data/vendor/git.tukaani.org/xz/tests/files/bad-1-block_header-2.xz +0 -0
  318. data/vendor/git.tukaani.org/xz/tests/files/bad-1-block_header-3.xz +0 -0
  319. data/vendor/git.tukaani.org/xz/tests/files/bad-1-block_header-4.xz +0 -0
  320. data/vendor/git.tukaani.org/xz/tests/files/bad-1-block_header-5.xz +0 -0
  321. data/vendor/git.tukaani.org/xz/tests/files/bad-1-block_header-6.xz +0 -0
  322. data/vendor/git.tukaani.org/xz/tests/files/bad-1-check-crc32.xz +0 -0
  323. data/vendor/git.tukaani.org/xz/tests/files/bad-1-check-crc64.xz +0 -0
  324. data/vendor/git.tukaani.org/xz/tests/files/bad-1-check-sha256.xz +0 -0
  325. data/vendor/git.tukaani.org/xz/tests/files/bad-1-lzma2-1.xz +0 -0
  326. data/vendor/git.tukaani.org/xz/tests/files/bad-1-lzma2-2.xz +0 -0
  327. data/vendor/git.tukaani.org/xz/tests/files/bad-1-lzma2-3.xz +0 -0
  328. data/vendor/git.tukaani.org/xz/tests/files/bad-1-lzma2-4.xz +0 -0
  329. data/vendor/git.tukaani.org/xz/tests/files/bad-1-lzma2-5.xz +0 -0
  330. data/vendor/git.tukaani.org/xz/tests/files/bad-1-lzma2-6.xz +0 -0
  331. data/vendor/git.tukaani.org/xz/tests/files/bad-1-lzma2-7.xz +0 -0
  332. data/vendor/git.tukaani.org/xz/tests/files/bad-1-lzma2-8.xz +0 -0
  333. data/vendor/git.tukaani.org/xz/tests/files/bad-1-stream_flags-1.xz +0 -0
  334. data/vendor/git.tukaani.org/xz/tests/files/bad-1-stream_flags-2.xz +0 -0
  335. data/vendor/git.tukaani.org/xz/tests/files/bad-1-stream_flags-3.xz +0 -0
  336. data/vendor/git.tukaani.org/xz/tests/files/bad-1-vli-1.xz +0 -0
  337. data/vendor/git.tukaani.org/xz/tests/files/bad-1-vli-2.xz +0 -0
  338. data/vendor/git.tukaani.org/xz/tests/files/bad-2-compressed_data_padding.xz +0 -0
  339. data/vendor/git.tukaani.org/xz/tests/files/bad-2-index-1.xz +0 -0
  340. data/vendor/git.tukaani.org/xz/tests/files/bad-2-index-2.xz +0 -0
  341. data/vendor/git.tukaani.org/xz/tests/files/bad-2-index-3.xz +0 -0
  342. data/vendor/git.tukaani.org/xz/tests/files/bad-2-index-4.xz +0 -0
  343. data/vendor/git.tukaani.org/xz/tests/files/bad-2-index-5.xz +0 -0
  344. data/vendor/git.tukaani.org/xz/tests/files/good-0-empty.xz +0 -0
  345. data/vendor/git.tukaani.org/xz/tests/files/good-0cat-empty.xz +0 -0
  346. data/vendor/git.tukaani.org/xz/tests/files/good-0catpad-empty.xz +0 -0
  347. data/vendor/git.tukaani.org/xz/tests/files/good-0pad-empty.xz +0 -0
  348. data/vendor/git.tukaani.org/xz/tests/files/good-1-3delta-lzma2.xz +0 -0
  349. data/vendor/git.tukaani.org/xz/tests/files/good-1-block_header-1.xz +0 -0
  350. data/vendor/git.tukaani.org/xz/tests/files/good-1-block_header-2.xz +0 -0
  351. data/vendor/git.tukaani.org/xz/tests/files/good-1-block_header-3.xz +0 -0
  352. data/vendor/git.tukaani.org/xz/tests/files/good-1-check-crc32.xz +0 -0
  353. data/vendor/git.tukaani.org/xz/tests/files/good-1-check-crc64.xz +0 -0
  354. data/vendor/git.tukaani.org/xz/tests/files/good-1-check-none.xz +0 -0
  355. data/vendor/git.tukaani.org/xz/tests/files/good-1-check-sha256.xz +0 -0
  356. data/vendor/git.tukaani.org/xz/tests/files/good-1-delta-lzma2.tiff.xz +0 -0
  357. data/vendor/git.tukaani.org/xz/tests/files/good-1-lzma2-1.xz +0 -0
  358. data/vendor/git.tukaani.org/xz/tests/files/good-1-lzma2-2.xz +0 -0
  359. data/vendor/git.tukaani.org/xz/tests/files/good-1-lzma2-3.xz +0 -0
  360. data/vendor/git.tukaani.org/xz/tests/files/good-1-lzma2-4.xz +0 -0
  361. data/vendor/git.tukaani.org/xz/tests/files/good-1-lzma2-5.xz +0 -0
  362. data/vendor/git.tukaani.org/xz/tests/files/good-1-sparc-lzma2.xz +0 -0
  363. data/vendor/git.tukaani.org/xz/tests/files/good-1-x86-lzma2.xz +0 -0
  364. data/vendor/git.tukaani.org/xz/tests/files/good-2-lzma2.xz +0 -0
  365. data/vendor/git.tukaani.org/xz/tests/files/unsupported-block_header.xz +0 -0
  366. data/vendor/git.tukaani.org/xz/tests/files/unsupported-check.xz +0 -0
  367. data/vendor/git.tukaani.org/xz/tests/files/unsupported-filter_flags-1.xz +0 -0
  368. data/vendor/git.tukaani.org/xz/tests/files/unsupported-filter_flags-2.xz +0 -0
  369. data/vendor/git.tukaani.org/xz/tests/files/unsupported-filter_flags-3.xz +0 -0
  370. data/vendor/git.tukaani.org/xz/tests/test_bcj_exact_size.c +113 -0
  371. data/vendor/git.tukaani.org/xz/tests/test_block_header.c +240 -0
  372. data/vendor/git.tukaani.org/xz/tests/test_check.c +83 -0
  373. data/vendor/git.tukaani.org/xz/tests/test_compress.sh +142 -0
  374. data/vendor/git.tukaani.org/xz/tests/test_files.sh +57 -0
  375. data/vendor/git.tukaani.org/xz/tests/test_filter_flags.c +258 -0
  376. data/vendor/git.tukaani.org/xz/tests/test_index.c +689 -0
  377. data/vendor/git.tukaani.org/xz/tests/test_scripts.sh +76 -0
  378. data/vendor/git.tukaani.org/xz/tests/test_stream_flags.c +180 -0
  379. data/vendor/git.tukaani.org/xz/tests/tests.h +124 -0
  380. data/vendor/git.tukaani.org/xz/tests/xzgrep_expected_output +39 -0
  381. data/vendor/git.tukaani.org/xz/windows/INSTALL-MSVC.txt +47 -0
  382. data/vendor/git.tukaani.org/xz/windows/INSTALL-MinGW.txt +138 -0
  383. data/vendor/git.tukaani.org/xz/windows/README-Windows.txt +122 -0
  384. data/vendor/git.tukaani.org/xz/windows/build.bash +203 -0
  385. data/vendor/git.tukaani.org/xz/windows/vs2013/config.h +148 -0
  386. data/vendor/git.tukaani.org/xz/windows/vs2013/liblzma.vcxproj +354 -0
  387. data/vendor/git.tukaani.org/xz/windows/vs2013/liblzma_dll.vcxproj +383 -0
  388. data/vendor/git.tukaani.org/xz/windows/vs2013/xz_win.sln +48 -0
  389. data/vendor/git.tukaani.org/xz/windows/vs2017/config.h +148 -0
  390. data/vendor/git.tukaani.org/xz/windows/vs2017/liblzma.vcxproj +355 -0
  391. data/vendor/git.tukaani.org/xz/windows/vs2017/liblzma_dll.vcxproj +384 -0
  392. data/vendor/git.tukaani.org/xz/windows/vs2017/xz_win.sln +48 -0
  393. metadata +457 -0
@@ -0,0 +1,58 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ /// \file lzma_encoder.h
4
+ /// \brief LZMA encoder API
5
+ ///
6
+ // Authors: Igor Pavlov
7
+ // Lasse Collin
8
+ //
9
+ // This file has been put into the public domain.
10
+ // You can do whatever you want with this file.
11
+ //
12
+ ///////////////////////////////////////////////////////////////////////////////
13
+
14
+ #ifndef LZMA_LZMA_ENCODER_H
15
+ #define LZMA_LZMA_ENCODER_H
16
+
17
+ #include "common.h"
18
+
19
+
20
+ typedef struct lzma_lzma1_encoder_s lzma_lzma1_encoder;
21
+
22
+
23
+ extern lzma_ret lzma_lzma_encoder_init(lzma_next_coder *next,
24
+ const lzma_allocator *allocator,
25
+ const lzma_filter_info *filters);
26
+
27
+
28
+ extern uint64_t lzma_lzma_encoder_memusage(const void *options);
29
+
30
+ extern lzma_ret lzma_lzma_props_encode(const void *options, uint8_t *out);
31
+
32
+
33
+ /// Encodes lc/lp/pb into one byte. Returns false on success and true on error.
34
+ extern bool lzma_lzma_lclppb_encode(
35
+ const lzma_options_lzma *options, uint8_t *byte);
36
+
37
+
38
+ #ifdef LZMA_LZ_ENCODER_H
39
+
40
+ /// Initializes raw LZMA encoder; this is used by LZMA2.
41
+ extern lzma_ret lzma_lzma_encoder_create(
42
+ void **coder_ptr, const lzma_allocator *allocator,
43
+ const lzma_options_lzma *options, lzma_lz_options *lz_options);
44
+
45
+
46
+ /// Resets an already initialized LZMA encoder; this is used by LZMA2.
47
+ extern lzma_ret lzma_lzma_encoder_reset(
48
+ lzma_lzma1_encoder *coder, const lzma_options_lzma *options);
49
+
50
+
51
+ extern lzma_ret lzma_lzma_encode(lzma_lzma1_encoder *restrict coder,
52
+ lzma_mf *restrict mf, uint8_t *restrict out,
53
+ size_t *restrict out_pos, size_t out_size,
54
+ uint32_t read_limit);
55
+
56
+ #endif
57
+
58
+ #endif
@@ -0,0 +1,170 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ /// \file lzma_encoder_optimum_fast.c
4
+ //
5
+ // Author: Igor Pavlov
6
+ //
7
+ // This file has been put into the public domain.
8
+ // You can do whatever you want with this file.
9
+ //
10
+ ///////////////////////////////////////////////////////////////////////////////
11
+
12
+ #include "lzma_encoder_private.h"
13
+ #include "memcmplen.h"
14
+
15
+
16
+ #define change_pair(small_dist, big_dist) \
17
+ (((big_dist) >> 7) > (small_dist))
18
+
19
+
20
+ extern void
21
+ lzma_lzma_optimum_fast(lzma_lzma1_encoder *restrict coder,
22
+ lzma_mf *restrict mf,
23
+ uint32_t *restrict back_res, uint32_t *restrict len_res)
24
+ {
25
+ const uint32_t nice_len = mf->nice_len;
26
+
27
+ uint32_t len_main;
28
+ uint32_t matches_count;
29
+ if (mf->read_ahead == 0) {
30
+ len_main = mf_find(mf, &matches_count, coder->matches);
31
+ } else {
32
+ assert(mf->read_ahead == 1);
33
+ len_main = coder->longest_match_length;
34
+ matches_count = coder->matches_count;
35
+ }
36
+
37
+ const uint8_t *buf = mf_ptr(mf) - 1;
38
+ const uint32_t buf_avail = my_min(mf_avail(mf) + 1, MATCH_LEN_MAX);
39
+
40
+ if (buf_avail < 2) {
41
+ // There's not enough input left to encode a match.
42
+ *back_res = UINT32_MAX;
43
+ *len_res = 1;
44
+ return;
45
+ }
46
+
47
+ // Look for repeated matches; scan the previous four match distances
48
+ uint32_t rep_len = 0;
49
+ uint32_t rep_index = 0;
50
+
51
+ for (uint32_t i = 0; i < REPS; ++i) {
52
+ // Pointer to the beginning of the match candidate
53
+ const uint8_t *const buf_back = buf - coder->reps[i] - 1;
54
+
55
+ // If the first two bytes (2 == MATCH_LEN_MIN) do not match,
56
+ // this rep is not useful.
57
+ if (not_equal_16(buf, buf_back))
58
+ continue;
59
+
60
+ // The first two bytes matched.
61
+ // Calculate the length of the match.
62
+ const uint32_t len = lzma_memcmplen(
63
+ buf, buf_back, 2, buf_avail);
64
+
65
+ // If we have found a repeated match that is at least
66
+ // nice_len long, return it immediately.
67
+ if (len >= nice_len) {
68
+ *back_res = i;
69
+ *len_res = len;
70
+ mf_skip(mf, len - 1);
71
+ return;
72
+ }
73
+
74
+ if (len > rep_len) {
75
+ rep_index = i;
76
+ rep_len = len;
77
+ }
78
+ }
79
+
80
+ // We didn't find a long enough repeated match. Encode it as a normal
81
+ // match if the match length is at least nice_len.
82
+ if (len_main >= nice_len) {
83
+ *back_res = coder->matches[matches_count - 1].dist + REPS;
84
+ *len_res = len_main;
85
+ mf_skip(mf, len_main - 1);
86
+ return;
87
+ }
88
+
89
+ uint32_t back_main = 0;
90
+ if (len_main >= 2) {
91
+ back_main = coder->matches[matches_count - 1].dist;
92
+
93
+ while (matches_count > 1 && len_main ==
94
+ coder->matches[matches_count - 2].len + 1) {
95
+ if (!change_pair(coder->matches[
96
+ matches_count - 2].dist,
97
+ back_main))
98
+ break;
99
+
100
+ --matches_count;
101
+ len_main = coder->matches[matches_count - 1].len;
102
+ back_main = coder->matches[matches_count - 1].dist;
103
+ }
104
+
105
+ if (len_main == 2 && back_main >= 0x80)
106
+ len_main = 1;
107
+ }
108
+
109
+ if (rep_len >= 2) {
110
+ if (rep_len + 1 >= len_main
111
+ || (rep_len + 2 >= len_main
112
+ && back_main > (UINT32_C(1) << 9))
113
+ || (rep_len + 3 >= len_main
114
+ && back_main > (UINT32_C(1) << 15))) {
115
+ *back_res = rep_index;
116
+ *len_res = rep_len;
117
+ mf_skip(mf, rep_len - 1);
118
+ return;
119
+ }
120
+ }
121
+
122
+ if (len_main < 2 || buf_avail <= 2) {
123
+ *back_res = UINT32_MAX;
124
+ *len_res = 1;
125
+ return;
126
+ }
127
+
128
+ // Get the matches for the next byte. If we find a better match,
129
+ // the current byte is encoded as a literal.
130
+ coder->longest_match_length = mf_find(mf,
131
+ &coder->matches_count, coder->matches);
132
+
133
+ if (coder->longest_match_length >= 2) {
134
+ const uint32_t new_dist = coder->matches[
135
+ coder->matches_count - 1].dist;
136
+
137
+ if ((coder->longest_match_length >= len_main
138
+ && new_dist < back_main)
139
+ || (coder->longest_match_length == len_main + 1
140
+ && !change_pair(back_main, new_dist))
141
+ || (coder->longest_match_length > len_main + 1)
142
+ || (coder->longest_match_length + 1 >= len_main
143
+ && len_main >= 3
144
+ && change_pair(new_dist, back_main))) {
145
+ *back_res = UINT32_MAX;
146
+ *len_res = 1;
147
+ return;
148
+ }
149
+ }
150
+
151
+ // In contrast to LZMA SDK, dictionary could not have been moved
152
+ // between mf_find() calls, thus it is safe to just increment
153
+ // the old buf pointer instead of recalculating it with mf_ptr().
154
+ ++buf;
155
+
156
+ const uint32_t limit = my_max(2, len_main - 1);
157
+
158
+ for (uint32_t i = 0; i < REPS; ++i) {
159
+ if (memcmp(buf, buf - coder->reps[i] - 1, limit) == 0) {
160
+ *back_res = UINT32_MAX;
161
+ *len_res = 1;
162
+ return;
163
+ }
164
+ }
165
+
166
+ *back_res = back_main + REPS;
167
+ *len_res = len_main;
168
+ mf_skip(mf, len_main - 2);
169
+ return;
170
+ }
@@ -0,0 +1,855 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ /// \file lzma_encoder_optimum_normal.c
4
+ //
5
+ // Author: Igor Pavlov
6
+ //
7
+ // This file has been put into the public domain.
8
+ // You can do whatever you want with this file.
9
+ //
10
+ ///////////////////////////////////////////////////////////////////////////////
11
+
12
+ #include "lzma_encoder_private.h"
13
+ #include "fastpos.h"
14
+ #include "memcmplen.h"
15
+
16
+
17
+ ////////////
18
+ // Prices //
19
+ ////////////
20
+
21
+ static uint32_t
22
+ get_literal_price(const lzma_lzma1_encoder *const coder, const uint32_t pos,
23
+ const uint32_t prev_byte, const bool match_mode,
24
+ uint32_t match_byte, uint32_t symbol)
25
+ {
26
+ const probability *const subcoder = literal_subcoder(coder->literal,
27
+ coder->literal_context_bits, coder->literal_pos_mask,
28
+ pos, prev_byte);
29
+
30
+ uint32_t price = 0;
31
+
32
+ if (!match_mode) {
33
+ price = rc_bittree_price(subcoder, 8, symbol);
34
+ } else {
35
+ uint32_t offset = 0x100;
36
+ symbol += UINT32_C(1) << 8;
37
+
38
+ do {
39
+ match_byte <<= 1;
40
+
41
+ const uint32_t match_bit = match_byte & offset;
42
+ const uint32_t subcoder_index
43
+ = offset + match_bit + (symbol >> 8);
44
+ const uint32_t bit = (symbol >> 7) & 1;
45
+ price += rc_bit_price(subcoder[subcoder_index], bit);
46
+
47
+ symbol <<= 1;
48
+ offset &= ~(match_byte ^ symbol);
49
+
50
+ } while (symbol < (UINT32_C(1) << 16));
51
+ }
52
+
53
+ return price;
54
+ }
55
+
56
+
57
+ static inline uint32_t
58
+ get_len_price(const lzma_length_encoder *const lencoder,
59
+ const uint32_t len, const uint32_t pos_state)
60
+ {
61
+ // NOTE: Unlike the other price tables, length prices are updated
62
+ // in lzma_encoder.c
63
+ return lencoder->prices[pos_state][len - MATCH_LEN_MIN];
64
+ }
65
+
66
+
67
+ static inline uint32_t
68
+ get_short_rep_price(const lzma_lzma1_encoder *const coder,
69
+ const lzma_lzma_state state, const uint32_t pos_state)
70
+ {
71
+ return rc_bit_0_price(coder->is_rep0[state])
72
+ + rc_bit_0_price(coder->is_rep0_long[state][pos_state]);
73
+ }
74
+
75
+
76
+ static inline uint32_t
77
+ get_pure_rep_price(const lzma_lzma1_encoder *const coder, const uint32_t rep_index,
78
+ const lzma_lzma_state state, uint32_t pos_state)
79
+ {
80
+ uint32_t price;
81
+
82
+ if (rep_index == 0) {
83
+ price = rc_bit_0_price(coder->is_rep0[state]);
84
+ price += rc_bit_1_price(coder->is_rep0_long[state][pos_state]);
85
+ } else {
86
+ price = rc_bit_1_price(coder->is_rep0[state]);
87
+
88
+ if (rep_index == 1) {
89
+ price += rc_bit_0_price(coder->is_rep1[state]);
90
+ } else {
91
+ price += rc_bit_1_price(coder->is_rep1[state]);
92
+ price += rc_bit_price(coder->is_rep2[state],
93
+ rep_index - 2);
94
+ }
95
+ }
96
+
97
+ return price;
98
+ }
99
+
100
+
101
+ static inline uint32_t
102
+ get_rep_price(const lzma_lzma1_encoder *const coder, const uint32_t rep_index,
103
+ const uint32_t len, const lzma_lzma_state state,
104
+ const uint32_t pos_state)
105
+ {
106
+ return get_len_price(&coder->rep_len_encoder, len, pos_state)
107
+ + get_pure_rep_price(coder, rep_index, state, pos_state);
108
+ }
109
+
110
+
111
+ static inline uint32_t
112
+ get_dist_len_price(const lzma_lzma1_encoder *const coder, const uint32_t dist,
113
+ const uint32_t len, const uint32_t pos_state)
114
+ {
115
+ const uint32_t dist_state = get_dist_state(len);
116
+ uint32_t price;
117
+
118
+ if (dist < FULL_DISTANCES) {
119
+ price = coder->dist_prices[dist_state][dist];
120
+ } else {
121
+ const uint32_t dist_slot = get_dist_slot_2(dist);
122
+ price = coder->dist_slot_prices[dist_state][dist_slot]
123
+ + coder->align_prices[dist & ALIGN_MASK];
124
+ }
125
+
126
+ price += get_len_price(&coder->match_len_encoder, len, pos_state);
127
+
128
+ return price;
129
+ }
130
+
131
+
132
+ static void
133
+ fill_dist_prices(lzma_lzma1_encoder *coder)
134
+ {
135
+ for (uint32_t dist_state = 0; dist_state < DIST_STATES; ++dist_state) {
136
+
137
+ uint32_t *const dist_slot_prices
138
+ = coder->dist_slot_prices[dist_state];
139
+
140
+ // Price to encode the dist_slot.
141
+ for (uint32_t dist_slot = 0;
142
+ dist_slot < coder->dist_table_size; ++dist_slot)
143
+ dist_slot_prices[dist_slot] = rc_bittree_price(
144
+ coder->dist_slot[dist_state],
145
+ DIST_SLOT_BITS, dist_slot);
146
+
147
+ // For matches with distance >= FULL_DISTANCES, add the price
148
+ // of the direct bits part of the match distance. (Align bits
149
+ // are handled by fill_align_prices()).
150
+ for (uint32_t dist_slot = DIST_MODEL_END;
151
+ dist_slot < coder->dist_table_size;
152
+ ++dist_slot)
153
+ dist_slot_prices[dist_slot] += rc_direct_price(
154
+ ((dist_slot >> 1) - 1) - ALIGN_BITS);
155
+
156
+ // Distances in the range [0, 3] are fully encoded with
157
+ // dist_slot, so they are used for coder->dist_prices
158
+ // as is.
159
+ for (uint32_t i = 0; i < DIST_MODEL_START; ++i)
160
+ coder->dist_prices[dist_state][i]
161
+ = dist_slot_prices[i];
162
+ }
163
+
164
+ // Distances in the range [4, 127] depend on dist_slot and
165
+ // dist_special. We do this in a loop separate from the above
166
+ // loop to avoid redundant calls to get_dist_slot().
167
+ for (uint32_t i = DIST_MODEL_START; i < FULL_DISTANCES; ++i) {
168
+ const uint32_t dist_slot = get_dist_slot(i);
169
+ const uint32_t footer_bits = ((dist_slot >> 1) - 1);
170
+ const uint32_t base = (2 | (dist_slot & 1)) << footer_bits;
171
+ const uint32_t price = rc_bittree_reverse_price(
172
+ coder->dist_special + base - dist_slot - 1,
173
+ footer_bits, i - base);
174
+
175
+ for (uint32_t dist_state = 0; dist_state < DIST_STATES;
176
+ ++dist_state)
177
+ coder->dist_prices[dist_state][i]
178
+ = price + coder->dist_slot_prices[
179
+ dist_state][dist_slot];
180
+ }
181
+
182
+ coder->match_price_count = 0;
183
+ return;
184
+ }
185
+
186
+
187
+ static void
188
+ fill_align_prices(lzma_lzma1_encoder *coder)
189
+ {
190
+ for (uint32_t i = 0; i < ALIGN_SIZE; ++i)
191
+ coder->align_prices[i] = rc_bittree_reverse_price(
192
+ coder->dist_align, ALIGN_BITS, i);
193
+
194
+ coder->align_price_count = 0;
195
+ return;
196
+ }
197
+
198
+
199
+ /////////////
200
+ // Optimal //
201
+ /////////////
202
+
203
+ static inline void
204
+ make_literal(lzma_optimal *optimal)
205
+ {
206
+ optimal->back_prev = UINT32_MAX;
207
+ optimal->prev_1_is_literal = false;
208
+ }
209
+
210
+
211
+ static inline void
212
+ make_short_rep(lzma_optimal *optimal)
213
+ {
214
+ optimal->back_prev = 0;
215
+ optimal->prev_1_is_literal = false;
216
+ }
217
+
218
+
219
+ #define is_short_rep(optimal) \
220
+ ((optimal).back_prev == 0)
221
+
222
+
223
+ static void
224
+ backward(lzma_lzma1_encoder *restrict coder, uint32_t *restrict len_res,
225
+ uint32_t *restrict back_res, uint32_t cur)
226
+ {
227
+ coder->opts_end_index = cur;
228
+
229
+ uint32_t pos_mem = coder->opts[cur].pos_prev;
230
+ uint32_t back_mem = coder->opts[cur].back_prev;
231
+
232
+ do {
233
+ if (coder->opts[cur].prev_1_is_literal) {
234
+ make_literal(&coder->opts[pos_mem]);
235
+ coder->opts[pos_mem].pos_prev = pos_mem - 1;
236
+
237
+ if (coder->opts[cur].prev_2) {
238
+ coder->opts[pos_mem - 1].prev_1_is_literal
239
+ = false;
240
+ coder->opts[pos_mem - 1].pos_prev
241
+ = coder->opts[cur].pos_prev_2;
242
+ coder->opts[pos_mem - 1].back_prev
243
+ = coder->opts[cur].back_prev_2;
244
+ }
245
+ }
246
+
247
+ const uint32_t pos_prev = pos_mem;
248
+ const uint32_t back_cur = back_mem;
249
+
250
+ back_mem = coder->opts[pos_prev].back_prev;
251
+ pos_mem = coder->opts[pos_prev].pos_prev;
252
+
253
+ coder->opts[pos_prev].back_prev = back_cur;
254
+ coder->opts[pos_prev].pos_prev = cur;
255
+ cur = pos_prev;
256
+
257
+ } while (cur != 0);
258
+
259
+ coder->opts_current_index = coder->opts[0].pos_prev;
260
+ *len_res = coder->opts[0].pos_prev;
261
+ *back_res = coder->opts[0].back_prev;
262
+
263
+ return;
264
+ }
265
+
266
+
267
+ //////////
268
+ // Main //
269
+ //////////
270
+
271
+ static inline uint32_t
272
+ helper1(lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf,
273
+ uint32_t *restrict back_res, uint32_t *restrict len_res,
274
+ uint32_t position)
275
+ {
276
+ const uint32_t nice_len = mf->nice_len;
277
+
278
+ uint32_t len_main;
279
+ uint32_t matches_count;
280
+
281
+ if (mf->read_ahead == 0) {
282
+ len_main = mf_find(mf, &matches_count, coder->matches);
283
+ } else {
284
+ assert(mf->read_ahead == 1);
285
+ len_main = coder->longest_match_length;
286
+ matches_count = coder->matches_count;
287
+ }
288
+
289
+ const uint32_t buf_avail = my_min(mf_avail(mf) + 1, MATCH_LEN_MAX);
290
+ if (buf_avail < 2) {
291
+ *back_res = UINT32_MAX;
292
+ *len_res = 1;
293
+ return UINT32_MAX;
294
+ }
295
+
296
+ const uint8_t *const buf = mf_ptr(mf) - 1;
297
+
298
+ uint32_t rep_lens[REPS];
299
+ uint32_t rep_max_index = 0;
300
+
301
+ for (uint32_t i = 0; i < REPS; ++i) {
302
+ const uint8_t *const buf_back = buf - coder->reps[i] - 1;
303
+
304
+ if (not_equal_16(buf, buf_back)) {
305
+ rep_lens[i] = 0;
306
+ continue;
307
+ }
308
+
309
+ rep_lens[i] = lzma_memcmplen(buf, buf_back, 2, buf_avail);
310
+
311
+ if (rep_lens[i] > rep_lens[rep_max_index])
312
+ rep_max_index = i;
313
+ }
314
+
315
+ if (rep_lens[rep_max_index] >= nice_len) {
316
+ *back_res = rep_max_index;
317
+ *len_res = rep_lens[rep_max_index];
318
+ mf_skip(mf, *len_res - 1);
319
+ return UINT32_MAX;
320
+ }
321
+
322
+
323
+ if (len_main >= nice_len) {
324
+ *back_res = coder->matches[matches_count - 1].dist + REPS;
325
+ *len_res = len_main;
326
+ mf_skip(mf, len_main - 1);
327
+ return UINT32_MAX;
328
+ }
329
+
330
+ const uint8_t current_byte = *buf;
331
+ const uint8_t match_byte = *(buf - coder->reps[0] - 1);
332
+
333
+ if (len_main < 2 && current_byte != match_byte
334
+ && rep_lens[rep_max_index] < 2) {
335
+ *back_res = UINT32_MAX;
336
+ *len_res = 1;
337
+ return UINT32_MAX;
338
+ }
339
+
340
+ coder->opts[0].state = coder->state;
341
+
342
+ const uint32_t pos_state = position & coder->pos_mask;
343
+
344
+ coder->opts[1].price = rc_bit_0_price(
345
+ coder->is_match[coder->state][pos_state])
346
+ + get_literal_price(coder, position, buf[-1],
347
+ !is_literal_state(coder->state),
348
+ match_byte, current_byte);
349
+
350
+ make_literal(&coder->opts[1]);
351
+
352
+ const uint32_t match_price = rc_bit_1_price(
353
+ coder->is_match[coder->state][pos_state]);
354
+ const uint32_t rep_match_price = match_price
355
+ + rc_bit_1_price(coder->is_rep[coder->state]);
356
+
357
+ if (match_byte == current_byte) {
358
+ const uint32_t short_rep_price = rep_match_price
359
+ + get_short_rep_price(
360
+ coder, coder->state, pos_state);
361
+
362
+ if (short_rep_price < coder->opts[1].price) {
363
+ coder->opts[1].price = short_rep_price;
364
+ make_short_rep(&coder->opts[1]);
365
+ }
366
+ }
367
+
368
+ const uint32_t len_end = my_max(len_main, rep_lens[rep_max_index]);
369
+
370
+ if (len_end < 2) {
371
+ *back_res = coder->opts[1].back_prev;
372
+ *len_res = 1;
373
+ return UINT32_MAX;
374
+ }
375
+
376
+ coder->opts[1].pos_prev = 0;
377
+
378
+ for (uint32_t i = 0; i < REPS; ++i)
379
+ coder->opts[0].backs[i] = coder->reps[i];
380
+
381
+ uint32_t len = len_end;
382
+ do {
383
+ coder->opts[len].price = RC_INFINITY_PRICE;
384
+ } while (--len >= 2);
385
+
386
+
387
+ for (uint32_t i = 0; i < REPS; ++i) {
388
+ uint32_t rep_len = rep_lens[i];
389
+ if (rep_len < 2)
390
+ continue;
391
+
392
+ const uint32_t price = rep_match_price + get_pure_rep_price(
393
+ coder, i, coder->state, pos_state);
394
+
395
+ do {
396
+ const uint32_t cur_and_len_price = price
397
+ + get_len_price(
398
+ &coder->rep_len_encoder,
399
+ rep_len, pos_state);
400
+
401
+ if (cur_and_len_price < coder->opts[rep_len].price) {
402
+ coder->opts[rep_len].price = cur_and_len_price;
403
+ coder->opts[rep_len].pos_prev = 0;
404
+ coder->opts[rep_len].back_prev = i;
405
+ coder->opts[rep_len].prev_1_is_literal = false;
406
+ }
407
+ } while (--rep_len >= 2);
408
+ }
409
+
410
+
411
+ const uint32_t normal_match_price = match_price
412
+ + rc_bit_0_price(coder->is_rep[coder->state]);
413
+
414
+ len = rep_lens[0] >= 2 ? rep_lens[0] + 1 : 2;
415
+ if (len <= len_main) {
416
+ uint32_t i = 0;
417
+ while (len > coder->matches[i].len)
418
+ ++i;
419
+
420
+ for(; ; ++len) {
421
+ const uint32_t dist = coder->matches[i].dist;
422
+ const uint32_t cur_and_len_price = normal_match_price
423
+ + get_dist_len_price(coder,
424
+ dist, len, pos_state);
425
+
426
+ if (cur_and_len_price < coder->opts[len].price) {
427
+ coder->opts[len].price = cur_and_len_price;
428
+ coder->opts[len].pos_prev = 0;
429
+ coder->opts[len].back_prev = dist + REPS;
430
+ coder->opts[len].prev_1_is_literal = false;
431
+ }
432
+
433
+ if (len == coder->matches[i].len)
434
+ if (++i == matches_count)
435
+ break;
436
+ }
437
+ }
438
+
439
+ return len_end;
440
+ }
441
+
442
+
443
+ static inline uint32_t
444
+ helper2(lzma_lzma1_encoder *coder, uint32_t *reps, const uint8_t *buf,
445
+ uint32_t len_end, uint32_t position, const uint32_t cur,
446
+ const uint32_t nice_len, const uint32_t buf_avail_full)
447
+ {
448
+ uint32_t matches_count = coder->matches_count;
449
+ uint32_t new_len = coder->longest_match_length;
450
+ uint32_t pos_prev = coder->opts[cur].pos_prev;
451
+ lzma_lzma_state state;
452
+
453
+ if (coder->opts[cur].prev_1_is_literal) {
454
+ --pos_prev;
455
+
456
+ if (coder->opts[cur].prev_2) {
457
+ state = coder->opts[coder->opts[cur].pos_prev_2].state;
458
+
459
+ if (coder->opts[cur].back_prev_2 < REPS)
460
+ update_long_rep(state);
461
+ else
462
+ update_match(state);
463
+
464
+ } else {
465
+ state = coder->opts[pos_prev].state;
466
+ }
467
+
468
+ update_literal(state);
469
+
470
+ } else {
471
+ state = coder->opts[pos_prev].state;
472
+ }
473
+
474
+ if (pos_prev == cur - 1) {
475
+ if (is_short_rep(coder->opts[cur]))
476
+ update_short_rep(state);
477
+ else
478
+ update_literal(state);
479
+ } else {
480
+ uint32_t pos;
481
+ if (coder->opts[cur].prev_1_is_literal
482
+ && coder->opts[cur].prev_2) {
483
+ pos_prev = coder->opts[cur].pos_prev_2;
484
+ pos = coder->opts[cur].back_prev_2;
485
+ update_long_rep(state);
486
+ } else {
487
+ pos = coder->opts[cur].back_prev;
488
+ if (pos < REPS)
489
+ update_long_rep(state);
490
+ else
491
+ update_match(state);
492
+ }
493
+
494
+ if (pos < REPS) {
495
+ reps[0] = coder->opts[pos_prev].backs[pos];
496
+
497
+ uint32_t i;
498
+ for (i = 1; i <= pos; ++i)
499
+ reps[i] = coder->opts[pos_prev].backs[i - 1];
500
+
501
+ for (; i < REPS; ++i)
502
+ reps[i] = coder->opts[pos_prev].backs[i];
503
+
504
+ } else {
505
+ reps[0] = pos - REPS;
506
+
507
+ for (uint32_t i = 1; i < REPS; ++i)
508
+ reps[i] = coder->opts[pos_prev].backs[i - 1];
509
+ }
510
+ }
511
+
512
+ coder->opts[cur].state = state;
513
+
514
+ for (uint32_t i = 0; i < REPS; ++i)
515
+ coder->opts[cur].backs[i] = reps[i];
516
+
517
+ const uint32_t cur_price = coder->opts[cur].price;
518
+
519
+ const uint8_t current_byte = *buf;
520
+ const uint8_t match_byte = *(buf - reps[0] - 1);
521
+
522
+ const uint32_t pos_state = position & coder->pos_mask;
523
+
524
+ const uint32_t cur_and_1_price = cur_price
525
+ + rc_bit_0_price(coder->is_match[state][pos_state])
526
+ + get_literal_price(coder, position, buf[-1],
527
+ !is_literal_state(state), match_byte, current_byte);
528
+
529
+ bool next_is_literal = false;
530
+
531
+ if (cur_and_1_price < coder->opts[cur + 1].price) {
532
+ coder->opts[cur + 1].price = cur_and_1_price;
533
+ coder->opts[cur + 1].pos_prev = cur;
534
+ make_literal(&coder->opts[cur + 1]);
535
+ next_is_literal = true;
536
+ }
537
+
538
+ const uint32_t match_price = cur_price
539
+ + rc_bit_1_price(coder->is_match[state][pos_state]);
540
+ const uint32_t rep_match_price = match_price
541
+ + rc_bit_1_price(coder->is_rep[state]);
542
+
543
+ if (match_byte == current_byte
544
+ && !(coder->opts[cur + 1].pos_prev < cur
545
+ && coder->opts[cur + 1].back_prev == 0)) {
546
+
547
+ const uint32_t short_rep_price = rep_match_price
548
+ + get_short_rep_price(coder, state, pos_state);
549
+
550
+ if (short_rep_price <= coder->opts[cur + 1].price) {
551
+ coder->opts[cur + 1].price = short_rep_price;
552
+ coder->opts[cur + 1].pos_prev = cur;
553
+ make_short_rep(&coder->opts[cur + 1]);
554
+ next_is_literal = true;
555
+ }
556
+ }
557
+
558
+ if (buf_avail_full < 2)
559
+ return len_end;
560
+
561
+ const uint32_t buf_avail = my_min(buf_avail_full, nice_len);
562
+
563
+ if (!next_is_literal && match_byte != current_byte) { // speed optimization
564
+ // try literal + rep0
565
+ const uint8_t *const buf_back = buf - reps[0] - 1;
566
+ const uint32_t limit = my_min(buf_avail_full, nice_len + 1);
567
+
568
+ const uint32_t len_test = lzma_memcmplen(buf, buf_back, 1, limit) - 1;
569
+
570
+ if (len_test >= 2) {
571
+ lzma_lzma_state state_2 = state;
572
+ update_literal(state_2);
573
+
574
+ const uint32_t pos_state_next = (position + 1) & coder->pos_mask;
575
+ const uint32_t next_rep_match_price = cur_and_1_price
576
+ + rc_bit_1_price(coder->is_match[state_2][pos_state_next])
577
+ + rc_bit_1_price(coder->is_rep[state_2]);
578
+
579
+ //for (; len_test >= 2; --len_test) {
580
+ const uint32_t offset = cur + 1 + len_test;
581
+
582
+ while (len_end < offset)
583
+ coder->opts[++len_end].price = RC_INFINITY_PRICE;
584
+
585
+ const uint32_t cur_and_len_price = next_rep_match_price
586
+ + get_rep_price(coder, 0, len_test,
587
+ state_2, pos_state_next);
588
+
589
+ if (cur_and_len_price < coder->opts[offset].price) {
590
+ coder->opts[offset].price = cur_and_len_price;
591
+ coder->opts[offset].pos_prev = cur + 1;
592
+ coder->opts[offset].back_prev = 0;
593
+ coder->opts[offset].prev_1_is_literal = true;
594
+ coder->opts[offset].prev_2 = false;
595
+ }
596
+ //}
597
+ }
598
+ }
599
+
600
+
601
+ uint32_t start_len = 2; // speed optimization
602
+
603
+ for (uint32_t rep_index = 0; rep_index < REPS; ++rep_index) {
604
+ const uint8_t *const buf_back = buf - reps[rep_index] - 1;
605
+ if (not_equal_16(buf, buf_back))
606
+ continue;
607
+
608
+ uint32_t len_test = lzma_memcmplen(buf, buf_back, 2, buf_avail);
609
+
610
+ while (len_end < cur + len_test)
611
+ coder->opts[++len_end].price = RC_INFINITY_PRICE;
612
+
613
+ const uint32_t len_test_temp = len_test;
614
+ const uint32_t price = rep_match_price + get_pure_rep_price(
615
+ coder, rep_index, state, pos_state);
616
+
617
+ do {
618
+ const uint32_t cur_and_len_price = price
619
+ + get_len_price(&coder->rep_len_encoder,
620
+ len_test, pos_state);
621
+
622
+ if (cur_and_len_price < coder->opts[cur + len_test].price) {
623
+ coder->opts[cur + len_test].price = cur_and_len_price;
624
+ coder->opts[cur + len_test].pos_prev = cur;
625
+ coder->opts[cur + len_test].back_prev = rep_index;
626
+ coder->opts[cur + len_test].prev_1_is_literal = false;
627
+ }
628
+ } while (--len_test >= 2);
629
+
630
+ len_test = len_test_temp;
631
+
632
+ if (rep_index == 0)
633
+ start_len = len_test + 1;
634
+
635
+
636
+ uint32_t len_test_2 = len_test + 1;
637
+ const uint32_t limit = my_min(buf_avail_full,
638
+ len_test_2 + nice_len);
639
+ for (; len_test_2 < limit
640
+ && buf[len_test_2] == buf_back[len_test_2];
641
+ ++len_test_2) ;
642
+
643
+ len_test_2 -= len_test + 1;
644
+
645
+ if (len_test_2 >= 2) {
646
+ lzma_lzma_state state_2 = state;
647
+ update_long_rep(state_2);
648
+
649
+ uint32_t pos_state_next = (position + len_test) & coder->pos_mask;
650
+
651
+ const uint32_t cur_and_len_literal_price = price
652
+ + get_len_price(&coder->rep_len_encoder,
653
+ len_test, pos_state)
654
+ + rc_bit_0_price(coder->is_match[state_2][pos_state_next])
655
+ + get_literal_price(coder, position + len_test,
656
+ buf[len_test - 1], true,
657
+ buf_back[len_test], buf[len_test]);
658
+
659
+ update_literal(state_2);
660
+
661
+ pos_state_next = (position + len_test + 1) & coder->pos_mask;
662
+
663
+ const uint32_t next_rep_match_price = cur_and_len_literal_price
664
+ + rc_bit_1_price(coder->is_match[state_2][pos_state_next])
665
+ + rc_bit_1_price(coder->is_rep[state_2]);
666
+
667
+ //for(; len_test_2 >= 2; len_test_2--) {
668
+ const uint32_t offset = cur + len_test + 1 + len_test_2;
669
+
670
+ while (len_end < offset)
671
+ coder->opts[++len_end].price = RC_INFINITY_PRICE;
672
+
673
+ const uint32_t cur_and_len_price = next_rep_match_price
674
+ + get_rep_price(coder, 0, len_test_2,
675
+ state_2, pos_state_next);
676
+
677
+ if (cur_and_len_price < coder->opts[offset].price) {
678
+ coder->opts[offset].price = cur_and_len_price;
679
+ coder->opts[offset].pos_prev = cur + len_test + 1;
680
+ coder->opts[offset].back_prev = 0;
681
+ coder->opts[offset].prev_1_is_literal = true;
682
+ coder->opts[offset].prev_2 = true;
683
+ coder->opts[offset].pos_prev_2 = cur;
684
+ coder->opts[offset].back_prev_2 = rep_index;
685
+ }
686
+ //}
687
+ }
688
+ }
689
+
690
+
691
+ //for (uint32_t len_test = 2; len_test <= new_len; ++len_test)
692
+ if (new_len > buf_avail) {
693
+ new_len = buf_avail;
694
+
695
+ matches_count = 0;
696
+ while (new_len > coder->matches[matches_count].len)
697
+ ++matches_count;
698
+
699
+ coder->matches[matches_count++].len = new_len;
700
+ }
701
+
702
+
703
+ if (new_len >= start_len) {
704
+ const uint32_t normal_match_price = match_price
705
+ + rc_bit_0_price(coder->is_rep[state]);
706
+
707
+ while (len_end < cur + new_len)
708
+ coder->opts[++len_end].price = RC_INFINITY_PRICE;
709
+
710
+ uint32_t i = 0;
711
+ while (start_len > coder->matches[i].len)
712
+ ++i;
713
+
714
+ for (uint32_t len_test = start_len; ; ++len_test) {
715
+ const uint32_t cur_back = coder->matches[i].dist;
716
+ uint32_t cur_and_len_price = normal_match_price
717
+ + get_dist_len_price(coder,
718
+ cur_back, len_test, pos_state);
719
+
720
+ if (cur_and_len_price < coder->opts[cur + len_test].price) {
721
+ coder->opts[cur + len_test].price = cur_and_len_price;
722
+ coder->opts[cur + len_test].pos_prev = cur;
723
+ coder->opts[cur + len_test].back_prev
724
+ = cur_back + REPS;
725
+ coder->opts[cur + len_test].prev_1_is_literal = false;
726
+ }
727
+
728
+ if (len_test == coder->matches[i].len) {
729
+ // Try Match + Literal + Rep0
730
+ const uint8_t *const buf_back = buf - cur_back - 1;
731
+ uint32_t len_test_2 = len_test + 1;
732
+ const uint32_t limit = my_min(buf_avail_full,
733
+ len_test_2 + nice_len);
734
+
735
+ for (; len_test_2 < limit &&
736
+ buf[len_test_2] == buf_back[len_test_2];
737
+ ++len_test_2) ;
738
+
739
+ len_test_2 -= len_test + 1;
740
+
741
+ if (len_test_2 >= 2) {
742
+ lzma_lzma_state state_2 = state;
743
+ update_match(state_2);
744
+ uint32_t pos_state_next
745
+ = (position + len_test) & coder->pos_mask;
746
+
747
+ const uint32_t cur_and_len_literal_price = cur_and_len_price
748
+ + rc_bit_0_price(
749
+ coder->is_match[state_2][pos_state_next])
750
+ + get_literal_price(coder,
751
+ position + len_test,
752
+ buf[len_test - 1],
753
+ true,
754
+ buf_back[len_test],
755
+ buf[len_test]);
756
+
757
+ update_literal(state_2);
758
+ pos_state_next = (pos_state_next + 1) & coder->pos_mask;
759
+
760
+ const uint32_t next_rep_match_price
761
+ = cur_and_len_literal_price
762
+ + rc_bit_1_price(
763
+ coder->is_match[state_2][pos_state_next])
764
+ + rc_bit_1_price(coder->is_rep[state_2]);
765
+
766
+ // for(; len_test_2 >= 2; --len_test_2) {
767
+ const uint32_t offset = cur + len_test + 1 + len_test_2;
768
+
769
+ while (len_end < offset)
770
+ coder->opts[++len_end].price = RC_INFINITY_PRICE;
771
+
772
+ cur_and_len_price = next_rep_match_price
773
+ + get_rep_price(coder, 0, len_test_2,
774
+ state_2, pos_state_next);
775
+
776
+ if (cur_and_len_price < coder->opts[offset].price) {
777
+ coder->opts[offset].price = cur_and_len_price;
778
+ coder->opts[offset].pos_prev = cur + len_test + 1;
779
+ coder->opts[offset].back_prev = 0;
780
+ coder->opts[offset].prev_1_is_literal = true;
781
+ coder->opts[offset].prev_2 = true;
782
+ coder->opts[offset].pos_prev_2 = cur;
783
+ coder->opts[offset].back_prev_2
784
+ = cur_back + REPS;
785
+ }
786
+ //}
787
+ }
788
+
789
+ if (++i == matches_count)
790
+ break;
791
+ }
792
+ }
793
+ }
794
+
795
+ return len_end;
796
+ }
797
+
798
+
799
+ extern void
800
+ lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder,
801
+ lzma_mf *restrict mf,
802
+ uint32_t *restrict back_res, uint32_t *restrict len_res,
803
+ uint32_t position)
804
+ {
805
+ // If we have symbols pending, return the next pending symbol.
806
+ if (coder->opts_end_index != coder->opts_current_index) {
807
+ assert(mf->read_ahead > 0);
808
+ *len_res = coder->opts[coder->opts_current_index].pos_prev
809
+ - coder->opts_current_index;
810
+ *back_res = coder->opts[coder->opts_current_index].back_prev;
811
+ coder->opts_current_index = coder->opts[
812
+ coder->opts_current_index].pos_prev;
813
+ return;
814
+ }
815
+
816
+ // Update the price tables. In LZMA SDK <= 4.60 (and possibly later)
817
+ // this was done in both initialization function and in the main loop.
818
+ // In liblzma they were moved into this single place.
819
+ if (mf->read_ahead == 0) {
820
+ if (coder->match_price_count >= (1 << 7))
821
+ fill_dist_prices(coder);
822
+
823
+ if (coder->align_price_count >= ALIGN_SIZE)
824
+ fill_align_prices(coder);
825
+ }
826
+
827
+ // TODO: This needs quite a bit of cleaning still. But splitting
828
+ // the original function into two pieces makes it at least a little
829
+ // more readable, since those two parts don't share many variables.
830
+
831
+ uint32_t len_end = helper1(coder, mf, back_res, len_res, position);
832
+ if (len_end == UINT32_MAX)
833
+ return;
834
+
835
+ uint32_t reps[REPS];
836
+ memcpy(reps, coder->reps, sizeof(reps));
837
+
838
+ uint32_t cur;
839
+ for (cur = 1; cur < len_end; ++cur) {
840
+ assert(cur < OPTS);
841
+
842
+ coder->longest_match_length = mf_find(
843
+ mf, &coder->matches_count, coder->matches);
844
+
845
+ if (coder->longest_match_length >= mf->nice_len)
846
+ break;
847
+
848
+ len_end = helper2(coder, reps, mf_ptr(mf) - 1, len_end,
849
+ position + cur, cur, mf->nice_len,
850
+ my_min(mf_avail(mf) + 1, OPTS - 1 - cur));
851
+ }
852
+
853
+ backward(coder, len_res, back_res, cur);
854
+ return;
855
+ }