finishm 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (554) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +1 -0
  5. data/Gemfile +31 -0
  6. data/LICENSE.txt +20 -0
  7. data/README.md +59 -0
  8. data/Rakefile +51 -0
  9. data/VERSION +1 -0
  10. data/bin/assembly_visualiser +106 -0
  11. data/bin/check_primer_combinations.rb +73 -0
  12. data/bin/contig_joiner.rb +244 -0
  13. data/bin/contigs_against_assembly.rb +153 -0
  14. data/bin/finishm +143 -0
  15. data/bin/finishm_assembler +55 -0
  16. data/bin/finishm_gap_closer.rb +241 -0
  17. data/bin/kmer_abundance_file_tool.rb +49 -0
  18. data/bin/kmer_pattern_to_assembly.rb +377 -0
  19. data/bin/kmer_profile_finder.rb +92 -0
  20. data/bin/kmers_count_parse.d +52 -0
  21. data/bin/kmers_count_tabulate.d +123 -0
  22. data/bin/kmers_count_tabulate.rb +84 -0
  23. data/bin/pcr_result_parser.rb +108 -0
  24. data/bin/primer_finder.rb +119 -0
  25. data/bin/read_selection_by_kmer.d +174 -0
  26. data/bin/scaffold_by_pattern.rb +119 -0
  27. data/bin/scaffold_connection_possibilities_to_knowns.rb +193 -0
  28. data/bin/scaffold_end_coverages.rb +69 -0
  29. data/bin/trail_validator.rb +84 -0
  30. data/ext/mkrf_conf.rb +56 -0
  31. data/ext/src/Makefile +140 -0
  32. data/ext/src/src/allocArray.c +305 -0
  33. data/ext/src/src/allocArray.h +86 -0
  34. data/ext/src/src/autoOpen.c +107 -0
  35. data/ext/src/src/autoOpen.h +18 -0
  36. data/ext/src/src/binarySequences.c +813 -0
  37. data/ext/src/src/binarySequences.h +125 -0
  38. data/ext/src/src/concatenatedGraph.c +233 -0
  39. data/ext/src/src/concatenatedGraph.h +30 -0
  40. data/ext/src/src/concatenatedPreGraph.c +262 -0
  41. data/ext/src/src/concatenatedPreGraph.h +29 -0
  42. data/ext/src/src/correctedGraph.c +2643 -0
  43. data/ext/src/src/correctedGraph.h +32 -0
  44. data/ext/src/src/dfib.c +509 -0
  45. data/ext/src/src/dfib.h +69 -0
  46. data/ext/src/src/dfibHeap.c +89 -0
  47. data/ext/src/src/dfibHeap.h +39 -0
  48. data/ext/src/src/dfibpriv.h +105 -0
  49. data/ext/src/src/fib.c +628 -0
  50. data/ext/src/src/fib.h +78 -0
  51. data/ext/src/src/fibHeap.c +79 -0
  52. data/ext/src/src/fibHeap.h +41 -0
  53. data/ext/src/src/fibpriv.h +110 -0
  54. data/ext/src/src/globals.h +154 -0
  55. data/ext/src/src/graph.c +3932 -0
  56. data/ext/src/src/graph.h +233 -0
  57. data/ext/src/src/graphReConstruction.c +1472 -0
  58. data/ext/src/src/graphReConstruction.h +30 -0
  59. data/ext/src/src/graphStats.c +2167 -0
  60. data/ext/src/src/graphStats.h +72 -0
  61. data/ext/src/src/graphStructures.h +52 -0
  62. data/ext/src/src/kmer.c +652 -0
  63. data/ext/src/src/kmer.h +73 -0
  64. data/ext/src/src/kmerOccurenceTable.c +236 -0
  65. data/ext/src/src/kmerOccurenceTable.h +44 -0
  66. data/ext/src/src/kseq.h +223 -0
  67. data/ext/src/src/locallyCorrectedGraph.c +557 -0
  68. data/ext/src/src/locallyCorrectedGraph.h +40 -0
  69. data/ext/src/src/passageMarker.c +677 -0
  70. data/ext/src/src/passageMarker.h +137 -0
  71. data/ext/src/src/preGraph.c +1717 -0
  72. data/ext/src/src/preGraph.h +106 -0
  73. data/ext/src/src/preGraphConstruction.c +990 -0
  74. data/ext/src/src/preGraphConstruction.h +26 -0
  75. data/ext/src/src/probe_node_finder.c +84 -0
  76. data/ext/src/src/probe_node_finder.h +6 -0
  77. data/ext/src/src/readCoherentGraph.c +557 -0
  78. data/ext/src/src/readCoherentGraph.h +30 -0
  79. data/ext/src/src/readSet.c +1734 -0
  80. data/ext/src/src/readSet.h +67 -0
  81. data/ext/src/src/readToNode.c +218 -0
  82. data/ext/src/src/readToNode.h +35 -0
  83. data/ext/src/src/recycleBin.c +199 -0
  84. data/ext/src/src/recycleBin.h +58 -0
  85. data/ext/src/src/roadMap.c +342 -0
  86. data/ext/src/src/roadMap.h +65 -0
  87. data/ext/src/src/run.c +318 -0
  88. data/ext/src/src/run.h +52 -0
  89. data/ext/src/src/run2.c +744 -0
  90. data/ext/src/src/runReadToNode.c +29 -0
  91. data/ext/src/src/scaffold.c +1876 -0
  92. data/ext/src/src/scaffold.h +64 -0
  93. data/ext/src/src/shortReadPairs.c +1243 -0
  94. data/ext/src/src/shortReadPairs.h +32 -0
  95. data/ext/src/src/splay.c +259 -0
  96. data/ext/src/src/splay.h +43 -0
  97. data/ext/src/src/splayTable.c +1315 -0
  98. data/ext/src/src/splayTable.h +31 -0
  99. data/ext/src/src/tightString.c +362 -0
  100. data/ext/src/src/tightString.h +82 -0
  101. data/ext/src/src/utility.c +199 -0
  102. data/ext/src/src/utility.h +98 -0
  103. data/ext/src/third-party/zlib-1.2.3/ChangeLog +855 -0
  104. data/ext/src/third-party/zlib-1.2.3/FAQ +339 -0
  105. data/ext/src/third-party/zlib-1.2.3/INDEX +51 -0
  106. data/ext/src/third-party/zlib-1.2.3/Makefile +154 -0
  107. data/ext/src/third-party/zlib-1.2.3/Makefile.in +154 -0
  108. data/ext/src/third-party/zlib-1.2.3/README +125 -0
  109. data/ext/src/third-party/zlib-1.2.3/adler32.c +149 -0
  110. data/ext/src/third-party/zlib-1.2.3/adler32.o +0 -0
  111. data/ext/src/third-party/zlib-1.2.3/algorithm.txt +209 -0
  112. data/ext/src/third-party/zlib-1.2.3/amiga/Makefile.pup +66 -0
  113. data/ext/src/third-party/zlib-1.2.3/amiga/Makefile.sas +65 -0
  114. data/ext/src/third-party/zlib-1.2.3/as400/bndsrc +132 -0
  115. data/ext/src/third-party/zlib-1.2.3/as400/compile.clp +123 -0
  116. data/ext/src/third-party/zlib-1.2.3/as400/readme.txt +111 -0
  117. data/ext/src/third-party/zlib-1.2.3/as400/zlib.inc +331 -0
  118. data/ext/src/third-party/zlib-1.2.3/compress.c +79 -0
  119. data/ext/src/third-party/zlib-1.2.3/compress.o +0 -0
  120. data/ext/src/third-party/zlib-1.2.3/configure +459 -0
  121. data/ext/src/third-party/zlib-1.2.3/contrib/README.contrib +71 -0
  122. data/ext/src/third-party/zlib-1.2.3/contrib/ada/buffer_demo.adb +106 -0
  123. data/ext/src/third-party/zlib-1.2.3/contrib/ada/mtest.adb +156 -0
  124. data/ext/src/third-party/zlib-1.2.3/contrib/ada/read.adb +156 -0
  125. data/ext/src/third-party/zlib-1.2.3/contrib/ada/readme.txt +65 -0
  126. data/ext/src/third-party/zlib-1.2.3/contrib/ada/test.adb +463 -0
  127. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib-streams.adb +225 -0
  128. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib-streams.ads +114 -0
  129. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib-thin.adb +141 -0
  130. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib-thin.ads +450 -0
  131. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib.adb +701 -0
  132. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib.ads +328 -0
  133. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib.gpr +20 -0
  134. data/ext/src/third-party/zlib-1.2.3/contrib/asm586/README.586 +43 -0
  135. data/ext/src/third-party/zlib-1.2.3/contrib/asm586/match.S +364 -0
  136. data/ext/src/third-party/zlib-1.2.3/contrib/asm686/README.686 +34 -0
  137. data/ext/src/third-party/zlib-1.2.3/contrib/asm686/match.S +329 -0
  138. data/ext/src/third-party/zlib-1.2.3/contrib/blast/Makefile +8 -0
  139. data/ext/src/third-party/zlib-1.2.3/contrib/blast/README +4 -0
  140. data/ext/src/third-party/zlib-1.2.3/contrib/blast/blast.c +444 -0
  141. data/ext/src/third-party/zlib-1.2.3/contrib/blast/blast.h +71 -0
  142. data/ext/src/third-party/zlib-1.2.3/contrib/blast/test.pk +0 -0
  143. data/ext/src/third-party/zlib-1.2.3/contrib/blast/test.txt +1 -0
  144. data/ext/src/third-party/zlib-1.2.3/contrib/delphi/ZLib.pas +557 -0
  145. data/ext/src/third-party/zlib-1.2.3/contrib/delphi/ZLibConst.pas +11 -0
  146. data/ext/src/third-party/zlib-1.2.3/contrib/delphi/readme.txt +76 -0
  147. data/ext/src/third-party/zlib-1.2.3/contrib/delphi/zlibd32.mak +93 -0
  148. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib.build +33 -0
  149. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib.chm +0 -0
  150. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib.sln +21 -0
  151. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/AssemblyInfo.cs +58 -0
  152. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/ChecksumImpl.cs +202 -0
  153. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/CircularBuffer.cs +83 -0
  154. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/CodecBase.cs +198 -0
  155. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/Deflater.cs +106 -0
  156. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/DotZLib.cs +288 -0
  157. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/DotZLib.csproj +141 -0
  158. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/GZipStream.cs +301 -0
  159. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/Inflater.cs +105 -0
  160. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/UnitTests.cs +274 -0
  161. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/LICENSE_1_0.txt +23 -0
  162. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/readme.txt +58 -0
  163. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/README +1 -0
  164. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/infback9.c +608 -0
  165. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/infback9.h +37 -0
  166. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/inffix9.h +107 -0
  167. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/inflate9.h +47 -0
  168. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/inftree9.c +323 -0
  169. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/inftree9.h +55 -0
  170. data/ext/src/third-party/zlib-1.2.3/contrib/inflate86/inffas86.c +1157 -0
  171. data/ext/src/third-party/zlib-1.2.3/contrib/inflate86/inffast.S +1368 -0
  172. data/ext/src/third-party/zlib-1.2.3/contrib/iostream/test.cpp +24 -0
  173. data/ext/src/third-party/zlib-1.2.3/contrib/iostream/zfstream.cpp +329 -0
  174. data/ext/src/third-party/zlib-1.2.3/contrib/iostream/zfstream.h +128 -0
  175. data/ext/src/third-party/zlib-1.2.3/contrib/iostream2/zstream.h +307 -0
  176. data/ext/src/third-party/zlib-1.2.3/contrib/iostream2/zstream_test.cpp +25 -0
  177. data/ext/src/third-party/zlib-1.2.3/contrib/iostream3/README +35 -0
  178. data/ext/src/third-party/zlib-1.2.3/contrib/iostream3/TODO +17 -0
  179. data/ext/src/third-party/zlib-1.2.3/contrib/iostream3/test.cc +50 -0
  180. data/ext/src/third-party/zlib-1.2.3/contrib/iostream3/zfstream.cc +479 -0
  181. data/ext/src/third-party/zlib-1.2.3/contrib/iostream3/zfstream.h +466 -0
  182. data/ext/src/third-party/zlib-1.2.3/contrib/masm686/match.asm +413 -0
  183. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/bld_ml64.bat +2 -0
  184. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/gvmat64.asm +513 -0
  185. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/gvmat64.obj +0 -0
  186. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/inffas8664.c +186 -0
  187. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/inffasx64.asm +392 -0
  188. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/inffasx64.obj +0 -0
  189. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/readme.txt +28 -0
  190. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/bld_ml32.bat +2 -0
  191. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/gvmat32.asm +972 -0
  192. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/gvmat32.obj +0 -0
  193. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/gvmat32c.c +62 -0
  194. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/inffas32.asm +1083 -0
  195. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/inffas32.obj +0 -0
  196. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/mkasm.bat +3 -0
  197. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/readme.txt +21 -0
  198. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/ChangeLogUnzip +67 -0
  199. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/Makefile +25 -0
  200. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/crypt.h +132 -0
  201. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/ioapi.c +177 -0
  202. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/ioapi.h +75 -0
  203. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/iowin32.c +270 -0
  204. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/iowin32.h +21 -0
  205. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/miniunz.c +585 -0
  206. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/minizip.c +420 -0
  207. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/mztools.c +281 -0
  208. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/mztools.h +31 -0
  209. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/unzip.c +1598 -0
  210. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/unzip.h +354 -0
  211. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/zip.c +1219 -0
  212. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/zip.h +235 -0
  213. data/ext/src/third-party/zlib-1.2.3/contrib/pascal/example.pas +599 -0
  214. data/ext/src/third-party/zlib-1.2.3/contrib/pascal/readme.txt +76 -0
  215. data/ext/src/third-party/zlib-1.2.3/contrib/pascal/zlibd32.mak +93 -0
  216. data/ext/src/third-party/zlib-1.2.3/contrib/pascal/zlibpas.pas +236 -0
  217. data/ext/src/third-party/zlib-1.2.3/contrib/puff/Makefile +8 -0
  218. data/ext/src/third-party/zlib-1.2.3/contrib/puff/README +63 -0
  219. data/ext/src/third-party/zlib-1.2.3/contrib/puff/puff.c +837 -0
  220. data/ext/src/third-party/zlib-1.2.3/contrib/puff/puff.h +31 -0
  221. data/ext/src/third-party/zlib-1.2.3/contrib/puff/zeros.raw +0 -0
  222. data/ext/src/third-party/zlib-1.2.3/contrib/testzlib/testzlib.c +275 -0
  223. data/ext/src/third-party/zlib-1.2.3/contrib/testzlib/testzlib.txt +10 -0
  224. data/ext/src/third-party/zlib-1.2.3/contrib/untgz/Makefile +14 -0
  225. data/ext/src/third-party/zlib-1.2.3/contrib/untgz/Makefile.msc +17 -0
  226. data/ext/src/third-party/zlib-1.2.3/contrib/untgz/untgz.c +674 -0
  227. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/readme.txt +73 -0
  228. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/miniunz.vcproj +126 -0
  229. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/minizip.vcproj +126 -0
  230. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/testzlib.vcproj +126 -0
  231. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/zlib.rc +32 -0
  232. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/zlibstat.vcproj +246 -0
  233. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/zlibvc.def +92 -0
  234. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/zlibvc.sln +78 -0
  235. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/zlibvc.vcproj +445 -0
  236. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/miniunz.vcproj +566 -0
  237. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/minizip.vcproj +563 -0
  238. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/testzlib.vcproj +948 -0
  239. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/testzlibdll.vcproj +567 -0
  240. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/zlib.rc +32 -0
  241. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/zlibstat.vcproj +870 -0
  242. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/zlibvc.def +92 -0
  243. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/zlibvc.sln +144 -0
  244. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/zlibvc.vcproj +1219 -0
  245. data/ext/src/third-party/zlib-1.2.3/crc32.c +423 -0
  246. data/ext/src/third-party/zlib-1.2.3/crc32.h +441 -0
  247. data/ext/src/third-party/zlib-1.2.3/crc32.o +0 -0
  248. data/ext/src/third-party/zlib-1.2.3/deflate.c +1736 -0
  249. data/ext/src/third-party/zlib-1.2.3/deflate.h +331 -0
  250. data/ext/src/third-party/zlib-1.2.3/deflate.o +0 -0
  251. data/ext/src/third-party/zlib-1.2.3/example +0 -0
  252. data/ext/src/third-party/zlib-1.2.3/example.c +565 -0
  253. data/ext/src/third-party/zlib-1.2.3/examples/README.examples +42 -0
  254. data/ext/src/third-party/zlib-1.2.3/examples/fitblk.c +233 -0
  255. data/ext/src/third-party/zlib-1.2.3/examples/gun.c +693 -0
  256. data/ext/src/third-party/zlib-1.2.3/examples/gzappend.c +500 -0
  257. data/ext/src/third-party/zlib-1.2.3/examples/gzjoin.c +448 -0
  258. data/ext/src/third-party/zlib-1.2.3/examples/gzlog.c +413 -0
  259. data/ext/src/third-party/zlib-1.2.3/examples/gzlog.h +58 -0
  260. data/ext/src/third-party/zlib-1.2.3/examples/zlib_how.html +523 -0
  261. data/ext/src/third-party/zlib-1.2.3/examples/zpipe.c +191 -0
  262. data/ext/src/third-party/zlib-1.2.3/examples/zran.c +404 -0
  263. data/ext/src/third-party/zlib-1.2.3/gzio.c +1026 -0
  264. data/ext/src/third-party/zlib-1.2.3/gzio.o +0 -0
  265. data/ext/src/third-party/zlib-1.2.3/infback.c +623 -0
  266. data/ext/src/third-party/zlib-1.2.3/infback.o +0 -0
  267. data/ext/src/third-party/zlib-1.2.3/inffast.c +318 -0
  268. data/ext/src/third-party/zlib-1.2.3/inffast.h +11 -0
  269. data/ext/src/third-party/zlib-1.2.3/inffast.o +0 -0
  270. data/ext/src/third-party/zlib-1.2.3/inffixed.h +94 -0
  271. data/ext/src/third-party/zlib-1.2.3/inflate.c +1368 -0
  272. data/ext/src/third-party/zlib-1.2.3/inflate.h +115 -0
  273. data/ext/src/third-party/zlib-1.2.3/inflate.o +0 -0
  274. data/ext/src/third-party/zlib-1.2.3/inftrees.c +329 -0
  275. data/ext/src/third-party/zlib-1.2.3/inftrees.h +55 -0
  276. data/ext/src/third-party/zlib-1.2.3/inftrees.o +0 -0
  277. data/ext/src/third-party/zlib-1.2.3/libz.a +0 -0
  278. data/ext/src/third-party/zlib-1.2.3/make_vms.com +461 -0
  279. data/ext/src/third-party/zlib-1.2.3/minigzip +0 -0
  280. data/ext/src/third-party/zlib-1.2.3/minigzip.c +322 -0
  281. data/ext/src/third-party/zlib-1.2.3/msdos/Makefile.bor +109 -0
  282. data/ext/src/third-party/zlib-1.2.3/msdos/Makefile.dj2 +104 -0
  283. data/ext/src/third-party/zlib-1.2.3/msdos/Makefile.emx +69 -0
  284. data/ext/src/third-party/zlib-1.2.3/msdos/Makefile.msc +106 -0
  285. data/ext/src/third-party/zlib-1.2.3/msdos/Makefile.tc +94 -0
  286. data/ext/src/third-party/zlib-1.2.3/old/Makefile.riscos +151 -0
  287. data/ext/src/third-party/zlib-1.2.3/old/README +3 -0
  288. data/ext/src/third-party/zlib-1.2.3/old/descrip.mms +48 -0
  289. data/ext/src/third-party/zlib-1.2.3/old/os2/Makefile.os2 +136 -0
  290. data/ext/src/third-party/zlib-1.2.3/old/os2/zlib.def +51 -0
  291. data/ext/src/third-party/zlib-1.2.3/old/visual-basic.txt +160 -0
  292. data/ext/src/third-party/zlib-1.2.3/old/zlib.html +971 -0
  293. data/ext/src/third-party/zlib-1.2.3/projects/README.projects +41 -0
  294. data/ext/src/third-party/zlib-1.2.3/projects/visualc6/README.txt +73 -0
  295. data/ext/src/third-party/zlib-1.2.3/projects/visualc6/example.dsp +278 -0
  296. data/ext/src/third-party/zlib-1.2.3/projects/visualc6/minigzip.dsp +278 -0
  297. data/ext/src/third-party/zlib-1.2.3/projects/visualc6/zlib.dsp +609 -0
  298. data/ext/src/third-party/zlib-1.2.3/projects/visualc6/zlib.dsw +59 -0
  299. data/ext/src/third-party/zlib-1.2.3/qnx/package.qpg +141 -0
  300. data/ext/src/third-party/zlib-1.2.3/trees.c +1219 -0
  301. data/ext/src/third-party/zlib-1.2.3/trees.h +128 -0
  302. data/ext/src/third-party/zlib-1.2.3/trees.o +0 -0
  303. data/ext/src/third-party/zlib-1.2.3/uncompr.c +61 -0
  304. data/ext/src/third-party/zlib-1.2.3/uncompr.o +0 -0
  305. data/ext/src/third-party/zlib-1.2.3/win32/DLL_FAQ.txt +397 -0
  306. data/ext/src/third-party/zlib-1.2.3/win32/Makefile.bor +107 -0
  307. data/ext/src/third-party/zlib-1.2.3/win32/Makefile.emx +69 -0
  308. data/ext/src/third-party/zlib-1.2.3/win32/Makefile.gcc +141 -0
  309. data/ext/src/third-party/zlib-1.2.3/win32/Makefile.msc +126 -0
  310. data/ext/src/third-party/zlib-1.2.3/win32/VisualC.txt +3 -0
  311. data/ext/src/third-party/zlib-1.2.3/win32/zlib.def +60 -0
  312. data/ext/src/third-party/zlib-1.2.3/win32/zlib1.rc +39 -0
  313. data/ext/src/third-party/zlib-1.2.3/zconf.h +332 -0
  314. data/ext/src/third-party/zlib-1.2.3/zconf.in.h +332 -0
  315. data/ext/src/third-party/zlib-1.2.3/zlib.3 +159 -0
  316. data/ext/src/third-party/zlib-1.2.3/zlib.h +1357 -0
  317. data/ext/src/third-party/zlib-1.2.3/zutil.c +318 -0
  318. data/ext/src/third-party/zlib-1.2.3/zutil.h +269 -0
  319. data/ext/src/third-party/zlib-1.2.3/zutil.o +0 -0
  320. data/lib/assembly/a_b_visualiser.rb +169 -0
  321. data/lib/assembly/acyclic_connection_finder.rb +81 -0
  322. data/lib/assembly/all_orfs.rb +615 -0
  323. data/lib/assembly/bad_format_writer.rb +46 -0
  324. data/lib/assembly/bam_probe_read_selector.rb +48 -0
  325. data/lib/assembly/bubbly_assembler.rb +842 -0
  326. data/lib/assembly/c_probe_node_finder.rb +38 -0
  327. data/lib/assembly/connection_interpreter.rb +350 -0
  328. data/lib/assembly/contig_printer.rb +400 -0
  329. data/lib/assembly/coverage_based_graph_filter.rb +68 -0
  330. data/lib/assembly/depth_first_search.rb +63 -0
  331. data/lib/assembly/dijkstra.rb +216 -0
  332. data/lib/assembly/fluffer.rb +253 -0
  333. data/lib/assembly/graph_explorer.rb +85 -0
  334. data/lib/assembly/graph_generator.rb +315 -0
  335. data/lib/assembly/height_finder.rb +355 -0
  336. data/lib/assembly/hybrid_velvet_graph.rb +70 -0
  337. data/lib/assembly/input_genome.rb +182 -0
  338. data/lib/assembly/kmer_coverage_based_path_filter.rb +65 -0
  339. data/lib/assembly/node_finder.rb +171 -0
  340. data/lib/assembly/oriented_node_trail.rb +507 -0
  341. data/lib/assembly/paired_end_assembler.rb +53 -0
  342. data/lib/assembly/paired_end_neighbour_finder.rb +176 -0
  343. data/lib/assembly/probed_graph.rb +105 -0
  344. data/lib/assembly/read_input.rb +79 -0
  345. data/lib/assembly/read_to_node.rb +37 -0
  346. data/lib/assembly/scaffold_breaker.rb +126 -0
  347. data/lib/assembly/sequence_hasher.rb +71 -0
  348. data/lib/assembly/single_coherent_paths_between_nodes.rb +533 -0
  349. data/lib/assembly/single_coherent_wanderer.rb +261 -0
  350. data/lib/assembly/single_ended_assembler.rb +441 -0
  351. data/lib/assembly/velvet_c_binding.rb +54 -0
  352. data/lib/assembly/velvet_graph_sequence_extractor.rb +123 -0
  353. data/lib/external/VERSION +1 -0
  354. data/lib/finishm/assemble.rb +224 -0
  355. data/lib/finishm/explore.rb +217 -0
  356. data/lib/finishm/finisher.rb +303 -0
  357. data/lib/finishm/fluff.rb +122 -0
  358. data/lib/finishm/gapfiller.rb +325 -0
  359. data/lib/finishm/orfs_finder.rb +88 -0
  360. data/lib/finishm/path_counter.rb +90 -0
  361. data/lib/finishm/primers.rb +425 -0
  362. data/lib/finishm/primers_check.rb +176 -0
  363. data/lib/finishm/roundup.rb +344 -0
  364. data/lib/finishm/sequence.rb +142 -0
  365. data/lib/finishm/visualise.rb +430 -0
  366. data/lib/finishm/wander.rb +270 -0
  367. data/lib/kmer_abundance_pattern.rb +79 -0
  368. data/lib/kmer_multi_abundance_file.rb +48 -0
  369. data/lib/oligo_designer.rb +88 -0
  370. data/lib/priner.rb +66 -0
  371. data/spec/acyclic_connection_finder_spec.rb +551 -0
  372. data/spec/all_orfs_spec.rb +443 -0
  373. data/spec/assemble_spec.rb +186 -0
  374. data/spec/bubbly_assembler_spec.rb +707 -0
  375. data/spec/c_node_finder_spec.rb +58 -0
  376. data/spec/connection_interpreter_spec.rb +284 -0
  377. data/spec/contig_printer_spec.rb +291 -0
  378. data/spec/coverage_based_graph_filter_spec.rb +102 -0
  379. data/spec/data/6_3e4e5e6e.1vANME.bam +0 -0
  380. data/spec/data/6_3e4e5e6e.1vANME.bam.bai +0 -0
  381. data/spec/data/acyclic_connection_finder/1/probes.fa +5 -0
  382. data/spec/data/acyclic_connection_finder/1/random1.fa +2 -0
  383. data/spec/data/acyclic_connection_finder/1/random1.sammy.fa.gz +0 -0
  384. data/spec/data/acyclic_connection_finder/1/random2.fa +2 -0
  385. data/spec/data/acyclic_connection_finder/1/random2.sammy.fa.gz +0 -0
  386. data/spec/data/assembly/1_simple_bubble_uneven_coverage/random3000.fa +39 -0
  387. data/spec/data/assembly/1_simple_bubble_uneven_coverage/random3000.slightly_changed.fa +39 -0
  388. data/spec/data/assembly/1_simple_bubble_uneven_coverage/reads_combined.fa.gz +0 -0
  389. data/spec/data/assembly_visualiser/Contig_6_1_to_250.fa.kmers31 +220 -0
  390. data/spec/data/assembly_visualiser/Contig_7_1_to_250.fa.kmers31 +220 -0
  391. data/spec/data/assembly_visualiser/Graph +46 -0
  392. data/spec/data/assembly_visualiser/start_kmers1 +2 -0
  393. data/spec/data/bands.csv +1 -0
  394. data/spec/data/c_probe_node_finder/1/CnyUnifiedSeq +0 -0
  395. data/spec/data/c_probe_node_finder/1/CnyUnifiedSeq.names +544 -0
  396. data/spec/data/c_probe_node_finder/1/Graph2 +668 -0
  397. data/spec/data/c_probe_node_finder/1/LastGraph +668 -0
  398. data/spec/data/c_probe_node_finder/1/Log +756 -0
  399. data/spec/data/c_probe_node_finder/1/PreGraph +11 -0
  400. data/spec/data/c_probe_node_finder/1/Roadmaps +2009 -0
  401. data/spec/data/c_probe_node_finder/1/contigs.fa +29 -0
  402. data/spec/data/c_probe_node_finder/1/stats.txt +6 -0
  403. data/spec/data/contig_printer/1/HOWTO_RECREATE +17 -0
  404. data/spec/data/contig_printer/1/contigs.fa +4 -0
  405. data/spec/data/contig_printer/1/seq.fa +2408 -0
  406. data/spec/data/contig_printer/1/seq.fa.svg +153 -0
  407. data/spec/data/contig_printer/1/seq.fa.velvet/Graph2 +2953 -0
  408. data/spec/data/contig_printer/1/seq.fa.velvet/LastGraph +2953 -0
  409. data/spec/data/contig_printer/1/seq.fa.velvet/Log +21 -0
  410. data/spec/data/contig_printer/1/seq.fa.velvet/PreGraph +27 -0
  411. data/spec/data/contig_printer/1/seq.fa.velvet/Roadmaps +5182 -0
  412. data/spec/data/contig_printer/1/seq.fa.velvet/Sequences +3612 -0
  413. data/spec/data/contig_printer/1/seq.fa.velvet/contigs.fa +36 -0
  414. data/spec/data/contig_printer/1/seq.fa.velvet/stats.txt +14 -0
  415. data/spec/data/contig_printer/1/seq.faVseq2_1to550.fa.bam +0 -0
  416. data/spec/data/contig_printer/1/seq.faVseq2_1to550.fa.bam.bai +0 -0
  417. data/spec/data/contig_printer/1/seq.node12.fa +4 -0
  418. data/spec/data/contig_printer/1/seq1_1to550.fa +2 -0
  419. data/spec/data/contig_printer/1/seq2_1to550.fa +2 -0
  420. data/spec/data/contig_printer/1/seq2_1to550.fa.fai +1 -0
  421. data/spec/data/explore/1/2seqs.sammy.fa +12004 -0
  422. data/spec/data/explore/1/HOWTO_RECREATE.txt +6 -0
  423. data/spec/data/explore/1/a.fa +2 -0
  424. data/spec/data/explore/1/seq1_and_a.fa +3 -0
  425. data/spec/data/explore/1/seq2.fa +2 -0
  426. data/spec/data/fluff/1/2seqs.sammy.fa +12004 -0
  427. data/spec/data/fluff/1/HOWTO_RECREATE.txt +5 -0
  428. data/spec/data/fluff/1/seq1.fa +2 -0
  429. data/spec/data/fluff/1/seq2.fa +2 -0
  430. data/spec/data/gapfilling/1/reads.fa +171 -0
  431. data/spec/data/gapfilling/1/trail_with_Ns.fa +5 -0
  432. data/spec/data/gapfilling/1/velvetAssembly/Graph2 +130 -0
  433. data/spec/data/gapfilling/1/velvetAssembly/LastGraph +130 -0
  434. data/spec/data/gapfilling/1/velvetAssembly/Log +199 -0
  435. data/spec/data/gapfilling/1/velvetAssembly/PreGraph +7 -0
  436. data/spec/data/gapfilling/1/velvetAssembly/Roadmaps +239 -0
  437. data/spec/data/gapfilling/1/velvetAssembly/Sequences +281 -0
  438. data/spec/data/gapfilling/1/velvetAssembly/contigs.fa +12 -0
  439. data/spec/data/gapfilling/1/velvetAssembly/stats.txt +4 -0
  440. data/spec/data/gapfilling/2/HOWTO_recreate +17 -0
  441. data/spec/data/gapfilling/2/reference.fa +2 -0
  442. data/spec/data/gapfilling/2/reference_part1.fa +4 -0
  443. data/spec/data/gapfilling/2/reference_part2.fa +4 -0
  444. data/spec/data/gapfilling/2/sammy_reads.fa.gz +0 -0
  445. data/spec/data/gapfilling/2/with_gaps.fa +4 -0
  446. data/spec/data/gapfilling/3/HOWTO_recreate +4 -0
  447. data/spec/data/gapfilling/3/reads.fa.gz +0 -0
  448. data/spec/data/gapfilling/3/reference_part1.fa +4 -0
  449. data/spec/data/gapfilling/3/reference_part2.fa +4 -0
  450. data/spec/data/gapfilling/3/with_gaps.fa +4 -0
  451. data/spec/data/gapfilling/4/HOWTO_recreate +1 -0
  452. data/spec/data/gapfilling/4/reads.fa.gz +0 -0
  453. data/spec/data/gapfilling/5/HOWTO_RECREATE +7 -0
  454. data/spec/data/gapfilling/5/answer.fna +2 -0
  455. data/spec/data/gapfilling/5/gappy.fna +2 -0
  456. data/spec/data/gapfilling/5/reads.fa +17961 -0
  457. data/spec/data/gapfilling/5/velvet51_3.5/LastGraph +8337 -0
  458. data/spec/data/gapfilling/5/velvet51_3.5/Sequences +20921 -0
  459. data/spec/data/gapfilling/6/random1.fa +28 -0
  460. data/spec/data/gapfilling/6/random2.fa +28 -0
  461. data/spec/data/gapfilling/6/random_sequence_length_2000 +0 -0
  462. data/spec/data/gapfilling/6/reads.random1.fa.gz +0 -0
  463. data/spec/data/gapfilling/6/reads.random2.fa.gz +0 -0
  464. data/spec/data/gapfilling/6/to_gapfill.fa +22 -0
  465. data/spec/data/kmer_profile_to_assembly/multiple_abundance_file1.csv +2 -0
  466. data/spec/data/kmers_count1.csv +2 -0
  467. data/spec/data/kmers_count2.csv +3 -0
  468. data/spec/data/out +3 -0
  469. data/spec/data/positive_latching_pair.fa +2 -0
  470. data/spec/data/primers.csv +4 -0
  471. data/spec/data/read_selection_by_kmer/blacklist1.txt +1 -0
  472. data/spec/data/read_selection_by_kmer/input.fasta +6 -0
  473. data/spec/data/read_selection_by_kmer/whitelist1.txt +1 -0
  474. data/spec/data/read_selection_by_kmer/whitelist2.txt +2 -0
  475. data/spec/data/read_to_node/1_a_graph/HOWTO_RECREATE.txt +2 -0
  476. data/spec/data/read_to_node/1_a_graph/LastGraph +6695 -0
  477. data/spec/data/read_to_node/1_a_graph/ReadToNode.bin +0 -0
  478. data/spec/data/read_to_node/2_no_read256_or_259/HOWTO_RECREATE.txt +3 -0
  479. data/spec/data/read_to_node/2_no_read256_or_259/LastGraph +6693 -0
  480. data/spec/data/read_to_node/2_no_read256_or_259/ReadToNode.bin +0 -0
  481. data/spec/data/read_to_node/3_no_last_read/LastGraph +6694 -0
  482. data/spec/data/read_to_node/3_no_last_read/ReadToNode.bin +0 -0
  483. data/spec/data/t/details.txt +5 -0
  484. data/spec/data/t/details.txt.srt +5 -0
  485. data/spec/data/t/location.txt +3 -0
  486. data/spec/data/t/location.txt.srt +3 -0
  487. data/spec/data/tweak/1_gap_then_unscaffolded/answer.fa +2 -0
  488. data/spec/data/tweak/1_gap_then_unscaffolded/reads.fa.gz +0 -0
  489. data/spec/data/tweak/1_gap_then_unscaffolded/scaffolds.fa +6 -0
  490. data/spec/data/tweak/2_second_genome/answer2.fa +2 -0
  491. data/spec/data/tweak/2_second_genome/reads.fa.gz +0 -0
  492. data/spec/data/tweak/3_variant/answer.fa +2 -0
  493. data/spec/data/tweak/3_variant/lesser_answer.fa +2 -0
  494. data/spec/data/tweak/3_variant/reads.fa.gz +0 -0
  495. data/spec/data/tweak/3_variant/with_gaps.fa +2 -0
  496. data/spec/data/velvet_test_trails/Assem/Graph +17 -0
  497. data/spec/data/velvet_test_trails/Assem/Graph2 +40 -0
  498. data/spec/data/velvet_test_trails/Assem/LastGraph +40 -0
  499. data/spec/data/velvet_test_trails/Assem/Log +35 -0
  500. data/spec/data/velvet_test_trails/Assem/PreGraph +9 -0
  501. data/spec/data/velvet_test_trails/Assem/Roadmaps +89 -0
  502. data/spec/data/velvet_test_trails/Assem/Sequences +50 -0
  503. data/spec/data/velvet_test_trails/Assem/a.svg +53 -0
  504. data/spec/data/velvet_test_trails/Assem/contigs.fa +15 -0
  505. data/spec/data/velvet_test_trails/Assem/stats.txt +5 -0
  506. data/spec/data/velvet_test_trails/node_fwds.fa +8 -0
  507. data/spec/data/velvet_test_trails/node_seqs.fa +9 -0
  508. data/spec/data/velvet_test_trails/nodes_fwd_rev.fa +16 -0
  509. data/spec/data/velvet_test_trails/read1.fa +2 -0
  510. data/spec/data/velvet_test_trails/reads.fa +50 -0
  511. data/spec/data/velvet_test_trails_reverse/Assem/LastGraph +17 -0
  512. data/spec/data/velvet_test_trails_reverse/Assem/a.svg +53 -0
  513. data/spec/data/velvet_test_trails_reverse/reads_reversed.fa +10 -0
  514. data/spec/data/visualise/1/LastGraph +6695 -0
  515. data/spec/data/visualise/2_paired_end/HOWTO_RECREATE.txt +10 -0
  516. data/spec/data/visualise/2_paired_end/rand1.fa +2 -0
  517. data/spec/data/visualise/2_paired_end/rand2.fa +2 -0
  518. data/spec/data/visualise/2_paired_end/with_gaps.fa +8 -0
  519. data/spec/data/visualise/2_paired_end/with_gaps.read_pairs.fa.gz +0 -0
  520. data/spec/data/wander/1/random1.fa +2 -0
  521. data/spec/data/wander/1/random1.sammy.fa +804 -0
  522. data/spec/depth_first_search_spec.rb +190 -0
  523. data/spec/dijkstra_spec.rb +143 -0
  524. data/spec/explore_spec.rb +29 -0
  525. data/spec/fluffer_spec.rb +155 -0
  526. data/spec/gapfiller_spec.rb +107 -0
  527. data/spec/graph_explorer_spec.rb +475 -0
  528. data/spec/graph_generator_spec.rb +99 -0
  529. data/spec/height_finder_spec.rb +306 -0
  530. data/spec/kmer_abundance_pattern_spec.rb +56 -0
  531. data/spec/kmer_coverage_based_path_filter_spec.rb +73 -0
  532. data/spec/kmer_profile_finder_spec.rb +38 -0
  533. data/spec/kmers_count_tabulate_spec.rb +120 -0
  534. data/spec/oriented_node_trail_spec.rb +221 -0
  535. data/spec/paired_end_neighbours_spec.rb +126 -0
  536. data/spec/paths_between_nodes_spec.rb +349 -0
  537. data/spec/priner_spec.rb +7 -0
  538. data/spec/read_input_spec.rb +23 -0
  539. data/spec/read_selection_by_kmer_spec.rb +166 -0
  540. data/spec/read_to_node_spec.rb +35 -0
  541. data/spec/roundup_spec.rb +366 -0
  542. data/spec/scaffold_breaker_spec.rb +144 -0
  543. data/spec/sequence_spec.rb +43 -0
  544. data/spec/single_coherent_paths_between_nodes_spec.rb +492 -0
  545. data/spec/single_coherent_wanderer_spec.rb +120 -0
  546. data/spec/single_ended_assembler_spec.rb +398 -0
  547. data/spec/spec_helper.rb +310 -0
  548. data/spec/velvet_graph_sequence_extractor_spec.rb +80 -0
  549. data/spec/visualise_spec.rb +105 -0
  550. data/spec/wander_spec.rb +119 -0
  551. data/spec/watch_for_changes.sh +16 -0
  552. data/validation/fasta_compare.rb +72 -0
  553. data/validation/gapfill_simulate_perfect.rb +108 -0
  554. metadata +899 -0
