finishm 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,42 @@
1
+ This directory contains examples of the use of zlib.
2
+
3
+ fitblk.c
4
+ compress just enough input to nearly fill a requested output size
5
+ - zlib isn't designed to do this, but fitblk does it anyway
6
+
7
+ gun.c
8
+ uncompress a gzip file
9
+ - illustrates the use of inflateBack() for high speed file-to-file
10
+ decompression using call-back functions
11
+ - is approximately twice as fast as gzip -d
12
+ - also provides Unix uncompress functionality, again twice as fast
13
+
14
+ gzappend.c
15
+ append to a gzip file
16
+ - illustrates the use of the Z_BLOCK flush parameter for inflate()
17
+ - illustrates the use of deflatePrime() to start at any bit
18
+
19
+ gzjoin.c
20
+ join gzip files without recalculating the crc or recompressing
21
+ - illustrates the use of the Z_BLOCK flush parameter for inflate()
22
+ - illustrates the use of crc32_combine()
23
+
24
+ gzlog.c
25
+ gzlog.h
26
+ efficiently maintain a message log file in gzip format
27
+ - illustrates use of raw deflate and Z_SYNC_FLUSH
28
+ - illustrates use of gzip header extra field
29
+
30
+ zlib_how.html
31
+ painfully comprehensive description of zpipe.c (see below)
32
+ - describes in excruciating detail the use of deflate() and inflate()
33
+
34
+ zpipe.c
35
+ reads and writes zlib streams from stdin to stdout
36
+ - illustrates the proper use of deflate() and inflate()
37
+ - deeply commented in zlib_how.html (see above)
38
+
39
+ zran.c
40
+ index a zlib or gzip stream and randomly access it
41
+ - illustrates the use of Z_BLOCK, inflatePrime(), and
42
+ inflateSetDictionary() to provide random access
@@ -0,0 +1,233 @@
1
+ /* fitblk.c: example of fitting compressed output to a specified size
2
+ Not copyrighted -- provided to the public domain
3
+ Version 1.1 25 November 2004 Mark Adler */
4
+
5
+ /* Version history:
6
+ 1.0 24 Nov 2004 First version
7
+ 1.1 25 Nov 2004 Change deflateInit2() to deflateInit()
8
+ Use fixed-size, stack-allocated raw buffers
9
+ Simplify code moving compression to subroutines
10
+ Use assert() for internal errors
11
+ Add detailed description of approach
12
+ */
13
+
14
+ /* Approach to just fitting a requested compressed size:
15
+
16
+ fitblk performs three compression passes on a portion of the input
17
+ data in order to determine how much of that input will compress to
18
+ nearly the requested output block size. The first pass generates
19
+ enough deflate blocks to produce output to fill the requested
20
+ output size plus a specfied excess amount (see the EXCESS define
21
+ below). The last deflate block may go quite a bit past that, but
22
+ is discarded. The second pass decompresses and recompresses just
23
+ the compressed data that fit in the requested plus excess sized
24
+ buffer. The deflate process is terminated after that amount of
25
+ input, which is less than the amount consumed on the first pass.
26
+ The last deflate block of the result will be of a comparable size
27
+ to the final product, so that the header for that deflate block and
28
+ the compression ratio for that block will be about the same as in
29
+ the final product. The third compression pass decompresses the
30
+ result of the second step, but only the compressed data up to the
31
+ requested size minus an amount to allow the compressed stream to
32
+ complete (see the MARGIN define below). That will result in a
33
+ final compressed stream whose length is less than or equal to the
34
+ requested size. Assuming sufficient input and a requested size
35
+ greater than a few hundred bytes, the shortfall will typically be
36
+ less than ten bytes.
37
+
38
+ If the input is short enough that the first compression completes
39
+ before filling the requested output size, then that compressed
40
+ stream is return with no recompression.
41
+
42
+ EXCESS is chosen to be just greater than the shortfall seen in a
43
+ two pass approach similar to the above. That shortfall is due to
44
+ the last deflate block compressing more efficiently with a smaller
45
+ header on the second pass. EXCESS is set to be large enough so
46
+ that there is enough uncompressed data for the second pass to fill
47
+ out the requested size, and small enough so that the final deflate
48
+ block of the second pass will be close in size to the final deflate
49
+ block of the third and final pass. MARGIN is chosen to be just
50
+ large enough to assure that the final compression has enough room
51
+ to complete in all cases.
52
+ */
53
+
54
+ #include <stdio.h>
55
+ #include <stdlib.h>
56
+ #include <assert.h>
57
+ #include "zlib.h"
58
+
59
+ #define local static
60
+
61
+ /* print nastygram and leave */
62
+ local void quit(char *why)
63
+ {
64
+ fprintf(stderr, "fitblk abort: %s\n", why);
65
+ exit(1);
66
+ }
67
+
68
+ #define RAWLEN 4096 /* intermediate uncompressed buffer size */
69
+
70
+ /* compress from file to def until provided buffer is full or end of
71
+ input reached; return last deflate() return value, or Z_ERRNO if
72
+ there was read error on the file */
73
+ local int partcompress(FILE *in, z_streamp def)
74
+ {
75
+ int ret, flush;
76
+ unsigned char raw[RAWLEN];
77
+
78
+ flush = Z_NO_FLUSH;
79
+ do {
80
+ def->avail_in = fread(raw, 1, RAWLEN, in);
81
+ if (ferror(in))
82
+ return Z_ERRNO;
83
+ def->next_in = raw;
84
+ if (feof(in))
85
+ flush = Z_FINISH;
86
+ ret = deflate(def, flush);
87
+ assert(ret != Z_STREAM_ERROR);
88
+ } while (def->avail_out != 0 && flush == Z_NO_FLUSH);
89
+ return ret;
90
+ }
91
+
92
+ /* recompress from inf's input to def's output; the input for inf and
93
+ the output for def are set in those structures before calling;
94
+ return last deflate() return value, or Z_MEM_ERROR if inflate()
95
+ was not able to allocate enough memory when it needed to */
96
+ local int recompress(z_streamp inf, z_streamp def)
97
+ {
98
+ int ret, flush;
99
+ unsigned char raw[RAWLEN];
100
+
101
+ flush = Z_NO_FLUSH;
102
+ do {
103
+ /* decompress */
104
+ inf->avail_out = RAWLEN;
105
+ inf->next_out = raw;
106
+ ret = inflate(inf, Z_NO_FLUSH);
107
+ assert(ret != Z_STREAM_ERROR && ret != Z_DATA_ERROR &&
108
+ ret != Z_NEED_DICT);
109
+ if (ret == Z_MEM_ERROR)
110
+ return ret;
111
+
112
+ /* compress what was decompresed until done or no room */
113
+ def->avail_in = RAWLEN - inf->avail_out;
114
+ def->next_in = raw;
115
+ if (inf->avail_out != 0)
116
+ flush = Z_FINISH;
117
+ ret = deflate(def, flush);
118
+ assert(ret != Z_STREAM_ERROR);
119
+ } while (ret != Z_STREAM_END && def->avail_out != 0);
120
+ return ret;
121
+ }
122
+
123
+ #define EXCESS 256 /* empirically determined stream overage */
124
+ #define MARGIN 8 /* amount to back off for completion */
125
+
126
+ /* compress from stdin to fixed-size block on stdout */
127
+ int main(int argc, char **argv)
128
+ {
129
+ int ret; /* return code */
130
+ unsigned size; /* requested fixed output block size */
131
+ unsigned have; /* bytes written by deflate() call */
132
+ unsigned char *blk; /* intermediate and final stream */
133
+ unsigned char *tmp; /* close to desired size stream */
134
+ z_stream def, inf; /* zlib deflate and inflate states */
135
+
136
+ /* get requested output size */
137
+ if (argc != 2)
138
+ quit("need one argument: size of output block");
139
+ ret = strtol(argv[1], argv + 1, 10);
140
+ if (argv[1][0] != 0)
141
+ quit("argument must be a number");
142
+ if (ret < 8) /* 8 is minimum zlib stream size */
143
+ quit("need positive size of 8 or greater");
144
+ size = (unsigned)ret;
145
+
146
+ /* allocate memory for buffers and compression engine */
147
+ blk = malloc(size + EXCESS);
148
+ def.zalloc = Z_NULL;
149
+ def.zfree = Z_NULL;
150
+ def.opaque = Z_NULL;
151
+ ret = deflateInit(&def, Z_DEFAULT_COMPRESSION);
152
+ if (ret != Z_OK || blk == NULL)
153
+ quit("out of memory");
154
+
155
+ /* compress from stdin until output full, or no more input */
156
+ def.avail_out = size + EXCESS;
157
+ def.next_out = blk;
158
+ ret = partcompress(stdin, &def);
159
+ if (ret == Z_ERRNO)
160
+ quit("error reading input");
161
+
162
+ /* if it all fit, then size was undersubscribed -- done! */
163
+ if (ret == Z_STREAM_END && def.avail_out >= EXCESS) {
164
+ /* write block to stdout */
165
+ have = size + EXCESS - def.avail_out;
166
+ if (fwrite(blk, 1, have, stdout) != have || ferror(stdout))
167
+ quit("error writing output");
168
+
169
+ /* clean up and print results to stderr */
170
+ ret = deflateEnd(&def);
171
+ assert(ret != Z_STREAM_ERROR);
172
+ free(blk);
173
+ fprintf(stderr,
174
+ "%u bytes unused out of %u requested (all input)\n",
175
+ size - have, size);
176
+ return 0;
177
+ }
178
+
179
+ /* it didn't all fit -- set up for recompression */
180
+ inf.zalloc = Z_NULL;
181
+ inf.zfree = Z_NULL;
182
+ inf.opaque = Z_NULL;
183
+ inf.avail_in = 0;
184
+ inf.next_in = Z_NULL;
185
+ ret = inflateInit(&inf);
186
+ tmp = malloc(size + EXCESS);
187
+ if (ret != Z_OK || tmp == NULL)
188
+ quit("out of memory");
189
+ ret = deflateReset(&def);
190
+ assert(ret != Z_STREAM_ERROR);
191
+
192
+ /* do first recompression close to the right amount */
193
+ inf.avail_in = size + EXCESS;
194
+ inf.next_in = blk;
195
+ def.avail_out = size + EXCESS;
196
+ def.next_out = tmp;
197
+ ret = recompress(&inf, &def);
198
+ if (ret == Z_MEM_ERROR)
199
+ quit("out of memory");
200
+
201
+ /* set up for next reocmpression */
202
+ ret = inflateReset(&inf);
203
+ assert(ret != Z_STREAM_ERROR);
204
+ ret = deflateReset(&def);
205
+ assert(ret != Z_STREAM_ERROR);
206
+
207
+ /* do second and final recompression (third compression) */
208
+ inf.avail_in = size - MARGIN; /* assure stream will complete */
209
+ inf.next_in = tmp;
210
+ def.avail_out = size;
211
+ def.next_out = blk;
212
+ ret = recompress(&inf, &def);
213
+ if (ret == Z_MEM_ERROR)
214
+ quit("out of memory");
215
+ assert(ret == Z_STREAM_END); /* otherwise MARGIN too small */
216
+
217
+ /* done -- write block to stdout */
218
+ have = size - def.avail_out;
219
+ if (fwrite(blk, 1, have, stdout) != have || ferror(stdout))
220
+ quit("error writing output");
221
+
222
+ /* clean up and print results to stderr */
223
+ free(tmp);
224
+ ret = inflateEnd(&inf);
225
+ assert(ret != Z_STREAM_ERROR);
226
+ ret = deflateEnd(&def);
227
+ assert(ret != Z_STREAM_ERROR);
228
+ free(blk);
229
+ fprintf(stderr,
230
+ "%u bytes unused out of %u requested (%lu input)\n",
231
+ size - have, size, def.total_in);
232
+ return 0;
233
+ }
@@ -0,0 +1,693 @@
1
+ /* gun.c -- simple gunzip to give an example of the use of inflateBack()
2
+ * Copyright (C) 2003, 2005 Mark Adler
3
+ * For conditions of distribution and use, see copyright notice in zlib.h
4
+ Version 1.3 12 June 2005 Mark Adler */
5
+
6
+ /* Version history:
7
+ 1.0 16 Feb 2003 First version for testing of inflateBack()
8
+ 1.1 21 Feb 2005 Decompress concatenated gzip streams
9
+ Remove use of "this" variable (C++ keyword)
10
+ Fix return value for in()
11
+ Improve allocation failure checking
12
+ Add typecasting for void * structures
13
+ Add -h option for command version and usage
14
+ Add a bunch of comments
15
+ 1.2 20 Mar 2005 Add Unix compress (LZW) decompression
16
+ Copy file attributes from input file to output file
17
+ 1.3 12 Jun 2005 Add casts for error messages [Oberhumer]
18
+ */
19
+
20
+ /*
21
+ gun [ -t ] [ name ... ]
22
+
23
+ decompresses the data in the named gzip files. If no arguments are given,
24
+ gun will decompress from stdin to stdout. The names must end in .gz, -gz,
25
+ .z, -z, _z, or .Z. The uncompressed data will be written to a file name
26
+ with the suffix stripped. On success, the original file is deleted. On
27
+ failure, the output file is deleted. For most failures, the command will
28
+ continue to process the remaining names on the command line. A memory
29
+ allocation failure will abort the command. If -t is specified, then the
30
+ listed files or stdin will be tested as gzip files for integrity (without
31
+ checking for a proper suffix), no output will be written, and no files
32
+ will be deleted.
33
+
34
+ Like gzip, gun allows concatenated gzip streams and will decompress them,
35
+ writing all of the uncompressed data to the output. Unlike gzip, gun allows
36
+ an empty file on input, and will produce no error writing an empty output
37
+ file.
38
+
39
+ gun will also decompress files made by Unix compress, which uses LZW
40
+ compression. These files are automatically detected by virtue of their
41
+ magic header bytes. Since the end of Unix compress stream is marked by the
42
+ end-of-file, they cannot be concantenated. If a Unix compress stream is
43
+ encountered in an input file, it is the last stream in that file.
44
+
45
+ Like gunzip and uncompress, the file attributes of the orignal compressed
46
+ file are maintained in the final uncompressed file, to the extent that the
47
+ user permissions allow it.
48
+
49
+ On my Mac OS X PowerPC G4, gun is almost twice as fast as gunzip (version
50
+ 1.2.4) is on the same file, when gun is linked with zlib 1.2.2. Also the
51
+ LZW decompression provided by gun is about twice as fast as the standard
52
+ Unix uncompress command.
53
+ */
54
+
55
+ /* external functions and related types and constants */
56
+ #include <stdio.h> /* fprintf() */
57
+ #include <stdlib.h> /* malloc(), free() */
58
+ #include <string.h> /* strerror(), strcmp(), strlen(), memcpy() */
59
+ #include <errno.h> /* errno */
60
+ #include <fcntl.h> /* open() */
61
+ #include <unistd.h> /* read(), write(), close(), chown(), unlink() */
62
+ #include <sys/types.h>
63
+ #include <sys/stat.h> /* stat(), chmod() */
64
+ #include <utime.h> /* utime() */
65
+ #include "zlib.h" /* inflateBackInit(), inflateBack(), */
66
+ /* inflateBackEnd(), crc32() */
67
+
68
+ /* function declaration */
69
+ #define local static
70
+
71
+ /* buffer constants */
72
+ #define SIZE 32768U /* input and output buffer sizes */
73
+ #define PIECE 16384 /* limits i/o chunks for 16-bit int case */
74
+
75
+ /* structure for infback() to pass to input function in() -- it maintains the
76
+ input file and a buffer of size SIZE */
77
+ struct ind {
78
+ int infile;
79
+ unsigned char *inbuf;
80
+ };
81
+
82
+ /* Load input buffer, assumed to be empty, and return bytes loaded and a
83
+ pointer to them. read() is called until the buffer is full, or until it
84
+ returns end-of-file or error. Return 0 on error. */
85
+ local unsigned in(void *in_desc, unsigned char **buf)
86
+ {
87
+ int ret;
88
+ unsigned len;
89
+ unsigned char *next;
90
+ struct ind *me = (struct ind *)in_desc;
91
+
92
+ next = me->inbuf;
93
+ *buf = next;
94
+ len = 0;
95
+ do {
96
+ ret = PIECE;
97
+ if ((unsigned)ret > SIZE - len)
98
+ ret = (int)(SIZE - len);
99
+ ret = (int)read(me->infile, next, ret);
100
+ if (ret == -1) {
101
+ len = 0;
102
+ break;
103
+ }
104
+ next += ret;
105
+ len += ret;
106
+ } while (ret != 0 && len < SIZE);
107
+ return len;
108
+ }
109
+
110
+ /* structure for infback() to pass to output function out() -- it maintains the
111
+ output file, a running CRC-32 check on the output and the total number of
112
+ bytes output, both for checking against the gzip trailer. (The length in
113
+ the gzip trailer is stored modulo 2^32, so it's ok if a long is 32 bits and
114
+ the output is greater than 4 GB.) */
115
+ struct outd {
116
+ int outfile;
117
+ int check; /* true if checking crc and total */
118
+ unsigned long crc;
119
+ unsigned long total;
120
+ };
121
+
122
+ /* Write output buffer and update the CRC-32 and total bytes written. write()
123
+ is called until all of the output is written or an error is encountered.
124
+ On success out() returns 0. For a write failure, out() returns 1. If the
125
+ output file descriptor is -1, then nothing is written.
126
+ */
127
+ local int out(void *out_desc, unsigned char *buf, unsigned len)
128
+ {
129
+ int ret;
130
+ struct outd *me = (struct outd *)out_desc;
131
+
132
+ if (me->check) {
133
+ me->crc = crc32(me->crc, buf, len);
134
+ me->total += len;
135
+ }
136
+ if (me->outfile != -1)
137
+ do {
138
+ ret = PIECE;
139
+ if ((unsigned)ret > len)
140
+ ret = (int)len;
141
+ ret = (int)write(me->outfile, buf, ret);
142
+ if (ret == -1)
143
+ return 1;
144
+ buf += ret;
145
+ len -= ret;
146
+ } while (len != 0);
147
+ return 0;
148
+ }
149
+
150
+ /* next input byte macro for use inside lunpipe() and gunpipe() */
151
+ #define NEXT() (have ? 0 : (have = in(indp, &next)), \
152
+ last = have ? (have--, (int)(*next++)) : -1)
153
+
154
+ /* memory for gunpipe() and lunpipe() --
155
+ the first 256 entries of prefix[] and suffix[] are never used, could
156
+ have offset the index, but it's faster to waste the memory */
157
+ unsigned char inbuf[SIZE]; /* input buffer */
158
+ unsigned char outbuf[SIZE]; /* output buffer */
159
+ unsigned short prefix[65536]; /* index to LZW prefix string */
160
+ unsigned char suffix[65536]; /* one-character LZW suffix */
161
+ unsigned char match[65280 + 2]; /* buffer for reversed match or gzip
162
+ 32K sliding window */
163
+
164
+ /* throw out what's left in the current bits byte buffer (this is a vestigial
165
+ aspect of the compressed data format derived from an implementation that
166
+ made use of a special VAX machine instruction!) */
167
+ #define FLUSHCODE() \
168
+ do { \
169
+ left = 0; \
170
+ rem = 0; \
171
+ if (chunk > have) { \
172
+ chunk -= have; \
173
+ have = 0; \
174
+ if (NEXT() == -1) \
175
+ break; \
176
+ chunk--; \
177
+ if (chunk > have) { \
178
+ chunk = have = 0; \
179
+ break; \
180
+ } \
181
+ } \
182
+ have -= chunk; \
183
+ next += chunk; \
184
+ chunk = 0; \
185
+ } while (0)
186
+
187
+ /* Decompress a compress (LZW) file from indp to outfile. The compress magic
188
+ header (two bytes) has already been read and verified. There are have bytes
189
+ of buffered input at next. strm is used for passing error information back
190
+ to gunpipe().
191
+
192
+ lunpipe() will return Z_OK on success, Z_BUF_ERROR for an unexpected end of
193
+ file, read error, or write error (a write error indicated by strm->next_in
194
+ not equal to Z_NULL), or Z_DATA_ERROR for invalid input.
195
+ */
196
+ local int lunpipe(unsigned have, unsigned char *next, struct ind *indp,
197
+ int outfile, z_stream *strm)
198
+ {
199
+ int last; /* last byte read by NEXT(), or -1 if EOF */
200
+ int chunk; /* bytes left in current chunk */
201
+ int left; /* bits left in rem */
202
+ unsigned rem; /* unused bits from input */
203
+ int bits; /* current bits per code */
204
+ unsigned code; /* code, table traversal index */
205
+ unsigned mask; /* mask for current bits codes */
206
+ int max; /* maximum bits per code for this stream */
207
+ int flags; /* compress flags, then block compress flag */
208
+ unsigned end; /* last valid entry in prefix/suffix tables */
209
+ unsigned temp; /* current code */
210
+ unsigned prev; /* previous code */
211
+ unsigned final; /* last character written for previous code */
212
+ unsigned stack; /* next position for reversed string */
213
+ unsigned outcnt; /* bytes in output buffer */
214
+ struct outd outd; /* output structure */
215
+
216
+ /* set up output */
217
+ outd.outfile = outfile;
218
+ outd.check = 0;
219
+
220
+ /* process remainder of compress header -- a flags byte */
221
+ flags = NEXT();
222
+ if (last == -1)
223
+ return Z_BUF_ERROR;
224
+ if (flags & 0x60) {
225
+ strm->msg = (char *)"unknown lzw flags set";
226
+ return Z_DATA_ERROR;
227
+ }
228
+ max = flags & 0x1f;
229
+ if (max < 9 || max > 16) {
230
+ strm->msg = (char *)"lzw bits out of range";
231
+ return Z_DATA_ERROR;
232
+ }
233
+ if (max == 9) /* 9 doesn't really mean 9 */
234
+ max = 10;
235
+ flags &= 0x80; /* true if block compress */
236
+
237
+ /* clear table */
238
+ bits = 9;
239
+ mask = 0x1ff;
240
+ end = flags ? 256 : 255;
241
+
242
+ /* set up: get first 9-bit code, which is the first decompressed byte, but
243
+ don't create a table entry until the next code */
244
+ if (NEXT() == -1) /* no compressed data is ok */
245
+ return Z_OK;
246
+ final = prev = (unsigned)last; /* low 8 bits of code */
247
+ if (NEXT() == -1) /* missing a bit */
248
+ return Z_BUF_ERROR;
249
+ if (last & 1) { /* code must be < 256 */
250
+ strm->msg = (char *)"invalid lzw code";
251
+ return Z_DATA_ERROR;
252
+ }
253
+ rem = (unsigned)last >> 1; /* remaining 7 bits */
254
+ left = 7;
255
+ chunk = bits - 2; /* 7 bytes left in this chunk */
256
+ outbuf[0] = (unsigned char)final; /* write first decompressed byte */
257
+ outcnt = 1;
258
+
259
+ /* decode codes */
260
+ stack = 0;
261
+ for (;;) {
262
+ /* if the table will be full after this, increment the code size */
263
+ if (end >= mask && bits < max) {
264
+ FLUSHCODE();
265
+ bits++;
266
+ mask <<= 1;
267
+ mask++;
268
+ }
269
+
270
+ /* get a code of length bits */
271
+ if (chunk == 0) /* decrement chunk modulo bits */
272
+ chunk = bits;
273
+ code = rem; /* low bits of code */
274
+ if (NEXT() == -1) { /* EOF is end of compressed data */
275
+ /* write remaining buffered output */
276
+ if (outcnt && out(&outd, outbuf, outcnt)) {
277
+ strm->next_in = outbuf; /* signal write error */
278
+ return Z_BUF_ERROR;
279
+ }
280
+ return Z_OK;
281
+ }
282
+ code += (unsigned)last << left; /* middle (or high) bits of code */
283
+ left += 8;
284
+ chunk--;
285
+ if (bits > left) { /* need more bits */
286
+ if (NEXT() == -1) /* can't end in middle of code */
287
+ return Z_BUF_ERROR;
288
+ code += (unsigned)last << left; /* high bits of code */
289
+ left += 8;
290
+ chunk--;
291
+ }
292
+ code &= mask; /* mask to current code length */
293
+ left -= bits; /* number of unused bits */
294
+ rem = (unsigned)last >> (8 - left); /* unused bits from last byte */
295
+
296
+ /* process clear code (256) */
297
+ if (code == 256 && flags) {
298
+ FLUSHCODE();
299
+ bits = 9; /* initialize bits and mask */
300
+ mask = 0x1ff;
301
+ end = 255; /* empty table */
302
+ continue; /* get next code */
303
+ }
304
+
305
+ /* special code to reuse last match */
306
+ temp = code; /* save the current code */
307
+ if (code > end) {
308
+ /* Be picky on the allowed code here, and make sure that the code
309
+ we drop through (prev) will be a valid index so that random
310
+ input does not cause an exception. The code != end + 1 check is
311
+ empirically derived, and not checked in the original uncompress
312
+ code. If this ever causes a problem, that check could be safely
313
+ removed. Leaving this check in greatly improves gun's ability
314
+ to detect random or corrupted input after a compress header.
315
+ In any case, the prev > end check must be retained. */
316
+ if (code != end + 1 || prev > end) {
317
+ strm->msg = (char *)"invalid lzw code";
318
+ return Z_DATA_ERROR;
319
+ }
320
+ match[stack++] = (unsigned char)final;
321
+ code = prev;
322
+ }
323
+
324
+ /* walk through linked list to generate output in reverse order */
325
+ while (code >= 256) {
326
+ match[stack++] = suffix[code];
327
+ code = prefix[code];
328
+ }
329
+ match[stack++] = (unsigned char)code;
330
+ final = code;
331
+
332
+ /* link new table entry */
333
+ if (end < mask) {
334
+ end++;
335
+ prefix[end] = (unsigned short)prev;
336
+ suffix[end] = (unsigned char)final;
337
+ }
338
+
339
+ /* set previous code for next iteration */
340
+ prev = temp;
341
+
342
+ /* write output in forward order */
343
+ while (stack > SIZE - outcnt) {
344
+ while (outcnt < SIZE)
345
+ outbuf[outcnt++] = match[--stack];
346
+ if (out(&outd, outbuf, outcnt)) {
347
+ strm->next_in = outbuf; /* signal write error */
348
+ return Z_BUF_ERROR;
349
+ }
350
+ outcnt = 0;
351
+ }
352
+ do {
353
+ outbuf[outcnt++] = match[--stack];
354
+ } while (stack);
355
+
356
+ /* loop for next code with final and prev as the last match, rem and
357
+ left provide the first 0..7 bits of the next code, end is the last
358
+ valid table entry */
359
+ }
360
+ }
361
+
362
+ /* Decompress a gzip file from infile to outfile. strm is assumed to have been
363
+ successfully initialized with inflateBackInit(). The input file may consist
364
+ of a series of gzip streams, in which case all of them will be decompressed
365
+ to the output file. If outfile is -1, then the gzip stream(s) integrity is
366
+ checked and nothing is written.
367
+
368
+ The return value is a zlib error code: Z_MEM_ERROR if out of memory,
369
+ Z_DATA_ERROR if the header or the compressed data is invalid, or if the
370
+ trailer CRC-32 check or length doesn't match, Z_BUF_ERROR if the input ends
371
+ prematurely or a write error occurs, or Z_ERRNO if junk (not a another gzip
372
+ stream) follows a valid gzip stream.
373
+ */
374
+ local int gunpipe(z_stream *strm, int infile, int outfile)
375
+ {
376
+ int ret, first, last;
377
+ unsigned have, flags, len;
378
+ unsigned char *next;
379
+ struct ind ind, *indp;
380
+ struct outd outd;
381
+
382
+ /* setup input buffer */
383
+ ind.infile = infile;
384
+ ind.inbuf = inbuf;
385
+ indp = &ind;
386
+
387
+ /* decompress concatenated gzip streams */
388
+ have = 0; /* no input data read in yet */
389
+ first = 1; /* looking for first gzip header */
390
+ strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */
391
+ for (;;) {
392
+ /* look for the two magic header bytes for a gzip stream */
393
+ if (NEXT() == -1) {
394
+ ret = Z_OK;
395
+ break; /* empty gzip stream is ok */
396
+ }
397
+ if (last != 31 || (NEXT() != 139 && last != 157)) {
398
+ strm->msg = (char *)"incorrect header check";
399
+ ret = first ? Z_DATA_ERROR : Z_ERRNO;
400
+ break; /* not a gzip or compress header */
401
+ }
402
+ first = 0; /* next non-header is junk */
403
+
404
+ /* process a compress (LZW) file -- can't be concatenated after this */
405
+ if (last == 157) {
406
+ ret = lunpipe(have, next, indp, outfile, strm);
407
+ break;
408
+ }
409
+
410
+ /* process remainder of gzip header */
411
+ ret = Z_BUF_ERROR;
412
+ if (NEXT() != 8) { /* only deflate method allowed */
413
+ if (last == -1) break;
414
+ strm->msg = (char *)"unknown compression method";
415
+ ret = Z_DATA_ERROR;
416
+ break;
417
+ }
418
+ flags = NEXT(); /* header flags */
419
+ NEXT(); /* discard mod time, xflgs, os */
420
+ NEXT();
421
+ NEXT();
422
+ NEXT();
423
+ NEXT();
424
+ NEXT();
425
+ if (last == -1) break;
426
+ if (flags & 0xe0) {
427
+ strm->msg = (char *)"unknown header flags set";
428
+ ret = Z_DATA_ERROR;
429
+ break;
430
+ }
431
+ if (flags & 4) { /* extra field */
432
+ len = NEXT();
433
+ len += (unsigned)(NEXT()) << 8;
434
+ if (last == -1) break;
435
+ while (len > have) {
436
+ len -= have;
437
+ have = 0;
438
+ if (NEXT() == -1) break;
439
+ len--;
440
+ }
441
+ if (last == -1) break;
442
+ have -= len;
443
+ next += len;
444
+ }
445
+ if (flags & 8) /* file name */
446
+ while (NEXT() != 0 && last != -1)
447
+ ;
448
+ if (flags & 16) /* comment */
449
+ while (NEXT() != 0 && last != -1)
450
+ ;
451
+ if (flags & 2) { /* header crc */
452
+ NEXT();
453
+ NEXT();
454
+ }
455
+ if (last == -1) break;
456
+
457
+ /* set up output */
458
+ outd.outfile = outfile;
459
+ outd.check = 1;
460
+ outd.crc = crc32(0L, Z_NULL, 0);
461
+ outd.total = 0;
462
+
463
+ /* decompress data to output */
464
+ strm->next_in = next;
465
+ strm->avail_in = have;
466
+ ret = inflateBack(strm, in, indp, out, &outd);
467
+ if (ret != Z_STREAM_END) break;
468
+ next = strm->next_in;
469
+ have = strm->avail_in;
470
+ strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */
471
+
472
+ /* check trailer */
473
+ ret = Z_BUF_ERROR;
474
+ if (NEXT() != (outd.crc & 0xff) ||
475
+ NEXT() != ((outd.crc >> 8) & 0xff) ||
476
+ NEXT() != ((outd.crc >> 16) & 0xff) ||
477
+ NEXT() != ((outd.crc >> 24) & 0xff)) {
478
+ /* crc error */
479
+ if (last != -1) {
480
+ strm->msg = (char *)"incorrect data check";
481
+ ret = Z_DATA_ERROR;
482
+ }
483
+ break;
484
+ }
485
+ if (NEXT() != (outd.total & 0xff) ||
486
+ NEXT() != ((outd.total >> 8) & 0xff) ||
487
+ NEXT() != ((outd.total >> 16) & 0xff) ||
488
+ NEXT() != ((outd.total >> 24) & 0xff)) {
489
+ /* length error */
490
+ if (last != -1) {
491
+ strm->msg = (char *)"incorrect length check";
492
+ ret = Z_DATA_ERROR;
493
+ }
494
+ break;
495
+ }
496
+
497
+ /* go back and look for another gzip stream */
498
+ }
499
+
500
+ /* clean up and return */
501
+ return ret;
502
+ }
503
+
504
+ /* Copy file attributes, from -> to, as best we can. This is best effort, so
505
+ no errors are reported. The mode bits, including suid, sgid, and the sticky
506
+ bit are copied (if allowed), the owner's user id and group id are copied
507
+ (again if allowed), and the access and modify times are copied. */
508
+ local void copymeta(char *from, char *to)
509
+ {
510
+ struct stat was;
511
+ struct utimbuf when;
512
+
513
+ /* get all of from's Unix meta data, return if not a regular file */
514
+ if (stat(from, &was) != 0 || (was.st_mode & S_IFMT) != S_IFREG)
515
+ return;
516
+
517
+ /* set to's mode bits, ignore errors */
518
+ (void)chmod(to, was.st_mode & 07777);
519
+
520
+ /* copy owner's user and group, ignore errors */
521
+ (void)chown(to, was.st_uid, was.st_gid);
522
+
523
+ /* copy access and modify times, ignore errors */
524
+ when.actime = was.st_atime;
525
+ when.modtime = was.st_mtime;
526
+ (void)utime(to, &when);
527
+ }
528
+
529
+ /* Decompress the file inname to the file outnname, of if test is true, just
530
+ decompress without writing and check the gzip trailer for integrity. If
531
+ inname is NULL or an empty string, read from stdin. If outname is NULL or
532
+ an empty string, write to stdout. strm is a pre-initialized inflateBack
533
+ structure. When appropriate, copy the file attributes from inname to
534
+ outname.
535
+
536
+ gunzip() returns 1 if there is an out-of-memory error or an unexpected
537
+ return code from gunpipe(). Otherwise it returns 0.
538
+ */
539
+ local int gunzip(z_stream *strm, char *inname, char *outname, int test)
540
+ {
541
+ int ret;
542
+ int infile, outfile;
543
+
544
+ /* open files */
545
+ if (inname == NULL || *inname == 0) {
546
+ inname = "-";
547
+ infile = 0; /* stdin */
548
+ }
549
+ else {
550
+ infile = open(inname, O_RDONLY, 0);
551
+ if (infile == -1) {
552
+ fprintf(stderr, "gun cannot open %s\n", inname);
553
+ return 0;
554
+ }
555
+ }
556
+ if (test)
557
+ outfile = -1;
558
+ else if (outname == NULL || *outname == 0) {
559
+ outname = "-";
560
+ outfile = 1; /* stdout */
561
+ }
562
+ else {
563
+ outfile = open(outname, O_CREAT | O_TRUNC | O_WRONLY, 0666);
564
+ if (outfile == -1) {
565
+ close(infile);
566
+ fprintf(stderr, "gun cannot create %s\n", outname);
567
+ return 0;
568
+ }
569
+ }
570
+ errno = 0;
571
+
572
+ /* decompress */
573
+ ret = gunpipe(strm, infile, outfile);
574
+ if (outfile > 2) close(outfile);
575
+ if (infile > 2) close(infile);
576
+
577
+ /* interpret result */
578
+ switch (ret) {
579
+ case Z_OK:
580
+ case Z_ERRNO:
581
+ if (infile > 2 && outfile > 2) {
582
+ copymeta(inname, outname); /* copy attributes */
583
+ unlink(inname);
584
+ }
585
+ if (ret == Z_ERRNO)
586
+ fprintf(stderr, "gun warning: trailing garbage ignored in %s\n",
587
+ inname);
588
+ break;
589
+ case Z_DATA_ERROR:
590
+ if (outfile > 2) unlink(outname);
591
+ fprintf(stderr, "gun data error on %s: %s\n", inname, strm->msg);
592
+ break;
593
+ case Z_MEM_ERROR:
594
+ if (outfile > 2) unlink(outname);
595
+ fprintf(stderr, "gun out of memory error--aborting\n");
596
+ return 1;
597
+ case Z_BUF_ERROR:
598
+ if (outfile > 2) unlink(outname);
599
+ if (strm->next_in != Z_NULL) {
600
+ fprintf(stderr, "gun write error on %s: %s\n",
601
+ outname, strerror(errno));
602
+ }
603
+ else if (errno) {
604
+ fprintf(stderr, "gun read error on %s: %s\n",
605
+ inname, strerror(errno));
606
+ }
607
+ else {
608
+ fprintf(stderr, "gun unexpected end of file on %s\n",
609
+ inname);
610
+ }
611
+ break;
612
+ default:
613
+ if (outfile > 2) unlink(outname);
614
+ fprintf(stderr, "gun internal error--aborting\n");
615
+ return 1;
616
+ }
617
+ return 0;
618
+ }
619
+
620
+ /* Process the gun command line arguments. See the command syntax near the
621
+ beginning of this source file. */
622
+ int main(int argc, char **argv)
623
+ {
624
+ int ret, len, test;
625
+ char *outname;
626
+ unsigned char *window;
627
+ z_stream strm;
628
+
629
+ /* initialize inflateBack state for repeated use */
630
+ window = match; /* reuse LZW match buffer */
631
+ strm.zalloc = Z_NULL;
632
+ strm.zfree = Z_NULL;
633
+ strm.opaque = Z_NULL;
634
+ ret = inflateBackInit(&strm, 15, window);
635
+ if (ret != Z_OK) {
636
+ fprintf(stderr, "gun out of memory error--aborting\n");
637
+ return 1;
638
+ }
639
+
640
+ /* decompress each file to the same name with the suffix removed */
641
+ argc--;
642
+ argv++;
643
+ test = 0;
644
+ if (argc && strcmp(*argv, "-h") == 0) {
645
+ fprintf(stderr, "gun 1.3 (12 Jun 2005)\n");
646
+ fprintf(stderr, "Copyright (c) 2005 Mark Adler\n");
647
+ fprintf(stderr, "usage: gun [-t] [file1.gz [file2.Z ...]]\n");
648
+ return 0;
649
+ }
650
+ if (argc && strcmp(*argv, "-t") == 0) {
651
+ test = 1;
652
+ argc--;
653
+ argv++;
654
+ }
655
+ if (argc)
656
+ do {
657
+ if (test)
658
+ outname = NULL;
659
+ else {
660
+ len = (int)strlen(*argv);
661
+ if (strcmp(*argv + len - 3, ".gz") == 0 ||
662
+ strcmp(*argv + len - 3, "-gz") == 0)
663
+ len -= 3;
664
+ else if (strcmp(*argv + len - 2, ".z") == 0 ||
665
+ strcmp(*argv + len - 2, "-z") == 0 ||
666
+ strcmp(*argv + len - 2, "_z") == 0 ||
667
+ strcmp(*argv + len - 2, ".Z") == 0)
668
+ len -= 2;
669
+ else {
670
+ fprintf(stderr, "gun error: no gz type on %s--skipping\n",
671
+ *argv);
672
+ continue;
673
+ }
674
+ outname = malloc(len + 1);
675
+ if (outname == NULL) {
676
+ fprintf(stderr, "gun out of memory error--aborting\n");
677
+ ret = 1;
678
+ break;
679
+ }
680
+ memcpy(outname, *argv, len);
681
+ outname[len] = 0;
682
+ }
683
+ ret = gunzip(&strm, *argv, outname, test);
684
+ if (outname != NULL) free(outname);
685
+ if (ret) break;
686
+ } while (argv++, --argc);
687
+ else
688
+ ret = gunzip(&strm, NULL, NULL, test);
689
+
690
+ /* clean up */
691
+ inflateBackEnd(&strm);
692
+ return ret;
693
+ }