@@ -0,0 +1,34 @@
1
+ This is a patched version of zlib, modified to use
2
+ Pentium-Pro-optimized assembly code in the deflation algorithm. The
3
+ files changed/added by this patch are:
4
+
5
+ README.686
6
+ match.S
7
+
8
+ The speedup that this patch provides varies, depending on whether the
9
+ compiler used to build the original version of zlib falls afoul of the
10
+ PPro's speed traps. My own tests show a speedup of around 10-20% at
11
+ the default compression level, and 20-30% using -9, against a version
12
+ compiled using gcc 2.7.2.3. Your mileage may vary.
13
+
14
+ Note that this code has been tailored for the PPro/PII in particular,
15
+ and will not perform particuarly well on a Pentium.
16
+
17
+ If you are using an assembler other than GNU as, you will have to
18
+ translate match.S to use your assembler's syntax. (Have fun.)
19
+
20
+ Brian Raiter
21
+ breadbox@muppetlabs.com
22
+ April, 1998
23
+
24
+
25
+ Added for zlib 1.1.3:
26
+
27
+ The patches come from
28
+ http://www.muppetlabs.com/~breadbox/software/assembly.html
29
+
30
+ To compile zlib with this asm file, copy match.S to the zlib directory
31
+ then do:
32
+
33
+ CFLAGS="-O3 -DASMV" ./configure
34
+ make OBJA=match.o
@@ -0,0 +1,329 @@
1
+ /* match.s -- Pentium-Pro-optimized version of longest_match()
2
+ * Written for zlib 1.1.2
3
+ * Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
4
+ *
5
+ * This is free software; you can redistribute it and/or modify it
6
+ * under the terms of the GNU General Public License.
7
+ */
8
+
9
+ #ifndef NO_UNDERLINE
10
+ #define match_init _match_init
11
+ #define longest_match _longest_match
12
+ #endif
13
+
14
+ #define MAX_MATCH (258)
15
+ #define MIN_MATCH (3)
16
+ #define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1)
17
+ #define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7)
18
+
19
+ /* stack frame offsets */
20
+
21
+ #define chainlenwmask 0 /* high word: current chain len */
22
+ /* low word: s->wmask */
23
+ #define window 4 /* local copy of s->window */
24
+ #define windowbestlen 8 /* s->window + bestlen */
25
+ #define scanstart 16 /* first two bytes of string */
26
+ #define scanend 12 /* last two bytes of string */
27
+ #define scanalign 20 /* dword-misalignment of string */
28
+ #define nicematch 24 /* a good enough match size */
29
+ #define bestlen 28 /* size of best match so far */
30
+ #define scan 32 /* ptr to string wanting match */
31
+
32
+ #define LocalVarsSize (36)
33
+ /* saved ebx 36 */
34
+ /* saved edi 40 */
35
+ /* saved esi 44 */
36
+ /* saved ebp 48 */
37
+ /* return address 52 */
38
+ #define deflatestate 56 /* the function arguments */
39
+ #define curmatch 60
40
+
41
+ /* All the +zlib1222add offsets are due to the addition of fields
42
+ * in zlib in the deflate_state structure since the asm code was first written
43
+ * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
44
+ * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
45
+ * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
46
+ */
47
+
48
+ #define zlib1222add (8)
49
+
50
+ #define dsWSize (36+zlib1222add)
51
+ #define dsWMask (44+zlib1222add)
52
+ #define dsWindow (48+zlib1222add)
53
+ #define dsPrev (56+zlib1222add)
54
+ #define dsMatchLen (88+zlib1222add)
55
+ #define dsPrevMatch (92+zlib1222add)
56
+ #define dsStrStart (100+zlib1222add)
57
+ #define dsMatchStart (104+zlib1222add)
58
+ #define dsLookahead (108+zlib1222add)
59
+ #define dsPrevLen (112+zlib1222add)
60
+ #define dsMaxChainLen (116+zlib1222add)
61
+ #define dsGoodMatch (132+zlib1222add)
62
+ #define dsNiceMatch (136+zlib1222add)
63
+
64
+
65
+ .file "match.S"
66
+
67
+ .globl match_init, longest_match
68
+
69
+ .text
70
+
71
+ /* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
72
+
73
+ longest_match:
74
+
75
+ /* Save registers that the compiler may be using, and adjust %esp to */
76
+ /* make room for our stack frame. */
77
+
78
+ pushl %ebp
79
+ pushl %edi
80
+ pushl %esi
81
+ pushl %ebx
82
+ subl $LocalVarsSize, %esp
83
+
84
+ /* Retrieve the function arguments. %ecx will hold cur_match */
85
+ /* throughout the entire function. %edx will hold the pointer to the */
86
+ /* deflate_state structure during the function's setup (before */
87
+ /* entering the main loop). */
88
+
89
+ movl deflatestate(%esp), %edx
90
+ movl curmatch(%esp), %ecx
91
+
92
+ /* uInt wmask = s->w_mask; */
93
+ /* unsigned chain_length = s->max_chain_length; */
94
+ /* if (s->prev_length >= s->good_match) { */
95
+ /* chain_length >>= 2; */
96
+ /* } */
97
+
98
+ movl dsPrevLen(%edx), %eax
99
+ movl dsGoodMatch(%edx), %ebx
100
+ cmpl %ebx, %eax
101
+ movl dsWMask(%edx), %eax
102
+ movl dsMaxChainLen(%edx), %ebx
103
+ jl LastMatchGood
104
+ shrl $2, %ebx
105
+ LastMatchGood:
106
+
107
+ /* chainlen is decremented once beforehand so that the function can */
108
+ /* use the sign flag instead of the zero flag for the exit test. */
109
+ /* It is then shifted into the high word, to make room for the wmask */
110
+ /* value, which it will always accompany. */
111
+
112
+ decl %ebx
113
+ shll $16, %ebx
114
+ orl %eax, %ebx
115
+ movl %ebx, chainlenwmask(%esp)
116
+
117
+ /* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */
118
+
119
+ movl dsNiceMatch(%edx), %eax
120
+ movl dsLookahead(%edx), %ebx
121
+ cmpl %eax, %ebx
122
+ jl LookaheadLess
123
+ movl %eax, %ebx
124
+ LookaheadLess: movl %ebx, nicematch(%esp)
125
+
126
+ /* register Bytef *scan = s->window + s->strstart; */
127
+
128
+ movl dsWindow(%edx), %esi
129
+ movl %esi, window(%esp)
130
+ movl dsStrStart(%edx), %ebp
131
+ lea (%esi,%ebp), %edi
132
+ movl %edi, scan(%esp)
133
+
134
+ /* Determine how many bytes the scan ptr is off from being */
135
+ /* dword-aligned. */
136
+
137
+ movl %edi, %eax
138
+ negl %eax
139
+ andl $3, %eax
140
+ movl %eax, scanalign(%esp)
141
+
142
+ /* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
143
+ /* s->strstart - (IPos)MAX_DIST(s) : NIL; */
144
+
145
+ movl dsWSize(%edx), %eax
146
+ subl $MIN_LOOKAHEAD, %eax
147
+ subl %eax, %ebp
148
+ jg LimitPositive
149
+ xorl %ebp, %ebp
150
+ LimitPositive:
151
+
152
+ /* int best_len = s->prev_length; */
153
+
154
+ movl dsPrevLen(%edx), %eax
155
+ movl %eax, bestlen(%esp)
156
+
157
+ /* Store the sum of s->window + best_len in %esi locally, and in %esi. */
158
+
159
+ addl %eax, %esi
160
+ movl %esi, windowbestlen(%esp)
161
+
162
+ /* register ush scan_start = *(ushf*)scan; */
163
+ /* register ush scan_end = *(ushf*)(scan+best_len-1); */
164
+ /* Posf *prev = s->prev; */
165
+
166
+ movzwl (%edi), %ebx
167
+ movl %ebx, scanstart(%esp)
168
+ movzwl -1(%edi,%eax), %ebx
169
+ movl %ebx, scanend(%esp)
170
+ movl dsPrev(%edx), %edi
171
+
172
+ /* Jump into the main loop. */
173
+
174
+ movl chainlenwmask(%esp), %edx
175
+ jmp LoopEntry
176
+
177
+ .balign 16
178
+
179
+ /* do {
180
+ * match = s->window + cur_match;
181
+ * if (*(ushf*)(match+best_len-1) != scan_end ||
182
+ * *(ushf*)match != scan_start) continue;
183
+ * [...]
184
+ * } while ((cur_match = prev[cur_match & wmask]) > limit
185
+ * && --chain_length != 0);
186
+ *
187
+ * Here is the inner loop of the function. The function will spend the
188
+ * majority of its time in this loop, and majority of that time will
189
+ * be spent in the first ten instructions.
190
+ *
191
+ * Within this loop:
192
+ * %ebx = scanend
193
+ * %ecx = curmatch
194
+ * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
195
+ * %esi = windowbestlen - i.e., (window + bestlen)
196
+ * %edi = prev
197
+ * %ebp = limit
198
+ */
199
+ LookupLoop:
200
+ andl %edx, %ecx
201
+ movzwl (%edi,%ecx,2), %ecx
202
+ cmpl %ebp, %ecx
203
+ jbe LeaveNow
204
+ subl $0x00010000, %edx
205
+ js LeaveNow
206
+ LoopEntry: movzwl -1(%esi,%ecx), %eax
207
+ cmpl %ebx, %eax
208
+ jnz LookupLoop
209
+ movl window(%esp), %eax
210
+ movzwl (%eax,%ecx), %eax
211
+ cmpl scanstart(%esp), %eax
212
+ jnz LookupLoop
213
+
214
+ /* Store the current value of chainlen. */
215
+
216
+ movl %edx, chainlenwmask(%esp)
217
+
218
+ /* Point %edi to the string under scrutiny, and %esi to the string we */
219
+ /* are hoping to match it up with. In actuality, %esi and %edi are */
220
+ /* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
221
+ /* initialized to -(MAX_MATCH_8 - scanalign). */
222
+
223
+ movl window(%esp), %esi
224
+ movl scan(%esp), %edi
225
+ addl %ecx, %esi
226
+ movl scanalign(%esp), %eax
227
+ movl $(-MAX_MATCH_8), %edx
228
+ lea MAX_MATCH_8(%edi,%eax), %edi
229
+ lea MAX_MATCH_8(%esi,%eax), %esi
230
+
231
+ /* Test the strings for equality, 8 bytes at a time. At the end,
232
+ * adjust %edx so that it is offset to the exact byte that mismatched.
233
+ *
234
+ * We already know at this point that the first three bytes of the
235
+ * strings match each other, and they can be safely passed over before
236
+ * starting the compare loop. So what this code does is skip over 0-3
237
+ * bytes, as much as necessary in order to dword-align the %edi
238
+ * pointer. (%esi will still be misaligned three times out of four.)
239
+ *
240
+ * It should be confessed that this loop usually does not represent
241
+ * much of the total running time. Replacing it with a more
242
+ * straightforward "rep cmpsb" would not drastically degrade
243
+ * performance.
244
+ */
245
+ LoopCmps:
246
+ movl (%esi,%edx), %eax
247
+ xorl (%edi,%edx), %eax
248
+ jnz LeaveLoopCmps
249
+ movl 4(%esi,%edx), %eax
250
+ xorl 4(%edi,%edx), %eax
251
+ jnz LeaveLoopCmps4
252
+ addl $8, %edx
253
+ jnz LoopCmps
254
+ jmp LenMaximum
255
+ LeaveLoopCmps4: addl $4, %edx
256
+ LeaveLoopCmps: testl $0x0000FFFF, %eax
257
+ jnz LenLower
258
+ addl $2, %edx
259
+ shrl $16, %eax
260
+ LenLower: subb $1, %al
261
+ adcl $0, %edx
262
+
263
+ /* Calculate the length of the match. If it is longer than MAX_MATCH, */
264
+ /* then automatically accept it as the best possible match and leave. */
265
+
266
+ lea (%edi,%edx), %eax
267
+ movl scan(%esp), %edi
268
+ subl %edi, %eax
269
+ cmpl $MAX_MATCH, %eax
270
+ jge LenMaximum
271
+
272
+ /* If the length of the match is not longer than the best match we */
273
+ /* have so far, then forget it and return to the lookup loop. */
274
+
275
+ movl deflatestate(%esp), %edx
276
+ movl bestlen(%esp), %ebx
277
+ cmpl %ebx, %eax
278
+ jg LongerMatch
279
+ movl windowbestlen(%esp), %esi
280
+ movl dsPrev(%edx), %edi
281
+ movl scanend(%esp), %ebx
282
+ movl chainlenwmask(%esp), %edx
283
+ jmp LookupLoop
284
+
285
+ /* s->match_start = cur_match; */
286
+ /* best_len = len; */
287
+ /* if (len >= nice_match) break; */
288
+ /* scan_end = *(ushf*)(scan+best_len-1); */
289
+
290
+ LongerMatch: movl nicematch(%esp), %ebx
291
+ movl %eax, bestlen(%esp)
292
+ movl %ecx, dsMatchStart(%edx)
293
+ cmpl %ebx, %eax
294
+ jge LeaveNow
295
+ movl window(%esp), %esi
296
+ addl %eax, %esi
297
+ movl %esi, windowbestlen(%esp)
298
+ movzwl -1(%edi,%eax), %ebx
299
+ movl dsPrev(%edx), %edi
300
+ movl %ebx, scanend(%esp)
301
+ movl chainlenwmask(%esp), %edx
302
+ jmp LookupLoop
303
+
304
+ /* Accept the current string, with the maximum possible length. */
305
+
306
+ LenMaximum: movl deflatestate(%esp), %edx
307
+ movl $MAX_MATCH, bestlen(%esp)
308
+ movl %ecx, dsMatchStart(%edx)
309
+
310
+ /* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
311
+ /* return s->lookahead; */
312
+
313
+ LeaveNow:
314
+ movl deflatestate(%esp), %edx
315
+ movl bestlen(%esp), %ebx
316
+ movl dsLookahead(%edx), %eax
317
+ cmpl %eax, %ebx
318
+ jg LookaheadRet
319
+ movl %ebx, %eax
320
+ LookaheadRet:
321
+
322
+ /* Restore the stack and return from whence we came. */
323
+
324
+ addl $LocalVarsSize, %esp
325
+ popl %ebx
326
+ popl %esi
327
+ popl %edi
328
+ popl %ebp
329
+ match_init: ret
@@ -0,0 +1,8 @@
1
+ blast: blast.c blast.h
2
+ cc -DTEST -o blast blast.c
3
+
4
+ test: blast
5
+ blast < test.pk | cmp - test.txt
6
+
7
+ clean:
8
+ rm -f blast blast.o
@@ -0,0 +1,4 @@
1
+ Read blast.h for purpose and usage.
2
+
3
+ Mark Adler
4
+ madler@alumni.caltech.edu
@@ -0,0 +1,444 @@
1
+ /* blast.c
2
+ * Copyright (C) 2003 Mark Adler
3
+ * For conditions of distribution and use, see copyright notice in blast.h
4
+ * version 1.1, 16 Feb 2003
5
+ *
6
+ * blast.c decompresses data compressed by the PKWare Compression Library.
7
+ * This function provides functionality similar to the explode() function of
8
+ * the PKWare library, hence the name "blast".
9
+ *
10
+ * This decompressor is based on the excellent format description provided by
11
+ * Ben Rudiak-Gould in comp.compression on August 13, 2001. Interestingly, the
12
+ * example Ben provided in the post is incorrect. The distance 110001 should
13
+ * instead be 111000. When corrected, the example byte stream becomes:
14
+ *
15
+ * 00 04 82 24 25 8f 80 7f
16
+ *
17
+ * which decompresses to "AIAIAIAIAIAIA" (without the quotes).
18
+ */
19
+
20
+ /*
21
+ * Change history:
22
+ *
23
+ * 1.0 12 Feb 2003 - First version
24
+ * 1.1 16 Feb 2003 - Fixed distance check for > 4 GB uncompressed data
25
+ */
26
+
27
+ #include <setjmp.h> /* for setjmp(), longjmp(), and jmp_buf */
28
+ #include "blast.h" /* prototype for blast() */
29
+
30
+ #define local static /* for local function definitions */
31
+ #define MAXBITS 13 /* maximum code length */
32
+ #define MAXWIN 4096 /* maximum window size */
33
+
34
+ /* input and output state */
35
+ struct state {
36
+ /* input state */
37
+ blast_in infun; /* input function provided by user */
38
+ void *inhow; /* opaque information passed to infun() */
39
+ unsigned char *in; /* next input location */
40
+ unsigned left; /* available input at in */
41
+ int bitbuf; /* bit buffer */
42
+ int bitcnt; /* number of bits in bit buffer */
43
+
44
+ /* input limit error return state for bits() and decode() */
45
+ jmp_buf env;
46
+
47
+ /* output state */
48
+ blast_out outfun; /* output function provided by user */
49
+ void *outhow; /* opaque information passed to outfun() */
50
+ unsigned next; /* index of next write location in out[] */
51
+ int first; /* true to check distances (for first 4K) */
52
+ unsigned char out[MAXWIN]; /* output buffer and sliding window */
53
+ };
54
+
55
+ /*
56
+ * Return need bits from the input stream. This always leaves less than
57
+ * eight bits in the buffer. bits() works properly for need == 0.
58
+ *
59
+ * Format notes:
60
+ *
61
+ * - Bits are stored in bytes from the least significant bit to the most
62
+ * significant bit. Therefore bits are dropped from the bottom of the bit
63
+ * buffer, using shift right, and new bytes are appended to the top of the
64
+ * bit buffer, using shift left.
65
+ */
66
+ local int bits(struct state *s, int need)
67
+ {
68
+ int val; /* bit accumulator */
69
+
70
+ /* load at least need bits into val */
71
+ val = s->bitbuf;
72
+ while (s->bitcnt < need) {
73
+ if (s->left == 0) {
74
+ s->left = s->infun(s->inhow, &(s->in));
75
+ if (s->left == 0) longjmp(s->env, 1); /* out of input */
76
+ }
77
+ val |= (int)(*(s->in)++) << s->bitcnt; /* load eight bits */
78
+ s->left--;
79
+ s->bitcnt += 8;
80
+ }
81
+
82
+ /* drop need bits and update buffer, always zero to seven bits left */
83
+ s->bitbuf = val >> need;
84
+ s->bitcnt -= need;
85
+
86
+ /* return need bits, zeroing the bits above that */
87
+ return val & ((1 << need) - 1);
88
+ }
89
+
90
+ /*
91
+ * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of
92
+ * each length, which for a canonical code are stepped through in order.
93
+ * symbol[] are the symbol values in canonical order, where the number of
94
+ * entries is the sum of the counts in count[]. The decoding process can be
95
+ * seen in the function decode() below.
96
+ */
97
+ struct huffman {
98
+ short *count; /* number of symbols of each length */
99
+ short *symbol; /* canonically ordered symbols */
100
+ };
101
+
102
+ /*
103
+ * Decode a code from the stream s using huffman table h. Return the symbol or
104
+ * a negative value if there is an error. If all of the lengths are zero, i.e.
105
+ * an empty code, or if the code is incomplete and an invalid code is received,
106
+ * then -9 is returned after reading MAXBITS bits.
107
+ *
108
+ * Format notes:
109
+ *
110
+ * - The codes as stored in the compressed data are bit-reversed relative to
111
+ * a simple integer ordering of codes of the same lengths. Hence below the
112
+ * bits are pulled from the compressed data one at a time and used to
113
+ * build the code value reversed from what is in the stream in order to
114
+ * permit simple integer comparisons for decoding.
115
+ *
116
+ * - The first code for the shortest length is all ones. Subsequent codes of
117
+ * the same length are simply integer decrements of the previous code. When
118
+ * moving up a length, a one bit is appended to the code. For a complete
119
+ * code, the last code of the longest length will be all zeros. To support
120
+ * this ordering, the bits pulled during decoding are inverted to apply the
121
+ * more "natural" ordering starting with all zeros and incrementing.
122
+ */
123
+ local int decode(struct state *s, struct huffman *h)
124
+ {
125
+ int len; /* current number of bits in code */
126
+ int code; /* len bits being decoded */
127
+ int first; /* first code of length len */
128
+ int count; /* number of codes of length len */
129
+ int index; /* index of first code of length len in symbol table */
130
+ int bitbuf; /* bits from stream */
131
+ int left; /* bits left in next or left to process */
132
+ short *next; /* next number of codes */
133
+
134
+ bitbuf = s->bitbuf;
135
+ left = s->bitcnt;
136
+ code = first = index = 0;
137
+ len = 1;
138
+ next = h->count + 1;
139
+ while (1) {
140
+ while (left--) {
141
+ code |= (bitbuf & 1) ^ 1; /* invert code */
142
+ bitbuf >>= 1;
143
+ count = *next++;
144
+ if (code < first + count) { /* if length len, return symbol */
145
+ s->bitbuf = bitbuf;
146
+ s->bitcnt = (s->bitcnt - len) & 7;
147
+ return h->symbol[index + (code - first)];
148
+ }
149
+ index += count; /* else update for next length */
150
+ first += count;
151
+ first <<= 1;
152
+ code <<= 1;
153
+ len++;
154
+ }
155
+ left = (MAXBITS+1) - len;
156
+ if (left == 0) break;
157
+ if (s->left == 0) {
158
+ s->left = s->infun(s->inhow, &(s->in));
159
+ if (s->left == 0) longjmp(s->env, 1); /* out of input */
160
+ }
161
+ bitbuf = *(s->in)++;
162
+ s->left--;
163
+ if (left > 8) left = 8;
164
+ }
165
+ return -9; /* ran out of codes */
166
+ }
167
+
168
+ /*
169
+ * Given a list of repeated code lengths rep[0..n-1], where each byte is a
170
+ * count (high four bits + 1) and a code length (low four bits), generate the
171
+ * list of code lengths. This compaction reduces the size of the object code.
172
+ * Then given the list of code lengths length[0..n-1] representing a canonical
173
+ * Huffman code for n symbols, construct the tables required to decode those
174
+ * codes. Those tables are the number of codes of each length, and the symbols
175
+ * sorted by length, retaining their original order within each length. The
176
+ * return value is zero for a complete code set, negative for an over-
177
+ * subscribed code set, and positive for an incomplete code set. The tables
178
+ * can be used if the return value is zero or positive, but they cannot be used
179
+ * if the return value is negative. If the return value is zero, it is not
180
+ * possible for decode() using that table to return an error--any stream of
181
+ * enough bits will resolve to a symbol. If the return value is positive, then
182
+ * it is possible for decode() using that table to return an error for received
183
+ * codes past the end of the incomplete lengths.
184
+ */
185
+ local int construct(struct huffman *h, const unsigned char *rep, int n)
186
+ {
187
+ int symbol; /* current symbol when stepping through length[] */
188
+ int len; /* current length when stepping through h->count[] */
189
+ int left; /* number of possible codes left of current length */
190
+ short offs[MAXBITS+1]; /* offsets in symbol table for each length */
191
+ short length[256]; /* code lengths */
192
+
193
+ /* convert compact repeat counts into symbol bit length list */
194
+ symbol = 0;
195
+ do {
196
+ len = *rep++;
197
+ left = (len >> 4) + 1;
198
+ len &= 15;
199
+ do {
200
+ length[symbol++] = len;
201
+ } while (--left);
202
+ } while (--n);
203
+ n = symbol;
204
+
205
+ /* count number of codes of each length */
206
+ for (len = 0; len <= MAXBITS; len++)
207
+ h->count[len] = 0;
208
+ for (symbol = 0; symbol < n; symbol++)
209
+ (h->count[length[symbol]])++; /* assumes lengths are within bounds */
210
+ if (h->count[0] == n) /* no codes! */
211
+ return 0; /* complete, but decode() will fail */
212
+
213
+ /* check for an over-subscribed or incomplete set of lengths */
214
+ left = 1; /* one possible code of zero length */
215
+ for (len = 1; len <= MAXBITS; len++) {
216
+ left <<= 1; /* one more bit, double codes left */
217
+ left -= h->count[len]; /* deduct count from possible codes */
218
+ if (left < 0) return left; /* over-subscribed--return negative */
219
+ } /* left > 0 means incomplete */
220
+
221
+ /* generate offsets into symbol table for each length for sorting */
222
+ offs[1] = 0;
223
+ for (len = 1; len < MAXBITS; len++)
224
+ offs[len + 1] = offs[len] + h->count[len];
225
+
226
+ /*
227
+ * put symbols in table sorted by length, by symbol order within each
228
+ * length
229
+ */
230
+ for (symbol = 0; symbol < n; symbol++)
231
+ if (length[symbol] != 0)
232
+ h->symbol[offs[length[symbol]]++] = symbol;
233
+
234
+ /* return zero for complete set, positive for incomplete set */
235
+ return left;
236
+ }
237
+
238
+ /*
239
+ * Decode PKWare Compression Library stream.
240
+ *
241
+ * Format notes:
242
+ *
243
+ * - First byte is 0 if literals are uncoded or 1 if they are coded. Second
244
+ * byte is 4, 5, or 6 for the number of extra bits in the distance code.
245
+ * This is the base-2 logarithm of the dictionary size minus six.
246
+ *
247
+ * - Compressed data is a combination of literals and length/distance pairs
248
+ * terminated by an end code. Literals are either Huffman coded or
249
+ * uncoded bytes. A length/distance pair is a coded length followed by a
250
+ * coded distance to represent a string that occurs earlier in the
251
+ * uncompressed data that occurs again at the current location.
252
+ *
253
+ * - A bit preceding a literal or length/distance pair indicates which comes
254
+ * next, 0 for literals, 1 for length/distance.
255
+ *
256
+ * - If literals are uncoded, then the next eight bits are the literal, in the
257
+ * normal bit order in th stream, i.e. no bit-reversal is needed. Similarly,
258
+ * no bit reversal is needed for either the length extra bits or the distance
259
+ * extra bits.
260
+ *
261
+ * - Literal bytes are simply written to the output. A length/distance pair is
262
+ * an instruction to copy previously uncompressed bytes to the output. The
263
+ * copy is from distance bytes back in the output stream, copying for length
264
+ * bytes.
265
+ *
266
+ * - Distances pointing before the beginning of the output data are not
267
+ * permitted.
268
+ *
269
+ * - Overlapped copies, where the length is greater than the distance, are
270
+ * allowed and common. For example, a distance of one and a length of 518
271
+ * simply copies the last byte 518 times. A distance of four and a length of
272
+ * twelve copies the last four bytes three times. A simple forward copy
273
+ * ignoring whether the length is greater than the distance or not implements
274
+ * this correctly.
275
+ */
276
+ local int decomp(struct state *s)
277
+ {
278
+ int lit; /* true if literals are coded */
279
+ int dict; /* log2(dictionary size) - 6 */
280
+ int symbol; /* decoded symbol, extra bits for distance */
281
+ int len; /* length for copy */
282
+ int dist; /* distance for copy */
283
+ int copy; /* copy counter */
284
+ unsigned char *from, *to; /* copy pointers */
285
+ static int virgin = 1; /* build tables once */
286
+ static short litcnt[MAXBITS+1], litsym[256]; /* litcode memory */
287
+ static short lencnt[MAXBITS+1], lensym[16]; /* lencode memory */
288
+ static short distcnt[MAXBITS+1], distsym[64]; /* distcode memory */
289
+ static struct huffman litcode = {litcnt, litsym}; /* length code */
290
+ static struct huffman lencode = {lencnt, lensym}; /* length code */
291
+ static struct huffman distcode = {distcnt, distsym};/* distance code */
292
+ /* bit lengths of literal codes */
293
+ static const unsigned char litlen[] = {
294
+ 11, 124, 8, 7, 28, 7, 188, 13, 76, 4, 10, 8, 12, 10, 12, 10, 8, 23, 8,
295
+ 9, 7, 6, 7, 8, 7, 6, 55, 8, 23, 24, 12, 11, 7, 9, 11, 12, 6, 7, 22, 5,
296
+ 7, 24, 6, 11, 9, 6, 7, 22, 7, 11, 38, 7, 9, 8, 25, 11, 8, 11, 9, 12,
297
+ 8, 12, 5, 38, 5, 38, 5, 11, 7, 5, 6, 21, 6, 10, 53, 8, 7, 24, 10, 27,
298
+ 44, 253, 253, 253, 252, 252, 252, 13, 12, 45, 12, 45, 12, 61, 12, 45,
299
+ 44, 173};
300
+ /* bit lengths of length codes 0..15 */
301
+ static const unsigned char lenlen[] = {2, 35, 36, 53, 38, 23};
302
+ /* bit lengths of distance codes 0..63 */
303
+ static const unsigned char distlen[] = {2, 20, 53, 230, 247, 151, 248};
304
+ static const short base[16] = { /* base for length codes */
305
+ 3, 2, 4, 5, 6, 7, 8, 9, 10, 12, 16, 24, 40, 72, 136, 264};
306
+ static const char extra[16] = { /* extra bits for length codes */
307
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8};
308
+
309
+ /* set up decoding tables (once--might not be thread-safe) */
310
+ if (virgin) {
311
+ construct(&litcode, litlen, sizeof(litlen));
312
+ construct(&lencode, lenlen, sizeof(lenlen));
313
+ construct(&distcode, distlen, sizeof(distlen));
314
+ virgin = 0;
315
+ }
316
+
317
+ /* read header */
318
+ lit = bits(s, 8);
319
+ if (lit > 1) return -1;
320
+ dict = bits(s, 8);
321
+ if (dict < 4 || dict > 6) return -2;
322
+
323
+ /* decode literals and length/distance pairs */
324
+ do {
325
+ if (bits(s, 1)) {
326
+ /* get length */
327
+ symbol = decode(s, &lencode);
328
+ len = base[symbol] + bits(s, extra[symbol]);
329
+ if (len == 519) break; /* end code */
330
+
331
+ /* get distance */
332
+ symbol = len == 2 ? 2 : dict;
333
+ dist = decode(s, &distcode) << symbol;
334
+ dist += bits(s, symbol);
335
+ dist++;
336
+ if (s->first && dist > s->next)
337
+ return -3; /* distance too far back */
338
+
339
+ /* copy length bytes from distance bytes back */
340
+ do {
341
+ to = s->out + s->next;
342
+ from = to - dist;
343
+ copy = MAXWIN;
344
+ if (s->next < dist) {
345
+ from += copy;
346
+ copy = dist;
347
+ }
348
+ copy -= s->next;
349
+ if (copy > len) copy = len;
350
+ len -= copy;
351
+ s->next += copy;
352
+ do {
353
+ *to++ = *from++;
354
+ } while (--copy);
355
+ if (s->next == MAXWIN) {
356
+ if (s->outfun(s->outhow, s->out, s->next)) return 1;
357
+ s->next = 0;
358
+ s->first = 0;
359
+ }
360
+ } while (len != 0);
361
+ }
362
+ else {
363
+ /* get literal and write it */
364
+ symbol = lit ? decode(s, &litcode) : bits(s, 8);
365
+ s->out[s->next++] = symbol;
366
+ if (s->next == MAXWIN) {
367
+ if (s->outfun(s->outhow, s->out, s->next)) return 1;
368
+ s->next = 0;
369
+ s->first = 0;
370
+ }
371
+ }
372
+ } while (1);
373
+ return 0;
374
+ }
375
+
376
+ /* See comments in blast.h */
377
+ int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow)
378
+ {
379
+ struct state s; /* input/output state */
380
+ int err; /* return value */
381
+
382
+ /* initialize input state */
383
+ s.infun = infun;
384
+ s.inhow = inhow;
385
+ s.left = 0;
386
+ s.bitbuf = 0;
387
+ s.bitcnt = 0;
388
+
389
+ /* initialize output state */
390
+ s.outfun = outfun;
391
+ s.outhow = outhow;
392
+ s.next = 0;
393
+ s.first = 1;
394
+
395
+ /* return if bits() or decode() tries to read past available input */
396
+ if (setjmp(s.env) != 0) /* if came back here via longjmp(), */
397
+ err = 2; /* then skip decomp(), return error */
398
+ else
399
+ err = decomp(&s); /* decompress */
400
+
401
+ /* write any leftover output and update the error code if needed */
402
+ if (err != 1 && s.next && s.outfun(s.outhow, s.out, s.next) && err == 0)
403
+ err = 1;
404
+ return err;
405
+ }
406
+
407
+ #ifdef TEST
408
+ /* Example of how to use blast() */
409
+ #include <stdio.h>
410
+ #include <stdlib.h>
411
+
412
+ #define CHUNK 16384
413
+
414
+ local unsigned inf(void *how, unsigned char **buf)
415
+ {
416
+ static unsigned char hold[CHUNK];
417
+
418
+ *buf = hold;
419
+ return fread(hold, 1, CHUNK, (FILE *)how);
420
+ }
421
+
422
+ local int outf(void *how, unsigned char *buf, unsigned len)
423
+ {
424
+ return fwrite(buf, 1, len, (FILE *)how) != len;
425
+ }
426
+
427
+ /* Decompress a PKWare Compression Library stream from stdin to stdout */
428
+ int main(void)
429
+ {
430
+ int ret, n;
431
+
432
+ /* decompress to stdout */
433
+ ret = blast(inf, stdin, outf, stdout);
434
+ if (ret != 0) fprintf(stderr, "blast error: %d\n", ret);
435
+
436
+ /* see if there are any leftover bytes */
437
+ n = 0;
438
+ while (getchar() != EOF) n++;
439
+ if (n) fprintf(stderr, "blast warning: %d unused bytes of input\n", n);
440
+
441
+ /* return blast() error code */
442
+ return ret;
443
+ }
444
+ #endif